-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
mutiple bullet 관련 질문 드립니다.
22.02.27 19:41 작성 조회수 43
0
안녕하세요. 좋은 수업 재밋게 잘 듣고 있습니다.
multiple bullet 관련해서 내주신 숙제를 풀다가 의문점이 생겨 질문을 드립니다.
tank example 에 public 에 다음과 같이
std::vector<MyBullet*> bullet_container;
를 추가하고 update() override 부분에
if (isKeyPressedAndReleased(GLFW_KEY_SPACE))
{
(기존코드)
MyBullet* tmp = bullet;
bullet_container.push_back(tmp);
}
이렇게 볼드체 한 부분을 추가해주었는데 왜 화면상에서는 계속 한 발씩만 발사되는지 모르겠습니다.
제가 잘못 알고 있는 부분이 있다거나 힌트를 주시면 감사하겠습니다!
답변을 작성해보세요.
1
강민철
22.02.27 20:02
안녕하세요 :)
혹시 몇 강, 몇 분 즈음에서 발생한 질문이신가요?
궁금증이 생긴 구체적인 강좌 명을 알려주시면 빠르게 답변드리겠습니다 :)
감사합니다.
(수정) 아마 1.3절을 여쭈어보신 듯 합니다.
아래 부분은 멋지게 잘 수행해주신 듯 하나,
vector<MyBullet *> bullet_container;
총알이 발사될 때 새롭게 객체가 만들어져야 합니다.
아래 예시 코드를 참고하여 만들어보세요 :)
bullet_container.push_back(new MyBullet);
bullet_container.back()->center = tank.center;
bullet_container.back()->center.x += 0.2f;
bullet_container.back()->center.y += 0.1f;
bullet_container.back()->velocity = vec2(2.0f, 0.0f);
...
감사합니다.

sim2real
질문자22.02.28 11:49
답변 주셔서 감사합니다!
답변 해주신 코드는 컨테이너에 먼저 담고 담긴 원소의 좌표값, 속력을 설정해주는 것으로 보입니다.
제 코드도 이와 매우 동일하지만, 차이점은 먼저 만들어서 좌표값, 속력을 설정하고 담는건데, 제 코드는 왜 총알이 한발 밖에 안나갈까요?? 아래는 if문 코드 전체입니다 ( 컨테이너 선언은 메인 질문에 있으므로 생략 )
if (isKeyPressedAndReleased(GLFW_KEY_SPACE))
{
bullet = new MyBullet;
bullet->center = tank.center;
bullet->center.x += 0.2f;
bullet->center.y += 0.1f;
bullet->velocity = vec2(0.1f, 0.0f);
MyBullet* tmp = bullet;
bullet_container.push_back(tmp);
}
강민철
22.02.28 17:05
MyBullet* tmp = bullet;
를 하는 과정에서 tmp에 center, center.x, center.y, velocity가 잘 적용되었는지
확인해보시겠어요? 얕은 복사를 하는 과정에서 총알 관련 정보가 tmp에 할당되지 않은 것 같습니다.
0

sim2real
질문자22.02.28 17:15
아하! 그렇군요
얕은 복사를 피하기 위해서 이런식으로 작성해봤는데도 여전하네요.
그리고 선생님께서 올려주셨던 코드로 돌리니까 계속 오류가 뜨는 상황입니다.
문법적으로 틀릴게 없는것 같은데 계속 어디서 문제가 생긴지 모르겠습니다 ㅠㅠ
강민철
22.02.28 17:17
음.. 그렇군요.
전체 코드를 상세하게 보고 싶은데, 혹시 전체 코드를 두 번 압축해서 tegongkang @ gmail. com으로 보내주시겠어요? 오늘이나 내일 오전 중으로 문제 짚어서 답글 달아드리겠습니다 :)
강민철
22.03.01 00:29
답변 드립니다 :)
(생각보다 단순한 문제였네요..ㅎㅎ)
문제는 총알의 위치를 변화시키고, 그려주는 함수가 bullet_container가 아닌
단순히 bullet변수를 update 시키고 draw 했기 때문에 발생했습니다.
bullet_container를 만들어 각각의 bullet들을 vector형태로 저장했다면,
bullet_container 안에 있는 모든 총알에 대해 위치를 update 시키고 draw 해야 합니다.
그렇기에 아래와 같이 bullet_container 에 대해 순회하며 찍는 과정이 필요합니다.
if (!bullet_container.empty())
{
for (int i = 0; i < bullet_container.size(); i++)
{
bullet_container.at(i)->update(getTimeStep());
bullet_container.at(i)->draw();
}
}
올바르게 수정한 전체 소스코드는 메일로 답장 드렸습니다.
감사합니다.

sim2real
질문자22.03.01 15:27
아하..! 제가 공간만 만들어두고, 채워진 총알이 움직이게 하는 코드를 안짯었네요 ㅠㅠ
제가 생각이 짧았습니다. 코드 봐주셔서 정말 감사합니다!
답변 2