• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

mutiple bullet 관련 질문 드립니다.

22.02.27 19:41 작성 조회수 166

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

}

 

이렇게 볼드체 한 부분을 추가해주었는데 왜 화면상에서는 계속 한 발씩만 발사되는지 모르겠습니다.

제가 잘못 알고 있는 부분이 있다거나 힌트를 주시면 감사하겠습니다!

답변 2

·

답변을 작성해보세요.

1

강민철님의 프로필

강민철

2022.02.27

안녕하세요 :)

혹시 몇 강, 몇 분 즈음에서 발생한 질문이신가요?

궁금증이 생긴 구체적인 강좌 명을 알려주시면 빠르게 답변드리겠습니다 :)

감사합니다.

 

(수정) 아마 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님의 프로필

sim2real

질문자

2022.02.28

답변 주셔서 감사합니다!

답변 해주신 코드는 컨테이너에 먼저 담고 담긴 원소의 좌표값, 속력을 설정해주는 것으로 보입니다.

제 코드도 이와 매우 동일하지만, 차이점은 먼저 만들어서 좌표값, 속력을 설정하고 담는건데, 제 코드는 왜 총알이 한발 밖에 안나갈까요?? 아래는 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); 

}

강민철님의 프로필

강민철

2022.02.28

MyBullet* tmp = bullet; 

를 하는 과정에서 tmp에 center, center.x, center.y, velocity가 잘 적용되었는지

확인해보시겠어요? 얕은 복사를 하는 과정에서 총알 관련 정보가 tmp에 할당되지 않은 것 같습니다.

sim2real님의 프로필

sim2real

질문자

2022.02.28

반영해서 했는데도 잘 안되네요 ㅠㅠ 답글 달아보았습니다!

0

sim2real님의 프로필

sim2real

질문자

2022.02.28

아하! 그렇군요

얕은 복사를 피하기 위해서 이런식으로 작성해봤는데도 여전하네요.

그리고 선생님께서 올려주셨던 코드로 돌리니까 계속 오류가 뜨는 상황입니다.

문법적으로 틀릴게 없는것 같은데 계속 어디서 문제가 생긴지 모르겠습니다 ㅠㅠ

강민철님의 프로필

강민철

2022.02.28

음.. 그렇군요.

전체 코드를 상세하게 보고 싶은데, 혹시 전체 코드를 두 번 압축해서 tegongkang @ gmail. com으로 보내주시겠어요? 오늘이나 내일 오전 중으로 문제 짚어서 답글 달아드리겠습니다 :)

sim2real님의 프로필

sim2real

질문자

2022.02.28

넵 전송했습니다! 감사합니다

강민철님의 프로필

강민철

2022.03.01

답변 드립니다 :) 

(생각보다 단순한 문제였네요..ㅎㅎ)

 

문제는 총알의 위치를 변화시키고, 그려주는 함수가 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님의 프로필

sim2real

질문자

2022.03.01

아하..! 제가 공간만 만들어두고, 채워진 총알이 움직이게 하는 코드를 안짯었네요 ㅠㅠ

제가 생각이 짧았습니다. 코드 봐주셔서 정말 감사합니다!