好吧所以,经过几次不同的尝试,我一直在解决这个问题。为了给出一些背景知识并希望对这个问题有一个合适的见解,我将解释我的代码是如何设置的。
我的当前代码在应该执行此操作的函数中看起来有点像这样:
for(Entity* player : entityList)
{
Player* p = dynamic_cast<Player*>(player);
Player* p2 = dynamic_cast<Player*>(player++);
if(p)
{
i=p->Snake_List.begin();
for(m=p2->Snake_List.begin(); m != p2->Snake_List.end(); m++)
{
if (i!=m)
{
if ((i->x == m->x) && i->y == m->y)
{
p->respawn();
return;
}
}
}
}
}
这个编译并且运行正常,但是碰撞不能给我带来预期的效果。什么都没发生。我真的不认为我正在引用第二个HumanPlayer的列表,但是如果有人可以帮助发光,那将非常感激:)
答案 0 :(得分:0)
你不想要'++ player'吗?
抱歉,我应该更加冗长。我相信问题是你在中使用
之后将玩家编入索引播放器* p2 = dynamic_cast(播放器++);
当你真正想要的东西像'++ player'时。 像
这样的东西Player* p2 = dynamic_cast<Player*>(player) + 1;
所以你首先投射到玩家,然后索引到下一个玩家。
答案 1 :(得分:0)
我认为主要问题是在您的代码段的最顶层:
for(Entity* player : entityList)
{
Player* p = dynamic_cast<Player*>(player);
Player* p2 = dynamic_cast<Player*>(player++);
您迭代entryList
,然后检查p
的头部是否遇到p2
的任何蛇块。但是,你必须在这里使用后增量运算符来发挥一些不寻常的技巧。
我认为你实际想要做的是检查某个玩家的蛇头是否遇到任何其他玩家的蛇。编写具有该想法的代码可能会避免后增量操作符的使用,并且它将很好地扩展到更多的玩家。
答案 2 :(得分:0)
如果列表中只有两个Player
对象,那么你可以得到这样的两个玩家:
auto itPlayer = entityList.begin();
Player* p1 = *(itPlayer++);
Player* p2 = *itPlayer;
这不会进行任何错误检查,因此如果列表中的玩家少于两个,则会崩溃。如果列表中有两个以上的玩家,则需要使用嵌套循环将每个玩家与其他玩家进行比较。
原始版本无效的原因(除了错误位置的后增量)是基于范围的 (for x : y)
返回的实际对象列表,而不是它们的迭代器。您需要使用迭代器来增加从列表中的一个项目移动到下一个项目,因为指针本身可以在内存中的任何位置。