2014-09-06 4 views
0

Я программирую звездолетную игру и только что закончил часть, которая управляет вращающейся. Я использовал простой if/else-statement, чтобы проверить, должно ли судно вращаться положительно или отрицательно, чтобы как можно быстрее противостоять цели. Но я видел, что значение Rotation-Value может стать отрицательным, а затем корабль вращается в неправильном направлении (он по-прежнему сталкивается с целевой точкой в ​​конце, но это занимает больше времени). Скажите, пожалуйста, что я сделал неправильно :(XNA Отрицательное вращение?

Функцию:

public bool RotateOrMove(Vector2 position) 
    { 
     if (IsRotationg == null) //todo 
     { 
      Vector2 direction = Position - position; 
      direction.Normalize(); 
      FinalRotation = (float)Math.Atan2(-direction.X, direction.Y); 
      IsRotationg = true; 
     } 

     if (Equals(FinalRotation, Rotation)) 
      IsRotationg = false; 

     if (IsRotationg == false) 
     { 
      Position = position; 
      return true; 
     } 
     else 
     { 
      if (FinalRotation >= Rotation) 
      { 
       Rotation += RotationVelocity; 

       if (FinalRotation - Rotation < RotationVelocity) 
       { 
        Rotation = FinalRotation; 
        IsRotationg = false; 
       } 
      } 
      if (FinalRotation < Rotation) 
      { 
       Rotation -= RotationVelocity; 

       if (FinalRotation - Rotation > -RotationVelocity) 
       { 
        Rotation = FinalRotation; 
        IsRotationg = false; 
       } 
      } 


      return false; 
     } 


    } 

Игрока класс владеет Ship Когда игрок нажмите правую кнопку мыши, этот метод будет вызываться один раз за кадр, пока. судно достигает положения, когда курсор указывает на.

if (!Ship.RotateOrMove(Position)) 
       Position -= Velocity; 

Так что, если судно было поворачивать и не мог двигаться, он будет удалять скорость его добавляют непосредственно перед, чтобы гарантировать, что судно не будет двигаться .

Надеюсь, вы поймете мою проблему ^^

+0

ли это вращающееся неправильное направление каждый раз? – bubbinator

+0

@ bubbinator Нет, это редкость. Но это точно, когда корабль указывает на юго-восток, и я хочу превратить его на юго-запад. – Terrenay

ответ

1

Math.Atan2 возвращает значения от -pi до pi.

, чтобы получить плавный поворот вы можете использовать этот код получил от here

private float CurveAngle(float from, float to, float step) 
{ 
if (step == 0) return from; 
if (from == to || step == 1) return to; 

Vector2 fromVector = new Vector2((float)Math.Cos(from), (float)Math.Sin(from)); 
Vector2 toVector = new Vector2((float)Math.Cos(to), (float)Math.Sin(to)); 

Vector2 currentVector = Slerp(fromVector, toVector, step); 

return (float)Math.Atan2(currentVector.Y, currentVector.X); 
} 

private Vector2 Slerp(Vector2 from, Vector2 to, float step) 
{ 
if (step == 0) return from; 
if (from == to || step == 1) return to; 

double theta = Math.Acos(Vector2.Dot(from, to)); 
if (theta == 0) return to; 

double sinTheta = Math.Sin(theta); 
return (float)(Math.Sin((1 - step) * theta)/sinTheta) * from + (float)(Math.Sin(step * theta)/sinTheta) * to; 
} 
+0

Спасибо за ответ :) Но я не понимаю, где мне нужно называть CurveAngle(); ^^ – Terrenay

+0

CruveAngle принимает начальное (от) вращение, окончательное (до) вращение и шаг. Шаг переменной принимает значения от 0 до 1, когда шаг 0 возвращается из угла, когда шаг 1 возвращается к углу, поэтому вам нужно только дать значение для шага от 0 до 1, чтобы получить промежуточные углы – Blau

+0

(Извините за поздний ответ , но я был очень занят в школе и что-то ^^) Да, но я до сих пор не знаю, где я должен ЗВОНОК CurveAngle? – Terrenay

Смежные вопросы