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