C# 某些边上的边界框碰撞

C# 某些边上的边界框碰撞,c#,xna,C#,Xna,我有一个玩家精灵和一个钉子精灵。钉子正面朝下,与球员头部水平。我已经设置好了,如果玩家矩形的右侧进入钉子矩形,它就会停止移动。但是,我想这样设置它- if (playerRect.Right == spikesRect.Left - 1) { speedRight = 0; } 然而,这是行不通的。玩家可以继续越过它。我能让它工作的唯一方法就是这样做- if (playerRect.Right > spikesRect.Left) { speedRight = 0; }

我有一个玩家精灵和一个钉子精灵。钉子正面朝下,与球员头部水平。我已经设置好了,如果玩家矩形的右侧进入钉子矩形,它就会停止移动。但是,我想这样设置它-

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
}

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

我认为这个问题是由于你在游戏中的某个地方对
speedRight
playerRect
所做的一些改变造成的。因此,如果您使用的是VisualStudio,只需设置一个断点并检查
speedRight
playerRect

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

public class Player{
    public Vector2 DirectionSpeed;
    public Texture2D Texture;
    //...

    public Player(){
        //initialize your fields
    }
}
然后可以使用以下方法处理碰撞:

如果您试图处理与多个类型为
Spike
的对象的碰撞,则必须创建一个
列表
,然后用圆圈迭代整个列表:

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

主要问题是,当你的球员移动时,它并不总是会降落在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
int i=spikesRect.Left-playerRect.Right;
if(i<0)
playerRect.X+=i//playerRect.X可以由位置变量替换

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

这会给他带来和以前一样的问题。他的问题是球员和扣球的照片会重叠,因为只有在球员穿透扣球后才会考虑这种情况。@TheUnrealMegashark请检查我答案的编辑部分,它应该对你有用。是的,这基本上是我在答案上添加的处理器成本更高的实现。仅仅几次扣球不会有什么不同,但是对于数千次扣球,像额外减法这样的小动作可以产生很大的不同。
int i = spikesRect.Left - playerRect.Right;
if ( i < 0 )
    playerRect.X += i; //playerRect.X can be replaced by a position variable