XNA - 碰撞永远不会发生

本文关键字:永远 碰撞 XNA | 更新日期: 2023-09-27 18:33:25

我正在XNA中创建游戏,我需要碰撞检测逻辑:

public Rectangle boundingBox = new Rectangle((int)playerShipPos.X, (int)playerShipPos.Y, frameWidth, frameHeight);
this.boundingBox = new Rectangle((int)meteorPosPub.X, (int)meteorPosPub.Y, (int)meteorTexture.Width, (int)meteorTexture.Height);
for (int i = meteorList.Count - 1; i >= 0; i--)
{
    meteorGenerator meteor = new meteorGenerator(Vector2.Zero);
    if (meteorList[i].meteorPosPub.Y > 664)
    {
        meteorList.RemoveAt(i);
        if (meteor.boundingBox.Intersects(playerShip.boundingBox))
        {
            meteorList.RemoveAt(i);
        }
    }
}

所以我想达到这个效果:如果玩家飞船碰到流星,流星就会隐藏并从列表中删除,但实际上什么也没发生。

XNA - 碰撞永远不会发生

for (int i = meteorList.Count - 1; i >= 0; i--)
{
    meteorGenerator meteor = new meteorGenerator(Vector2.Zero);//you are creating new list meteors every frame, this is ridiculous 
    if (meteorList[i].meteorPosPub.Y > 664)
    {
        meteorList.RemoveAt(i);//if you are removing a position from a list, not destroying the meteor
        if (meteor.boundingBox.Intersects(playerShip.boundingBox))
        {
            meteorList.RemoveAt(i);//you already did this, this conditional is unnecessary
        }
    }
}

我不知道你在做什么,但这就是我会做的。

1.让玩家和流星继承具有实体对象属性的类。

  1. 根据对象类型将它们添加到具有唯一 ID 的列表中。

  2. 每一帧,检查 ID(这使您可以额外控制要与什么碰撞的内容)。

  3. 继续检查冲突,如果您想删除元素,只需将其从列表中删除并销毁即可。