在单独列表中的两个精灵的碰撞
Collision of two sprites in separate lists
我目前尝试在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);
}
当我将标记的代码部分放入(右侧//)时,我会在拍摄后立即进行调试时,我会得到"列表迭代器不可抵消"。当我剪掉上述代码时,它运行良好(我可以射击,走进怪物,它们消失等)。因此,我想我的代码的其余部分都在起作用。
那么,不同列表的迭代器之间是否可能发生碰撞?如果是这样,我该怎么做?
如果您需要更多信息或代码,请询问。我很高兴您的帮助...
您使用的迭代器无效。
您的问题有多种解决方案。第一个:
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
是以下类别的类: 阶级怪物 { 活着的布尔; 民众: 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);
}
};
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 在单独列表中的两个精灵的碰撞
- 两个精灵列表的冲突-SFML2.0