본문 바로가기
스터디/OpenGL

[ OpenGL ] 탱크 이동 및 발포 구현 ( 메모리 누수 관리와 총알 중첩 생성 )

by 알 수 없는 사용자 2019. 10. 31.


( ** 인프런에서 들은 강의 '홍정모의 게임 만들기 연습 문제 패키지'를 통해서 공부한 내용과 연습 문제 풀이입니다. **)

 

// MyExample3
	class MyTank
	{
	public:
		vec2 center = vec2(0.0f, 0.0f);
		//vec2 direction = vec2(1.0f, 0.0f, 0.0f);

		void draw()
		{
			beginTransformation();
			{
				translate(center);
				drawFilledBox(Colors::green, 0.25f, 0.1f); // body
				translate(-0.02f, 0.1f);
				drawFilledBox(Colors::blue, 0.15f, 0.09f); // turret
				translate(0.15f, 0.0f);
				drawFilledBox(Colors::red, 0.15f, 0.03f);  // barrel
			}
			endTransformation();
		}
	};

	class MyBullet
	{
	public:
		vec2 center = vec2(0.0f, 0.0f);
		vec2 velocity = vec2(0.0f, 0.0f);
		
		void draw()
		{
			beginTransformation();
			translate(center);
			drawFilledRegularConvexPolygon(Colors::yellow, 0.02f, 8);
			drawWiredRegularConvexPolygon(Colors::gray, 0.02f, 8);
			endTransformation();
		}

		void update(const float& dt)
		{
			center += velocity * dt;
		}
	};

	class MyExample3 : public Game2D
	{
	public:
		MyTank tank;

		MyBullet *bullet[100];

	public:
		MyExample3()
			: Game2D("This is my digital canvas!", 1024, 768, false, 2)
		{
			for (int i = 0; i < 100; i++)
			{
				bullet[i] = nullptr;
			}
		}

		~MyExample3()
		{
			//if (bullet!= nullptr) delete[] bullet;

			for (int i = 0; i < 100; i++)
			{
				if (bullet[i] != nullptr) delete bullet[i];
			}
		}

		void update() override
		{
			// move tank
			if (isKeyPressed(GLFW_KEY_LEFT))	tank.center.x -= 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_RIGHT))	tank.center.x += 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_UP))		tank.center.y += 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_DOWN))	tank.center.y -= 0.5f * getTimeStep();

			// make a cannon ball
			if (isKeyPressedAndReleased(GLFW_KEY_SPACE))
			{
				for (int i = 0; i < 100; i++)
				{
					if (bullet[i]==nullptr)
					{
						bullet[i] = new MyBullet;
						bullet[i]->center = tank.center;
						bullet[i]->center.x += 0.2f;
						bullet[i]->center.y += 0.1f;
						bullet[i]->velocity = vec2(0.1f, 0.0f);
						
						std::cout << i << std::endl;
						break;

					}
				}
				std::cout << "break" << std::endl;
			}

			for (int i = 0; i < 100; i++)
			{
				if (bullet[i] != nullptr)
				{
					// catch
					if (bullet[i]->center.x > 1.5f)
					{
						std::cout << "del" << std::endl;
						delete bullet[i];
						bullet[i] = nullptr;
					}

					else 
					{
						// update a cannon ball
						bullet[i]->update(getTimeStep());

						// cannon balls rendering
						bullet[i]->draw();
					}
				}
			}

			// tank rendering
			tank.draw();
		}
	};

 

탱크.mp4
0.71MB

 

**** 키워드 : 키보드 입력 및 이동, 배열과 메모리 누수 관리 ****