2D动画状态闪烁

时间:2013-09-22 17:44:53

标签: c# animation xna 2d

我正在开发一款2.5D游戏(想想自上而下的地下城爬行器/侧视图,比如Isaac的Binding),角色可以在所有八个方向上行走。播放器动画工作正常,但AI动画在运动状态之间一直闪烁。 AI根据其方向移动并选择动画:

//Select which animation we should currently be in:

if (velocity != Vector2.Zero)
{
    if (direction.X < 0 && direction.Y < 0 && currentAnimation.name != "Walk Up Left")
        ChangeAnimation(Animations.WalkUpLeft);
    else if (direction.X > 0 && direction.Y < 0 && currentAnimation.name != "Walk Up Right")
        ChangeAnimation(Animations.WalkUpRight);
    else if (direction.X < 0 && direction.Y > 0 && currentAnimation.name != "Walk Down Left")
        ChangeAnimation(Animations.WalkDownLeft);
    else if (direction.X > 0 && direction.Y > 0 && currentAnimation.name != "Walk Down Right")
        ChangeAnimation(Animations.WalkDownRight);
    else if (direction.X < 0 && direction.Y == 0 && currentAnimation.name != "Walk Left")
        ChangeAnimation(Animations.WalkLeft);
    else if (direction.X > 0 && direction.Y == 0 && currentAnimation.name != "Walk Right")
        ChangeAnimation(Animations.WalkRight);
    else if (direction.Y > 0 && direction.X == 0 && currentAnimation.name != "Walk Down")
        ChangeAnimation(Animations.WalkDown);
    else if (direction.Y < 0 && direction.X == 0 && currentAnimation.name != "Walk Up")
        ChangeAnimation(Animations.WalkUp);
}
else if (velocity == Vector2.Zero)
{
    if (currentAnimation.name != "Idle")
        ChangeAnimation(Animations.Idle);
}

问题在于,人工智能必须沿对角线方向移动,并且在这样做之后,他将直接向下移动几帧以纠正自己,这样他就完全在网格上...这只是几帧所以从视觉上看,它在两个方向之间看起来非常微不足道。

方向变量从不具有浮点值... AI移动代码如下:

  
      
  1. 计算我们需要移动的下一个图块。

  2.   
  3. 让我们的方向变量看一下这个图块。

  4.   
  5. 舍入所以方向总是一个整数,以避免浮点数的抖动。

  6.   

我用来舍入的代码是:

private void TrimDirection()
{
    //Snap our direction to one of the eight cardinal directions:
    direction.X = (float)Math.Round(MathHelper.PiOver4 * (float)Math.Round(direction.X / MathHelper.PiOver4));
    direction.Y = (float)Math.Round(MathHelper.PiOver4 * (float)Math.Round(direction.Y / MathHelper.PiOver4));
}

运动代码是这样的:

if (direction.X > 0)
    MoveRight();
else if (direction.X < 0)
    MoveLeft();

if (direction.Y > 0)
    MoveDown();
else if (direction.Y < 0)
    MoveUp();

我一直在试图弄清楚如何处理这个问题而且我已经碰壁了......我是否需要实现某种类型的动画滞后以避免动画变化这么快?或者这个问题在我如何让AI移动的过程中更深层次?

提前致谢!

1 个答案:

答案 0 :(得分:0)

好吧,如果有人有更好的想法我是开放的,但到目前为止我的解决方案是:

  1. 存储一个包含AI可以运行的maxSpeed的变量。

  2. 如果当前动画处于空闲状态且我们想要更改为动画动画,请立即更改

  3. 否则,如果我们处于动画动画中,请保留此动画,除非我们的速度超出我们想要更改的方向的maxSpeed * .8f。

  4. 如果等到速度达到maxSpeed,则动画更改看起来会延迟,但如果将该范围设置得太低,则无法捕捉到所有突然变化。 .8f在我的情况下工作正常。

    到目前为止我没有遇到任何问题......手指越过这个就行了!