[C++] 2.1 연습 문제 풀이

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 게임 만들기 연습 문제 패키지 강의를 듣고 정리한 필기입니다.😀
🌜 공부에 사용된 홍정모 교수님의 코드들 보러가기
🌜 [홍정모의 게임 만들기 연습 문제 패키지] 강의 들으러 가기!


2.1 연습문제

연습 문제는 스스로 풀이했습니다. 😀
해당 챕터 보러가기 🖐 2.1 객체 지향 : 클래스와 캡슐화
연습 문제 출처 : 홍정모 교수님 블로그


🙋 Q1. 여러 채의 집들을 지붕, 벽, 창문의 색상을 다양하게 그려보기

image

  • RGB randomColor(int i) 함수
    • 랜덤 넘버가 파라미터 i에 복사되어 매칭되는 컬러를 리턴하도록 했다.
houses[i].setWallColor(houses[i].randomColor(rnd.getInt(0, 10))); // 벽 색상 랜덤 설정
houses[i].setRoofColor(houses[i].randomColor(rnd.getInt(0, 10))); // 지붕 색상 랜덤 설정
houses[i].setWindowColor(houses[i].randomColor(rnd.getInt(0, 10))); // 창문 색상 랜덤 설정
  • 0~10 의 정수 중 랜덤한 값 리턴
#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"

namespace jm
{
	class House
	{
	private:
		RGB roof_color;
		RGB wall_color;
		RGB window_color;
		vec2 pos;
		float angle = 0.0f;

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

		RGB randomColor(int i)  // 추가한 함수! 랜덤 넘버가 파라미터 i에 복사되어 매칭되는 컬러를 리턴하도록 했다.
		{
			if (i == 0) return Colors::red;
			else if (i == 1) return Colors::green;
			else if (i == 2) return Colors::blue;
			else if (i == 3) return Colors::skyblue;
			else if (i == 4) return Colors::gray;
			else if (i == 5) return Colors::yellow;
			else if (i == 6) return Colors::olive;
			else if (i == 7) return Colors::black;
			else if (i == 8) return Colors::white;
			else if (i == 9) return Colors::gold;
			else if (i == 10) return Colors::silver;
		}

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

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

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

		void setWindowColor(const RGB& _window_color) // 추가. 창문 색을 지정함
		{
			window_color = _window_color;
		}

		void setRoofColor(const RGB& _roof_color) // 추가. 지붕 색을 지정함
		{
			roof_color = _roof_color;
		}

		void draw()
		{
			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(Colors::gray, 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(vec2(-1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f)));
				houses[i].setWallColor(houses[i].randomColor(rnd.getInt(0, 10)));
				houses[i].setRoofColor(houses[i].randomColor(rnd.getInt(0, 10)));
				houses[i].setWindowColor(houses[i].randomColor(rnd.getInt(0, 10)));
			}
		}

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

int main(void)
{
	jm::Example().run();

	return 0;
}


🙋 Q2. 집들, 창문들이 각각 서로 다른 속도로 회전하게 해보자.

  • rotate(house_angle * time); : 계속해서 회전할 수 있게.
    • time은 Update 함수 안에서 계속 업뎃
      • houses[i].time += getTimeStep();
#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"

namespace jm
{
	class House
	{
	private:
		RGB roof_color;
		RGB wall_color;
		RGB window_color;
		vec2 pos;
		float house_angle = 0.0f;
		float window_angle = 0.0f;

	public:
		House()
			: roof_color(Colors::red), pos(0.0f,0.0f), house_angle(0.0f), window_angle(0.0f), wall_color(Colors::yellow), window_color(Colors::skyblue)
		{}

		float time = 0.0f;

		RGB randomColor(int i)      // white는 뺐음. 안그려진 것처럼 보여서..!
		{
			if (i == 0) return Colors::red;
			else if (i == 1) return Colors::green;
			else if (i == 2) return Colors::blue;
			else if (i == 3) return Colors::skyblue;
			else if (i == 4) return Colors::gray;
			else if (i == 5) return Colors::yellow;
			else if (i == 6) return Colors::olive;
			else if (i == 7) return Colors::black;
			else if (i == 8) return Colors::gold;
			else if (i == 9) return Colors::silver;
		}

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

