강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김찬하님의 프로필 이미지
김찬하

작성한 질문수

홍정모의 게임 만들기 연습 문제 패키지

1.3 상호작용 맛보기 - 키보드 입력과 반응

multiple bullet 문제

작성

·

305

0

안녕하세요, multiple bullet 문제를 생각해보고 있는데, 혼자 생각한지 너무 오래 되어, 생각이 고착되어 있는 거 아닌가해서, 질문글을 올려봅니다.
MyBullet* bullet[100] = { nullptr, };
int i = -1; //bullet number

와 같이 pointer 들로 이루어진 배열을 사용해보려고 했습니다.

if (isKeyPressedAndReleased(GLFW_KEY_SPACE)) {
	i++;
	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.5f, 0.0f);
} 

와 같이 하여, 스페이스바를 누를 때마다, array 한칸한칸에 bullet 객체포인터를 저장했습니다.

여기서부터, 문제가 이렇게 해도 결국, bullet[i] -> update()와 같은 줄을 100줄을 써야한다는 것입니다.

if (bullet[0] != nullptr) bullet[0]->update(getTimeStep());
if (bullet[1] != nullptr) bullet[1]->update(getTimeStep());
if (bullet[2] != nullptr) bullet[2]->update(getTimeStep());
if (bullet[3] != nullptr) bullet[3]->update(getTimeStep());
if (bullet[4] != nullptr) bullet[4]->update(getTimeStep());

와 같이 써야지 작동을 했습니다.

밑에 draw() 함수 도 마찬가지여서, 코드를 줄일 수 있는 방법을 생각해보다가, 도저히 생각이안나서 질문글을 올려봅니다. 찾다보니 thread를 이용하는 것도 나오고 하지만, 유용하지 않다고 판단했습니다.

for문을 돌리면, 다음 loop으로 넘어갈 때 실행되던 update함수가 사라지게 되어, 결국 모든 객체의(bullet[0], bullet[1]....)의 update 메소드를 동시에 실행시키는 방법을 일일히 100줄을 쓰는 것 외에는 찾을 수 없어, 질문글을 올려봅니다 ㅠ

감사합니다.

답변 1

0

홍정모님의 프로필 이미지
홍정모
지식공유자

안녕하세요?

세상에 for문을 100번씩 적으면서 프로그래밍하는 일은 있어서는 안되겠지요. (이제 와서 다시 따배씨++를 수강하실 필요는 없습니다만, C++을 C++ 답게 사용하는 방법을 계속 궁리해보시면 좋겠네요. 아직 C 프로그래밍 스타일을 가지고 계신 것 같습니다. 본 강의가 따배씨++를 통해서 현대적 C++ 문법을 공부하신 분들을 가정하고 만든 거라서 낯설게 느껴지실 수 있습니다.)

c++ 프로그래밍에서는 동적할당 메모리 대신에 거의 대부분 std::vector를 사용합니다. MyBullet* bullet[100] 대신에 std::vector<MyBullet*>이나 std::vector<MyBullet>을 사용해보세요. std::vector에서 제공하는 size()함수를 이용하시면 for문에서 100을 하드코딩 하실 필요가 없습니다. 거기에 더해서 auto와 함께 더 편하게 vector를 사용하실 수도 있는데, 검색해보시면 modern c++ 문법을 찾아보실 수 있을 겁니다. 따배씨++의 교재인 learncpp.com을 보시는 것도 좋습니다.

비슷한 질문을 몇 번 받은 기억이 나는데 밑에 다른 분들 질문답변도 참고해보세요.

중간중간 어려운 부분들이 계속 나타나겠지만 포기하지 않고 게임 만드는데 성공하셨으면 좋겠네요.

김찬하님의 프로필 이미지
김찬하
질문자

감사합니다!

김찬하님의 프로필 이미지
김찬하

작성한 질문수

질문하기