Я работаю над игрой 2.5D (думаю, сверху вниз подземелье гусениц/боковой вид, как привязка Исаака), где персонажи могут ходить во всех восьми направлениях. Анимация игроков отлично работает, но анимация AI немного мерцает между состояниями движения. AI движется и выбирает анимацию на основе его направления:2D Анимация Состояние Flicker
//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 движением?
Заранее благодарен!