【发布时间】:2011-08-03 02:52:44
【问题描述】:
我很困在这里。在过去的两天里,我一直在尝试和谷歌搜索,但我无法弄清楚。我有一个名为 Player 的类和另一个继承自 Player 的名为 Enemy 的类。我有一个列表,用于存储我的子弹坐标并在 Player 中循环遍历它们。我试图访问并循环通过相同的列表来检查构建在 Player 上的 Enemy 中的碰撞,但它甚至不会进入循环。我猜它是空的,但为什么呢?
struct structShoot
{
float x;
float y;
};
class Player
{
private:
blablabla
protected:
list<structShoot>::iterator it;
list<structShoot> shoot_list;
structShoot test;
public:
void render(SDL_Surface* dest);
};
void Player::render(SDL_Surface* dest)
{
//Works fine, see the other loop down below
for(it = shoot_list.begin(); it != shoot_list.end();)
{
shoot.moveSet(it->x, it->y);
shoot.draw(dest);
it->y--;
if((it->y) < -25)
{
it = shoot_list.erase(it);
}
else
{
it++;
}
}
}
class Enemy : protected Player
{
public:
void render(SDL_Surface* dest);
};
void Enemy::render(SDL_Surface* dest)
{
SDL_Rect a, b;
//Does not enter loop!? Ever. Why?
for(it = shoot_list.begin(); it != shoot_list.end();)
{
SDL_Quit();
a.x = enemy.getX();
a.y = enemy.getY();
a.w = enemy.getWidth();
a.h = enemy.getHeight();
b.x = it->x;
b.y = it->y;
b.w = 10;
b.h = 19;
it->y--;
if (collision(a, b) == true)
{
SDL_Quit();
}
if(it->y < -25)
{
it = shoot_list.erase(it);
}
else
{
it++;
}
}
}
【问题讨论】:
-
也许你在第一个循环中删除了整个列表,所以第二个循环无关?
-
您是否尝试过在调试器中运行它,或者添加打印语句?例如,你检查过
!shoot_list.empty()吗? -
您不是在将
Enemy对象的某种类型多态转换为Player指针,是吗?如果是这种情况,那么因为render()不是虚函数,所以对某个指针(*my_player).render()的任何调用都只会调用Player::render()而不是Enemy::render()。 -
您是否也将所有子弹都添加到敌人身上?
shoot_list不在对象之间共享。我建议您将项目符号列表从播放器对象中移出并单独维护。并将所有运动和碰撞检测从渲染函数中移出 - 这将为您以后省去很多麻烦。 -
好的,谢谢,但是有没有办法以某种方式分享shoot_list?