저는 C++의 noob 종류이며 단순한 게임을 만들려고합니다. 내가 클래스 스프라이트라고 만든하위 클래스의 요소가있는 클래스 목록을 전달하는 C++
: 이것은 내 문제입니다 "충돌"라는 메소드를 가지고
이class Sprite
{
private:
Point2D sp_pos;
Point2D sp_vel;
SDL_Surface* sp_img;
Point2D sp_center;
Point2D sp_size;
double sp_radius;
bool sp_animated;
int sp_frames;
int sp_cur_frame;
public:
Sprite() {}
Sprite(Point2D pos, Point2D vel, SDL_Surface *img, ImageInfo info, bool animated = false, int frames = 0);
virtual void draw(SDL_Surface* screen);
virtual void update();
void setInfo (ImageInfo info);
void setPos(Point2D pos) { sp_pos = pos; }
void setVel(Point2D vel) { sp_vel = vel; }
void setImg (SDL_Surface* img) { sp_img = img; }
void setNextFrame() { sp_cur_frame++; }
void setFrame(int frame) { sp_cur_frame = frame; }
void setAnimated(bool animated) { sp_animated = animated; }
void changeVelX (int c) { sp_vel.setX(c);}
void changeVelY (int c) { sp_vel.setY(c);}
void changePosX (int c) { sp_pos.setX(c);}
void changePosY (int c) { sp_pos.setY(c);}
SDL_Surface* getImg() { return sp_img; }
Point2D getPos() { return sp_pos; }
Point2D getVel() { return sp_vel; }
Point2D getCenter() { return sp_center; }
Point2D getSize() { return sp_size; }
double getRadius() { return sp_radius; }
int getCurFrame() { return sp_cur_frame; }
int getFrames() { return sp_frames; }
bool collide(Sprite &another_sprite);
};
,이 방법은 두 스프라이트 간의 충돌을 감지하고 다음과 같이 작동합니다
bool Sprite::collide(Sprite &another_sprite)
{
double d = getPos().dist(another_sprite.getPos());
if (d < (getRadius() + another_sprite.getRadius()))
return true;
else
return false;
}
메서드가 제대로 작동합니다. 내 문제는 다음과 같이 발생합니다. "Sprite"의 하위 클래스 인 다른 클래스를 구현했으며 내 게임에서 적을 나타낼 것입니다. 예를 들어 클래스 enemy1 : public Sprite, 클래스 enemy2 : public Sprite 등이 있습니다. 서로 다른 행동을하기 때문에 서로 다릅니다.
bool group_collide(std::list<Sprite> &group, Sprite other_object)
{
bool collision = false;
for (std::list<Sprite>::iterator sprite = group.begin(), end = group.end(); sprite != end; ++sprite)
{
if (sprite->collide(other_object))
{
Sprite exp = Sprite(sprite->getPos(), Point2D(0, 0), exp_image, exp_info, true, 7);
exp_group.push_back(exp);
if(Mix_PlayChannel(-1, explosion, 0) == -1)
{
//abort();
}
sprite = group.erase(sprite);
collision = true;
}
}
return collision;
}
int group_group_collide(std::list<Sprite> &group, std::list<Sprite> &other_group)
{
int scored = 0;
for (std::list<Sprite>::iterator it1 = group.begin(), end1 = group.end(); it1 != end1; ++it1)
{
if (group_collide(other_group, *it1))
{
it1 = group.erase(it1);
scored += 10;
}
}
return scored;
}
그래서, 사실, 그룹 스프라이트와 스프라이트의 목록 사이 collisons를 감지 충돌, 그리고 group_group_collide는 그룹 사이의 충돌을 감지합니다 다음과 같이 나는 group_collide 및 group_group_collide라는 다른 두 도우미 기능, 그 일을 실행 스프라이트 (두 개의 다른 목록). 발생하는 문제는 적어도 네 가지 유형의 적이 존재하며 모두 Sprite 클래스의 하위 클래스이지만 스프라이트 목록을 만들고 스프라이트의 하위 클래스 인 요소를 추가하면 컴파일 오류가 발생합니다. 내 솔루션은 모든 종류의 적을 위해 group_collide 및 group_group 충돌 방법을 쓰고 있었지만, 이것은 매우 비 효과적입니다. 이 문제에 접근하는 더 좋은 방법이 있습니까?
편집 :
의견을 보내 주셔서 감사합니다. 당신이 제안으로 나는 포인터 목록으로 목록을 정의 :
std::list<Sprite*> enemy_group;
그리고 예를 들어, 내가 이런 식으로 클래스 스프라이트의 서브 클래스입니다 "카미카제"의 요소를 추가하고 (방법 업데이트는 다르다 목록 반복 그러나
enemy_group.push_back(new Kamikaze(enemy_pos, enemy_vel, 0, enemy_image, enemy_info));
:이 클래스는)
는 방법 업데이트가 Sprite 클래스가 아닌 가미 클래스에서 호출for (list<Sprite*>::iterator it = enemy_group.begin(), end = enemy_group.end(); it != end; ++it) {
(*it)->draw(screen);
(*it)->update();
if ((*it)->getPos().getY() > SCREEN_HEIGHT + 30)
{
delete *it;
it = enemy_group.erase(it);
}
}
, 그러므로 나는 또한 객체 슬라이스 확률값을 이 접근 방식으로, 아마도 내가 한 짓에 뭔가 잘못된 것이 있습니까?
[이중 발송] (http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C.2B.2B) 유형의 문제와 비슷합니다. 매우 비슷한 예가 링크 된 위키피디아 페이지에 표시됩니다. – en4bz
'Sprite'에서 파생 된 클래스를'std :: list'에 저장할 수 없습니다. 시도해 볼 수도 있지만 다음과 같이 처리 할 수 있습니다 : http://stackoverflow.com/questions/274626/what-is-object-slicing –
PaulMcKenzie
또한'충돌'은 아마도 순수한'가상'함수 여야합니다. – en4bz