0

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

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

但是,这不起作用。玩家可以继续越过它。我可以让它工作的唯一方法是如果我这样做 -

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

澄清一下,spikesRect.Left 的值为 350。我想要它,以便如果 playerRect.Right 等于 349,停止向右移动。感谢您的帮助,不胜感激。

4

3 回答 3

0

如果您只想要基本的碰撞,请使用:

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

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

于 2013-07-08T17:41:36.653 回答
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 的位置。这样看起来就不会你的球员正在穿透尖峰。

于 2013-07-09T17:50:41.683 回答
0

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

尽管您应该对游戏进行一些更改。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;
}

如果您尝试处理与多个 type 对象的冲突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;
}
于 2013-07-08T18:06:33.980 回答