某些边界的边界框碰撞

时间:2013-07-08 17:31:43

标签: c# xna

我有一个玩家精灵和一个尖刺精灵。穗状花序面朝下并且与玩家一起处于头部水平。我已经设置好了,如果玩家矩形的右侧进入长钉的矩形,它就会停止移动。但是,我想这样设置 -

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

然而,这不起作用。玩家可以继续经过它。我能让它发挥作用的唯一方法就是我这样做 -

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

为了澄清,spikesRect.Left值是350.我想要它,如果playerRect.Right等于349,则停止向右移动。感谢您的帮助,非常感谢。

3 个答案:

答案 0 :(得分:0)

如果您只想进行基本碰撞,请使用:

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

对于不同方向的速度,我建议使用速度和方向变量而不是不同的变量,这意味着如果您希望角色改变速度或方向,您只需要更改一个变量。

答案 1 :(得分:0)

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

虽然您应该对游戏进行一些更改。首先,您应该在PlayerTexture类中为Spike类创建公共字段,然后创建另一个类型为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;
}

答案 2 :(得分:0)

主要的问题是,当你的玩家正在移动时,它并不总是会在现场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的位置。这样它就不会看起来你的玩家正在穿透尖刺。