2012-12-20 92 views
2

我尝试在SFML中编写一个自顶向下的射手,但遇到了问题。我对C++和编程一般都很陌生,所以请原谅混乱的代码和/或过于复杂的解决方案。在单独的列表中碰撞两个精灵

我有两个std::list s,其中一个包含随机产卵的敌人,另一个包含我解雇的子弹。当一颗子弹击中一个敌人时,他们都应该被擦除,但它不起作用。

这里是我的代码的问题部分:

for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 

    //Here would be Monster-Movement 

    //Collision Monster-Player (MonsterIt = iterator of MonsterList) 
    if ((MonsterIt -> getPosition().x + 25) >= PlayerX - 25 && 
     (MonsterIt -> getPosition().x - 25) <= PlayerX + 25 && 
     (MonsterIt -> getPosition().y + 25) >= PlayerY - 25 && 
     (MonsterIt -> getPosition().y - 25) <= PlayerY + 25 ) 
    { 
     MonsterList.erase(MonsterIt); 
     break;    
    } 


     window.draw(*MonsterIt); 
} 

这就是我所做的怪物和玩家之间的碰撞的方式。这工作得很好,所以我试图与怪物和激光一样的:

for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
{ 

    //Here would be "Laser-Movement" 

    //Collision-Laser        // Doesn't work 
    if ((MonsterIt -> getPosition().x + 25) >=  // 
     (LaserIt -> getPosition().x - 7) &&  // 
     (MonsterIt -> getPosition().x - 25) <=  // 
     (LaserIt -> getPosition().x + 7) &&  // 
     (MonsterIt -> getPosition().y + 25) >=  // 
     (LaserIt -> getPosition().y - 7) &&  // 
     (MonsterIt -> getPosition().y - 25) <=  // 
     (LaserIt -> getPosition().x + 7))   // 
    {            // 
     MonsterList.erase(MonsterIt);    // 
                // 
     LaserList.erase(LaserIt);     // 
                // 
     break;          // 
    }            // 

    window.draw(*LaserIt); 
} 

当我把代码的一部分标志着我(与右侧//)我得到一个“列表迭代器不dereferencable”误差尽快调试我拍摄。当我切出所说的代码时,它运行良好(我可以射击,走入怪物并消失等等)。因此,我猜我的代码的其余部分正在工作。

那么,不同列表的迭代器之间甚至有可能发生冲突? 如果是这样,我该怎么做?

如果您需要更多信息或代码,请询问。我很乐意为您提供帮助...

+0

你怎么知道'MonsterIt'是第二个片段中的有效迭代器? –

+0

这是我的问题。我想这是无效的,这就是为什么它不起作用。但是,我怎样才能使MonsterList中的Monster和LaserList中的Laser-Shot之间发生碰撞?就像我说的,我对C++很陌生。就我所了解的迭代器而言,这里的MonsterIt是列表中一个成员的“名字”。真的吗? – pantagruel

+0

不是。 MonsterIt是一个变量的名称,它指向一个怪物(MonsterIt是一个迭代器,而不是怪物)。 – Synxis

回答

0

您使用的迭代器无效。

有几种解决方案可以解决您的问题。第一个:

for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 
    //Here would be Monster-Movement 

    //Collision Monster-Player (MonsterIt = iterator of MonsterList) 

    // Collision with laser, inside the loop for monsters 
    for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
    { 
    } 

    window.draw(*MonsterIt); 
} 

此解决方案不是真正的C++ ish。随着OOP,你可以有一个更清晰的代码:

class Player 
{ 
    public: 
     int X, Y; // for code simplicity on SO. 
}; 
// ... 

Player player; 
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++) 
{ 
    MonsterIt->update(player,LaserList); 
    if(!MonsterIt->isAlive()) 
    { 
     // Remove monster from list *without* break 
    } 
} 

然后,Monster是像下面这样的类: 类怪物 { 布尔活着; public: bool isAlive()const {return alive; }

 bool collideWithPlayer(Player p) const 
     { 
      // Returns whether it collide with player 
      // ... 
     } 

     bool collideWithLaser(Laser l) const 
     { 
      // Returns whether it collide with one laser 
      // ... 
     } 

     bool collideWithLasers(LaserList l) const 
     { 
      for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++) 
       if(collideWithLaser(*LaserIt)) 
        return true; 
      return false; 
     } 


     void update(Player p, LaserList l) 
     { 
      if(collideWithPlayer(p) || collideWithLasers(l)) 
       alive = false; 
      else 
       window.draw(this); 
     } 
}; 
+0

太棒了,我会试试看。非常感谢。 – pantagruel