		void setHouseAngle(const float& _house_angle)  // 추가. 회전각은 랜덤 float값으로 할 것.
		{
			house_angle = _house_angle;
		}

		void setWindowAngle(const float& _window_angle) // 추가. 회전각은 랜덤 float값으로 할 것.
		{
			window_angle = _window_angle;
		}

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

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

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

		void draw()
		{
			beginTransformation();
			{
				translate(pos);
				rotate(house_angle * time);     // 이걸 주석처리하면 창문만 회전한다.
				// 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
				rotate(window_angle * time);   // 이걸 주석처리하면 집 구성 요소들 동일하게 모두 회전
				drawFilledBox(window_color, 0.1f, 0.1f);
				drawWiredBox(Colors::gray, 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(vec2(-1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f)));
				houses[i].setWallColor(houses[i].randomColor(rnd.getInt(0, 9)));
				houses[i].setRoofColor(houses[i].randomColor(rnd.getInt(0, 9)));
				houses[i].setWindowColor(houses[i].randomColor(rnd.getInt(0, 9)));
				houses[i].setHouseAngle(rnd.getFloat(30.0f, 180.0f));   // (30 ~ 180도 중 랜덤한 값 * time()  으로 회전하게 된다.
				houses[i].setWindowAngle(rnd.getFloat(30.0f, 180.0f));
			}
		}

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

int main(void)
{
	jm::Example().run();
	
	return 0;
}


🙋 Q3. 상속을 이용해 동그란 창문을 가진 집 그리기

image

#include "Game2D.h"
#include "Examples/PrimitivesGallery.h"
#include "RandomNumberGenerator.h"

namespace jm
{
	class Window
	{
	private:
		RGB window_color;
		float window_angle = 0.0f;

	public:
		Window()
			: window_color(Colors::skyblue), window_angle(0.0f)
		{}

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

		void setWindowAngle(const float& _window_angle)
		{
			window_angle = _window_angle;
		}

		void windowDraw()
		{
			//rotate(window_angle * time);
			drawFilledCircle(window_color, 0.05f);        // 동그란 창문
			drawWiredCircle(Colors::gray, 0.05f);
			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    // Window 클래스를 상속받아 Window클래스의 함수들에 접근 가능.
	{
	private:
		RGB roof_color;
		RGB wall_color;
		vec2 pos;
		float house_angle = 0.0f;

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

		float time = 0.0f;

		RGB randomColor(int i)
		{
			if (i == 0) return Colors::red;
			else if (i == 1) return Colors::green;
			else if (i == 2) return Colors::blue;
			else if (i == 3) return Colors::skyblue;
			else if (i == 4) return Colors::gray;
			else if (i == 5) return Colors::yellow;
			else if (i == 6) return Colors::olive;
			else if (i == 7) return Colors::black;
			else if (i == 8) return Colors::gold;
			else if (i == 9) return Colors::silver;
		}

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

		void setHouseAngle(const float& _house_angle)
		{
			house_angle = _house_angle;
		}

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

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

		void draw()
		{
			beginTransformation();
			{
				translate(pos);
				//rotate(house_angle * time);

				drawFilledBox(wall_color, 0.2f, 0.2f);

				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 });

				windowDraw();

			}
			endTransformation();
		}
	};

	class Example : public Game2D
	{
	public:

		House houses[10];

		Example()
			:Game2D()
		{
			RandomNumberGenerator rnd;

			for (int i = 0; i < 10; i++)
			{
				houses[i].setPos(vec2(-1.3f + 0.3f * float(i), rnd.getFloat(-0.5f, 0.5f)));
				houses[i].setWallColor(houses[i].randomColor(rnd.getInt(0, 9)));
				houses[i].setRoofColor(houses[i].randomColor(rnd.getInt(0, 9)));
				houses[i].setWindowColor(houses[i].randomColor(rnd.getInt(0, 9)));
				//houses[i].setHouseAngle(rnd.getFloat(30.0f, 180.0f));
				//houses[i].setWindowAngle(rnd.getFloat(30.0f, 180.0f));
			}
		}

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

int main(void)
{
	jm::Example().run();
	
	return 0;
}


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

C++ games 카테고리 내 다른 글 보러가기

댓글 남기기