티스토리 뷰

* 인프런에 있는 "홍정모의 게임 만들기 연습 문제 패키지" 강의를 바탕으로 작성된 글입니다.

 

1. 여러 채의 집들을 지붕, 벽, 창문의 색상이 다양하게 그리기

#include "Game2D.h"
#include "RandomNumberGenerator.h"

namespace shyplants
{
	class House
	{
	private:
		RGB roof_color, window_color, wall_color;
		vec2 pos;
		float angle;

	public:
		House() : roof_color(Colors::red), window_color(Colors::blue),wall_color(Colors::yellow), pos(0.0f, 0.0f), angle(0.0f)
		{}

		void setPos(const vec2& _pos)
		{
			pos = _pos;
		}

		void setAngle(const float& _angle)
		{
			angle = _angle;
		}

		void setRoofColor(const RGB& _roof_color)
		{
			roof_color = _roof_color;
		}

		void setWindowColor(const RGB& _window_color)
		{
			window_color = _window_color;
		}

		void setWallColor(const RGB& _wall_color)
		{
			wall_color = _wall_color;
		}

		void draw()
		{
			// draw a house
			beginTransformation();
			{
				translate(pos);
				rotate(angle);

				// wall
				drawFilledBox(wall_color, 0.2f, 0.2f);

				// roof
				drawFilledTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });
				drawWiredTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });

				// window
				drawFilledBox(window_color, 0.1f, 0.1f);
				drawWiredBox(window_color, 0.1f, 0.1f);
				drawLine(Colors::gray, { 0.0f, -0.05f }, Colors::gray, { 0.0f, 0.05f });
				drawLine(Colors::gray, { -0.05f, 0.0f }, Colors::gray, { 0.05f, 0.0f });

			}
			endTransformation();
		}
	};

	

	class Example : public Game2D
	{
	public:
		House houses[10];

		Example() : Game2D()
		{
			RandomNumberGenerator rnd;

			for (int i = 0; i < 10; ++i) {
				houses[i].setPos({ -1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f) });
				houses[i].setRoofColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWindowColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWallColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
			}
		}

		void update() override
		{
			for (int i = 0; i < 10; ++i) {
				houses[i].draw();
			}
		}
	};
}

 

2. 여러 채의 집들이 서로 다른 속도로 회전하기

#include "Game2D.h"
#include "RandomNumberGenerator.h"

namespace shyplants
{
	class House
	{
	private:
		RGB roof_color, window_color, wall_color;
		vec2 pos;
		float angle, rotate_speed;

	public:
		House() : roof_color(Colors::red), window_color(Colors::blue),wall_color(Colors::yellow), pos(0.0f, 0.0f), angle(0.0f), rotate_speed(1.0f)
		{}

		void setPos(const vec2& _pos)
		{
			pos = _pos;
		}

		void setAngle(const float& _angle)
		{
			angle = _angle;
		}

		void setRotateSpeed(const float& _rotate_speed)
		{
			rotate_speed = _rotate_speed;
		}

		void setRoofColor(const RGB& _roof_color)
		{
			roof_color = _roof_color;
		}

		void setWindowColor(const RGB& _window_color)
		{
			window_color = _window_color;
		}

		void setWallColor(const RGB& _wall_color)
		{
			wall_color = _wall_color;
		}

		void draw()
		{
			// draw a house
			beginTransformation();
			{
				translate(pos);
				rotate(angle);

				// wall
				drawFilledBox(wall_color, 0.2f, 0.2f);

				// roof
				drawFilledTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });
				drawWiredTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });

				// window
				drawFilledBox(window_color, 0.1f, 0.1f);
				drawWiredBox(window_color, 0.1f, 0.1f);
				drawLine(Colors::gray, { 0.0f, -0.05f }, Colors::gray, { 0.0f, 0.05f });
				drawLine(Colors::gray, { -0.05f, 0.0f }, Colors::gray, { 0.05f, 0.0f });

			}
			endTransformation();
		}

		void update(float time) 
		{
			angle = time * rotate_speed;
		}

	};

	class Example : public Game2D
	{
	private:
		float time;

	public:
		House houses[10];

		Example() : Game2D()
		{
			RandomNumberGenerator rnd;

			for (int i = 0; i < 10; ++i) {
				houses[i].setPos({ -1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f) });
				houses[i].setRotateSpeed(rnd.getFloat(-10.0f, 10.0f) * 10.0f);
				houses[i].setRoofColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWindowColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWallColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
			}

			time = 0.0f;
		}

		void update() override
		{
			for (int i = 0; i < 10; ++i) {
				houses[i].draw();
			}

			for (int i = 0; i < 10; ++i) {
				houses[i].update(time);
			}

			time += this->getTimeStep();
		}
	};
}

 

