2011-04-11 68 views
2

我很困难。过去两天我一直在尝试Google搜索,但我无法弄清楚。我有一个叫做Player的类,另一个叫做从Ellemy继承的Player。我有一个列表,它存储我的子弹的坐标并循环播放它们在播放器中。我试图访问和循环通过相同的列表来检查在Enemy中建立在播放器上的碰撞,但它甚至不会进入循环。我猜不知它是空的,但为什么?C++列表循环

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


    } 
} 
+0

也许你在第一个循环中删除了整个列表,所以第二个循环无关? – 2011-04-11 14:21:58

+0

您是否曾尝试在调试器中运行此操作或添加打印语句?例如,你有没有检查过'!shoot_list.empty()'? – 2011-04-11 14:22:24

+0

你并没有将'Enemy'对象的某种类型多态转换为'Player'指针,是吗?如果是这样的话,那么因为render()不是一个虚函数,任何对某个指针(* my_player).render()的调用只会调用'Player :: render()'而不是'Enemy ::渲染()'。 – Jason 2011-04-11 14:35:26

回答

2

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

virtual void render(SDL_Surface * dest);

我想,每次通话时间球员::渲染,因为这样的代码:

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

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

+0

对不起,我有点新OOP。我使渲染虚拟,但我仍然有同样的问题。我不知道我明白你为什么要让它变成玩家* enemy = new Enemy();如果有人有我上传整个项目的时间。我不要求你解决它只是给我一些提示。 http://www.megaupload.com/?d=Z1Y9XCO2 – Jesper 2011-04-11 15:03:05

+0

我无法找到填满shoot_list敌人的地方。只有我发现的地方是 void Game :: OnEvent(SDL_Event * Event)case SDLK_SPACE:pl.fire();打破;你在哪里添加元素给shoot_list的玩家。我相信你的问题有根本原因。 – 2011-04-11 15:16:07

+0

我没有添加元素shoot_list敌人。我只想循环玩家(shoot_list)中敌人的元素(坐标)来检查玩家的子弹是否击中了敌人。这有意义吗? :S – Jesper 2011-04-11 16:47:24

0

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

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