某些边上的边界框碰撞
本文关键字:边界 碰撞 | 更新日期: 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的位置。这样就不会让你的球员看起来像是在突破扣球。
我认为问题是由您在游戏中对speedRight
或playerRect
所做的一些更改引起的。因此,如果您使用的是VisualStudio,只需设置一个断点并检查speedRight
和playerRect
的值。
尽管你应该对你的游戏做出一些改变。首先,对于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;
}