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