【发布时间】:2014-04-04 19:32:44
【问题描述】:
我正在使用IntersectsWith(this->boundingBox)) 方法来检测精灵和玩家之间的碰撞。我希望能够以某种方式使用这种方法来检测我的敌人精灵相互碰撞,并确保它们不会相互移动。
所有敌方精灵都跟随玩家。
MainGame.cpp
遍历向量中的每个敌人并进行更新循环:
for (auto &enemyMobsObj : this->enemyMobs)
{
enemyMobsObj->Update(tickTotal, tickDelta, timeTotal, timeDelta, windowBounds, this->ship, this->firstBoss,
this->enemyMobs, this->bullets, this->missiles, NULL, "NULL", "NULL");
}
这是我之前尝试阻止每个精灵相互移动的方法:
EnemyMobOne::更新:
int nextEnemy;
for (int i = 0; i < enemyMobOne.size(); i++)
{
nextEnemy = i + 1;
if (nextEnemy < enemyMobOne.size())
{
//Deal with mobs collision
if (enemyMobOne[i].boundingBox.IntersectsWith(enemyMobOne[nextEnemy].boundingBox))
{
enemyMobOne[i].position.x = enemyMobOne[nextEnemy].position.x - enemyMobOne[i].boundingBox.Width;
}
}
}
然而这让每个敌方精灵明显相互粘连,看起来不太对劲,也让他们瞬移。
有人知道阻止它们相互移动的正确代码吗?谢谢。
【问题讨论】:
-
我想当你真正尝试将敌人移向玩家时,最好进行碰撞检查。这样,当它们发生碰撞时,它们只会停留在原地。您的解决方案将敌人置于一个与其上一个位置无关的新位置。此外,如果您在碰撞检查中移动了一个敌人,您将不得不再次检查所有其他碰撞,您可能通过移动敌人创建了一个新的碰撞。这可能导致无限的碰撞。因此,阻止敌人移动要比在敌人移动后重新设置要容易得多。
-
旁注:
this很少需要。如果这是您的编程风格,并且这样对您来说更容易,那很好。但通常您不需要在每个成员前面指定this。它使代码比它必须的要长得多。 -
所以你的意思是当他们碰撞时,阻止敌人的精灵移动?我试过这个,但问题是我需要精灵始终跟随玩家(我游戏的主要部分)。我现在也确实使用 m_ 而不是 this->。我是 C++ 新手,所以这就是我使用 this->. 的原因
-
我不是游戏编程方面的专家,也许其他人有更好的想法。但是当发生碰撞时你想做什么?您不希望它们彼此重叠,因此可能会出现敌人无法移动的情况,因为此时有障碍物阻挡了它。除了完全阻止它们移动之外,您还可以尝试将它们移动到尽可能靠近下一个碰撞的敌人的位置。我在这里看到的主要问题是你总是将
enemy[i]移动到enemy[nextEnemy]的左侧,但是你怎么知道碰撞发生时enemy[i]在哪一侧?