3. 동그란 창문을 가진 집 그려보기 (상속 이용)

#include "Game2D.h"
#include "RandomNumberGenerator.h"

namespace shyplants
{
	class Window
	{
	private:
		int shape_type;   // {0:circle, 1:box}
		float angle;
		RGB color;

	public:
		Window() : shape_type(0), angle(0.0f), color(Colors::blue)
		{}

		void setWindowShapeType(const int& _shape_type)
		{
			shape_type = _shape_type;
		}

		void setWindowAngle(const float& _angle)
		{
			angle = _angle;
		}

		void setWindowColor(const RGB& _color)
		{
			color = _color;
		}

		void windowDraw()
		{
			switch (shape_type)
			{
			case 0:
				drawFilledCircle(color, 0.05f);
				drawWiredCircle(color, 0.05f);
				break;

			case 1:
				drawFilledBox(color, 0.1f, 0.1f);
				drawWiredBox(color, 0.1f, 0.1f);
				break;

			default:
				break;
			}
			
			drawLine(Colors::gray, { 0.0f, -0.05f }, Colors::gray, { 0.0f, 0.05f });
			drawLine(Colors::gray, { -0.05f, 0.0f }, Colors::gray, { 0.05f, 0.0f });
		}

	};

	class House : public Window
	{
	private:
		RGB roof_color, wall_color;
		vec2 pos;
		float angle, rotate_speed;

	public:
		House() : roof_color(Colors::red), wall_color(Colors::yellow), pos(0.0f, 0.0f), angle(0.0f), rotate_speed(1.0f)
		{}

		void setPos(const vec2& _pos)
		{
			pos = _pos;
		}

		void setAngle(const float& _angle)
		{
			angle = _angle;
		}

		void setRotateSpeed(const float& _rotate_speed)
		{
			rotate_speed = _rotate_speed;
		}

		void setRoofColor(const RGB& _roof_color)
		{
			roof_color = _roof_color;
		}

		void setWallColor(const RGB& _wall_color)
		{
			wall_color = _wall_color;
		}

		void draw()
		{
			// draw a house
			beginTransformation();
			{
				translate(pos);
				rotate(angle);

				// wall
				drawFilledBox(wall_color, 0.2f, 0.2f);

				// roof
				drawFilledTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });
				drawWiredTriangle(roof_color, { -0.13f, 0.1f }, { 0.13f, 0.1f }, { 0.0f, 0.2f });

				// window
				windowDraw();

			}
			endTransformation();
		}

		void update(float time) 
		{
			angle = time * rotate_speed;
		}

	};

	class Example : public Game2D
	{
	private:
		float time;

	public:
		House houses[10];

		Example() : Game2D()
		{
			RandomNumberGenerator rnd;

			for (int i = 0; i < 10; ++i) {
				houses[i].setPos({ -1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f) });
				houses[i].setRotateSpeed(rnd.getFloat(-10.0f, 10.0f) * 10.0f);
				houses[i].setRoofColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWindowColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
				houses[i].setWallColor(RGB(rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f), rnd.getFloat(0.0f, 1.0f)));
			}

			time = 0.0f;
		}

		void update() override
		{
			for (int i = 0; i < 10; ++i) {
				houses[i].draw();
			}

			time += this->getTimeStep();
		}
	};
}

댓글