c++列表循环

C++ list looping

本文关键字:循环 列表 c++      更新时间:2023-10-16

我被困在这里了。我一直在尝试和谷歌搜索过去的2天,但我不能弄清楚。我有一个类叫做Player另一个类叫做Enemy它继承自Player。我有一个存储子弹坐标的列表,并在Player中循环它们。我试图访问和循环通过相同的列表来检查碰撞的敌人,建立在玩家,但它甚至不会进入循环。我猜它是空的,但为什么?

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++;
        }   

    }
}

你应该使渲染虚拟使用多态性。

virtual void render(SDL_Surface* dest);

我想每次你调用Player::render,因为这样的代码:

Player* enemy = new Enemy();
enemy->render(); // there is Player::render calling

如果你使渲染虚拟,你将使用虚拟表来检测正确的函数,应该在这个地方调用。所以你必须让渲染是虚拟的

只有一种可能导致这种情况,即shoot_list.begin()等于shoot_list.end(),因此它是空的。

也许在Player::render处的循环被打破并完全清空了列表?