2D 动画状态闪烁

本文关键字:闪烁 状态 动画 2D | 更新日期: 2023-09-27 18:32:30

我正在开发一款2.5D游戏(想想自上而下的地牢爬行器/侧视图,如《以撒的绑定》(,角色可以向所有八个方向行走。玩家动画工作正常,但 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. 圆形,因此方向始终为整数,以避免浮点数的生涩移动。

我用来舍入的代码是这样的:

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();

我一直在试图弄清楚如何处理这个问题,但我遇到了一堵墙......我是否需要实现某种类型的动画滞后以避免动画变化如此之快?还是这个问题在我如何让人工智能移动的内心深处?

提前感谢!

2D 动画状态闪烁

好吧,如果有人有更好的主意,我愿意,但到目前为止我的解决方案是这样的:

  1. 存储一个变量,该变量保存 AI 可以运行的最大速度。

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

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

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

到目前为止,我还没有遇到任何问题...手指交叉这成功了!