使用相交与精灵碰撞

时间:2018-01-20 23:07:43

标签: c# xna

我正在为XNA做一个游戏任务,我正试图找出当他走进一个岩石精灵时,如何使用带有相交的if语句来停止我的玩家精灵。当他走进岩石精灵时,我已经尝试将玩家速度设置为0,但随后他陷入了他的位置,无法移动。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

如果不仔细查看代码,很难弄清问题是什么,但从你所说的我认为这可能是原因:

假设更新

int speed = 0;
Vector2 pos;
protected override void Update(GameTime gameTime)
{
    if (Keyboard.GetState().IsKeyDown(Keys.Escape))
    {
        Exit();
    }
    k = Keyboard.GetState();        // Get New States
    m = Mouse.GetState();
    speed = 0;                      // Reset Speed

    if(k.IsKeyDown(Keys.D)) 
    {
        speed = 3; 
    }
    // Similar code for A (but negative)

    if(Collides(pos, rockPos)) // whatever your intersect condition is
    {
        speed = 0;
    }
    pos.x += speed;
    base.Update(gameTime);
}

上述代码的问题是,您在与rock对象发生碰撞后将速度设置为0 。如果是这种情况,一旦用户与岩石发生碰撞,即使他们试图退出岩石,您的代码也会将其检测为碰撞,并让他们陷入困境!

要解决这个问题,我们会检查玩家是否会在之前碰撞我们将它们移动到新位置:

Vector2 futurePos = pos;
futurePos.x += speed;
if(Collides(futurePos, rockPos))
{
    speed = 0;  // Will set speed to 0 BEFORE collision 
}

pos.x += speed;