gpt4 book ai didi

C++ DirectX11 2d 游戏 : Stopping enemy sprites moving over each other?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:08 25 4
gpt4 key购买 nike

我正在使用 IntersectsWith(this->boundingBox)) 方法来检测 Sprite 和玩家之间的碰撞。我想以某种方式能够使用这种方法来检测相互碰撞的敌人 Sprite ,并在它们发生碰撞时确保它们不会相互移动。

所有敌方 Sprite 都跟随玩家。

主游戏.cpp

遍历 vector 中的每个敌人并进行更新循环:

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");
}

这是我之前尝试阻止每个 Sprite 相互移动的方法:

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

然而,这使得每个敌人 Sprite 明显地粘在一起,这看起来不对,这也让他们传送。

有人知道阻止它们相互移动的正确代码吗?谢谢。

最佳答案

当您检测到两个碰撞对象之间的交叉点时,您需要决定如何抵消重叠(我相信您已经明白了)。但是,与简单地将它们“推”到一侧(正如您在代码中所做的那样),如何做到这一点有点棘手。你可能想要做的是对施加的力产生反作用力,可以这么说。基本上,您想要计算最小平移,或需要最少移动量的方向,以使至少一个盒子从另一个盒子移出。

这比简单地“把我放在另一个人的右边(或左边,取决于你如何设置你的坐标,我想)”要复杂一点,这或多或少是你的代码所做的,现在。

对于一个简单的解决方案,只需检查其中一个碰撞器是否更靠近另一个碰撞器的左侧、右侧、顶部或底部。为此,您可以简单地获取碰撞交点位置并检查该点与相对于其中一个碰撞体的最小和最大 x 和 y 坐标之间的相对距离,然后相应地移动一个或两个 Sprite 。

例如:[编辑] 在回顾了我之前对此的回答后,我意识到你需要计算框的重叠,这样可以更容易地完成这一切:

float minX = min(sprite0.boundingBox.maxX, sprite1.boundingBox.maxX);// Minimum of the boxes' right-side points (top right and bottom right) x coordinates
float minY = min(sprite0.boundingBox.maxY, sprite1.boundingBox.maxY);// Minimum of the boxes' top-side points (top left and top right) y coordinates

float maxX = max(sprite0.boundingBox.minX, sprite1.boundingBox.minX);// Maximum of the boxes' left-side points (top left and bottom left) x coordinates
float maxY = max(sprite0.boundingBox.minY, sprite1.boundingBox.minY);// Maximum of the boxes' bottom-side points (bottom left and bottom right) y coordinates

float distHoriz = minX - maxX;// The horizontal intersection distance
float distVert = minY - maxY;// The vertical instersection distance

// If the boxes are overlapping less on the horizontal axis than the vertical axis,
// move one of the sprites (in this case, sprite0) in the opposite direction of the
// x-axis overlap
if(abs(distHoriz) < abs(distVert))
{
sprite0.x -= distHoriz;
}
// Else, move one of the sprites (again, I just decided to use sprite0 here,
// arbitrarily) in the opposite direction of the y-axis overlap
else
{
sprite0.y -= distVert;
}

为了进一步说明(除了评论之外),我们在这里所做的基本上是检查重叠线之间的距离。例如:

Box 0 x-axis  xmin0|------------------|xmax0
Box 1 x-axis xmin1|----------------------|xmax1
|----|<-- Overlap (xmax0 - xmin1)

请注意,用于重叠的两个边界框的最小值是两个最小值(xmin0 和 xmin1)中的最大值,用于重叠的最大值是两个最大值(xmax0 和 xmin1)中的最小值xmax1).

y 轴的计算方式完全相同。一旦我们有了两个轴,我们只需检查哪个轴的绝对值较小(哪个距离较短)并沿着该距离移动以抵消交点。

关于C++ DirectX11 2d 游戏 : Stopping enemy sprites moving over each other?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22871573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com