( ** 인프런에서 들은 강의 '홍정모의 게임 만들기 연습 문제 패키지'를 통해서 공부한 내용과 연습 문제 풀이입니다. **)
// 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();
}
};
**** 키워드 : 키보드 입력 및 이동, 배열과 메모리 누수 관리 ****
'스터디 > OpenGL' 카테고리의 다른 글
[ OpenGL ] 공 튀기기 시뮬레이션 (0) | 2019.10.31 |
---|---|
[ OpenGL ] 랜덤 함수와 집 객체 (0) | 2019.10.31 |
[ OpenGL ] 사람 클래스 구현 ( 이동과 점프 애니메이션 ) (0) | 2019.10.31 |
[ OpenGL ] 도형 익히기 (0) | 2019.10.31 |
[ OpenGL ] 미니 태양계 (0) | 2019.10.31 |