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 运动代码是这样的:
计算我们需要移动到的下一个磁贴。
使我们的方向变量查看此磁贴。
圆形,因此方向始终为整数,以避免浮点数的生涩移动。
我用来舍入的代码是这样的:
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 可以运行的最大速度。
-
如果当前动画处于空闲状态,并且我们想更改为运动动画,请立即更改
-
否则,如果我们在运动动画中,请保持此动画,除非我们的速度超过我们想要更改的方向的 maxSpeed * .8f。
如果等到速度达到 maxSpeed 时,动画更改看起来会延迟,但如果将该范围设置得太低,它将无法捕获所有突然的变化。 .8f 在我的情况下工作正常。
到目前为止,我还没有遇到任何问题...手指交叉这成功了!