2013-09-22 4 views
0

Я работаю над игрой 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, как это:

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

Я пытался выяснить, как подойти к этому проблема, и я ударил стену .... мне нужно реализовать какой-то тип гистерезиса анимации, чтобы избежать изменения анимации так быстро? Или эта проблема глубже в том, как я делаю AI движением?

Заранее благодарен!

ответ

0

Хорошо, я открыт, если у кого есть идея получше, но мое решение до сих пор это:

  1. магазин переменная, которая держит MAXSPEED ИИ может работать.

  2. Если текущая анимация находится в режиме ожидания, и мы хотим изменить к анимации движения, немедленно изменить

  3. В противном случае, если мы в анимации движения, остаться в этой анимации, если наша скорость не превышает MAXSPEED *. 8f в том направлении, которое мы хотим изменить.

Если вы будете ждать, пока скорость не достигнет MAXSPEED изменения анимации выглядит задержку, но если вы установите этот диапазон слишком низко он не ловит все внезапные изменения. .8f отлично работает в моем случае.

У меня пока не было никаких проблем ... пальцы скрещены, это делало трюк!