我正在开发一款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移动代码如下:
计算我们需要移动的下一个图块。
让我们的方向变量看一下这个图块。
- 醇>
舍入所以方向总是一个整数,以避免浮点数的抖动。
我用来舍入的代码是:
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移动的过程中更深层次?
提前致谢!
答案 0 :(得分:0)
好吧,如果有人有更好的想法我是开放的,但到目前为止我的解决方案是:
存储一个包含AI可以运行的maxSpeed的变量。
如果当前动画处于空闲状态且我们想要更改为动画动画,请立即更改
否则,如果我们处于动画动画中,请保留此动画,除非我们的速度超出我们想要更改的方向的maxSpeed * .8f。
如果等到速度达到maxSpeed,则动画更改看起来会延迟,但如果将该范围设置得太低,则无法捕捉到所有突然变化。 .8f在我的情况下工作正常。
到目前为止我没有遇到任何问题......手指越过这个就行了!