某些边上的边界框碰撞

本文关键字:边界 碰撞 | 更新日期: 2023-09-27 18:21:36

我有一个玩家精灵和一个尖刺精灵。尖刺朝下,与球员头部齐平。我已经设置好了,如果球员矩形的右侧进入扣球的矩形,它就会停止移动。然而,我想把它设置成这样-

if (playerRect.Right == spikesRect.Left - 1)
{
    speedRight = 0;
}

然而,这是行不通的。玩家可以继续通过它。我能让它工作的唯一方法是如果我这样做-

if (playerRect.Right > spikesRect.Left)
{
    speedRight = 0;
}

为了澄清,spikesRect.Left的值为350。我希望这样,如果playerRect.Right等于349,停止向右移动。谢谢你的帮助,非常感谢。

某些边上的边界框碰撞

如果您只想要一个基本的冲突,请使用:

if(playerRect.Intersects(spikesRect))
{
//handle collision
}

我建议使用速度和方向变量,而不是针对不同方向的速度使用不同的变量,这意味着如果你想让你的角色改变速度或方向,你只需要改变一个变量。

主要问题是,当玩家移动时,它并不总是会降落在349点。随着它的移动,它可能从348移动到350。因此它永远不会在349时触发。然而,你可以做的是。

int i = spikesRect.Left - playerRect.Right;
if ( i < 0 )
    playerRect.X += i; //playerRect.X can be replaced by a position variable

当它到达点351时。350-351=-1,因为它小于0,所以它将被添加到playerRect.X中,使playerRect.X移回playerRect.Right为350的位置。这样就不会让你的球员看起来像是在突破扣球。

我认为问题是由您在游戏中对speedRightplayerRect所做的一些更改引起的。因此,如果您使用的是VisualStudio,只需设置一个断点并检查speedRightplayerRect的值。

尽管你应该对你的游戏做出一些改变。首先,对于Spike类,您应该在Player类中创建一个类型为Texture的公共字段,然后创建另一个类型Vector2的字段,该字段指示速度和方向:

public class Player{
    public Vector2 DirectionSpeed;
    public Texture2D Texture;
    //...
    public Player(){
        //initialize your fields
    }
}

然后可以使用方法Intersects():来处理冲突

if(player.Texture.Bounds.Intersects(spike.Bounds)){
    player.DirectionSpeed = Vector.Zero;
}

如果您试图处理与多个类型为Spike的对象的冲突,则必须创建一个List<Spike>,然后使用cicle迭代整个列表:

foreach(Spike s in listSpikes){
    if(player.Texture.Bounds.Intersects(s.Bounds)){
        player.DirectionSpeed = Vector.Zero;
    }
}

编辑:

此外,如果speedRight不等于1或spikesRect.Left - 1的约数,则很明显,随着位置的增加,playerRect.Right超过了spikesRect.Left - 1。解决方案可能是:

if (playerRect.Right > spikesRect.Left - 1)
{
    playerRect.Location = spikesRect.Left - playerRect.Width - 1;
    speedRight = 0;
}