gpt4 book ai didi

c# - 为什么这种碰撞检测方法没有击中所有物体?

转载 作者:行者123 更新时间:2023-11-30 18:07:10 25 4
gpt4 key购买 nike

我目前正在开发一款游戏,玩家可以在其中发射子弹来摧毁小行星。

目前,此碰撞检测代码正在撞击 1 或 2 颗小行星,但并不是屏幕上显示的所有小行星。我认为下面的代码有缺陷,但我不确定在哪里。

public void CollisionDetection()
{
for (int i = 0; i < ship.bullets.Count; i++)
{
Rectangle shipRectangle = new Rectangle((int)ship.ShipPosition.X, (int)ship.ShipPosition.Y,
shipTexture.Width, shipTexture.Height);

for (j = 0; j < asteroidPositions.Count; j++)
{
asteroidRectangle = new Rectangle((int)asteroidPositions[j].X, (int)asteroidPositions[j].Y,
asteroidTexture.Width, asteroidTexture.Height);

Vector2 position1 = asteroidPositions[j];
Vector2 position2 = ship.bullets[i];

float Cathetus1 = Math.Abs(position1.X - position2.X);
float Cathetus2 = Math.Abs(position1.Y - position2.Y);

Cathetus1 *= Cathetus1;
Cathetus2 *= Cathetus2;

distance = (float)Math.Sqrt(Cathetus1 + Cathetus2);

if ((int)distance < asteroidTexture.Width)
{
score += 20;
asteroidPositions.RemoveAt(j);
j--;
}
}
if (shipRectangle.Intersects(asteroidRectangle))
{
lives--;
asteroidPositions.RemoveAt(j);
}

if (lives == 0)
Exit();
}
}

最佳答案

我认为您的某些代码有误。如果 Y 距离小于宽度 并且 X 距离小于高度,那么您只需在距离比较期间将 X 轴和 Y 轴分开即可。

我假设位置是对象的中间,否则算法会复杂得多。我还假设子弹几乎没有大小,x.axis 是宽度,y.axis 是高度。没有看到其余的代码,很难说 ;-)

我的建议:

Vector2 asteroidPosition = asteroidPositions[j];
Vector2 shipPosotion = ship.bullets[i];

float distanceX = Math.Abs(asteroidPosition.X - shipPosotion.X);
float distanceY = Math.Abs(asteroidPosition.Y - shipPosotion.Y);

if ((int)distanceX < asteroidTexture.Width and (int)distanceY < asteroidTexture.Height )
{
score += 20;
asteroidPositions.RemoveAt(j);
j--;
}

这段代码根本没有经过测试,我什至不知道这实际上是哪种语言。所以就把它当作灵感吧。希望一切顺利。

P.S.:如果你有兴趣,我可以把我前一段时间研究的小行星射击游戏的源代码发给你......

关于c# - 为什么这种碰撞检测方法没有击中所有物体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188439/

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