我有一个玩家精灵和一个尖刺精灵。穗状花序面朝下并且与玩家一起处于头部水平。我已经设置好了,如果玩家矩形的右侧进入长钉的矩形,它就会停止移动。但是,我想这样设置 -
if (playerRect.Right == spikesRect.Left - 1)
{
speedRight = 0;
}
然而,这不起作用。玩家可以继续经过它。我能让它发挥作用的唯一方法就是我这样做 -
if (playerRect.Right > spikesRect.Left)
{
speedRight = 0;
}
为了澄清,spikesRect.Left值是350.我想要它,如果playerRect.Right等于349,则停止向右移动。感谢您的帮助,非常感谢。
答案 0 :(得分:0)
如果您只想进行基本碰撞,请使用:
if(playerRect.Intersects(spikesRect))
{
//handle collision
}
对于不同方向的速度,我建议使用速度和方向变量而不是不同的变量,这意味着如果您希望角色改变速度或方向,您只需要更改一个变量。
答案 1 :(得分:0)
我认为问题是由您对游戏中某处的speedRight
或playerRect
所做的某些更改造成的。因此,如果您使用VisualStudio,只需设置断点并检查speedRight
和playerRect
值。
虽然您应该对游戏进行一些更改。首先,您应该在Player
类Texture
类中为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的位置。这样它就不会看起来你的玩家正在穿透尖刺。