【问题标题】:C++ list loopingC++ 列表循环
【发布时间】: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?

标签: c++ class list loops


【解决方案1】:

您应该使渲染虚拟化以使用多态性。

虚空渲染(SDL_Surface* dest);

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

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

如果您将渲染设为虚拟,您将使用虚拟表来检测应在此位置调​​用的正确函数。所以你必须让渲染虚拟化。

【讨论】:

  • 对不起,我对 OOP 有点陌生。我将渲染设为虚拟,但我仍然遇到同样的问题。我不确定我理解你为什么我应该把它设为 Player*enemy = new Enemy();如果有人有时间我已经上传了整个项目。我不是要你解决它,只是给我一些提示。 megaupload.com/?d=Z1Y9XCO2
  • 我找不到你为敌人填写shoot_list 的地方。我找到的唯一地方是 void Game::OnEvent(SDL_Event* Event) case SDLK_SPACE: pl.fire();休息;您在其中将元素添加到播放器的 shoot_list 中。我相信这是您问题的根本原因。
  • 我没有为敌人添加到 shoot_list 的元素。我只想循环遍历来自玩家(shoot_list)的敌人中的元素(坐标),以检查玩家的子弹是否击中了敌人。这有意义吗? :S
  • 看起来你需要将 shoot_list 作为 Game 类的成员并在那里填充它。然后你可以通过玩家和敌人实例访问这个列表。
【解决方案2】:

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

也许Player::render 处的循环已损坏并完全清空列表?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多