2013-04-18 2 views
0

Я искал учебник о том, как это сделать правильно, и Google продолжает оставаться пустым. Может быть, это очень простой предмет, но я не уверен, что делать.Поверните плеер в XNA

То, что я нашел до сих пор дает мне код, который выглядит следующим образом:

 if (currentKeyboardState.IsKeyDown(Keys.A)) 
     { 
      RotationAngle += 0.01f; 
      float circle = MathHelper.Pi * 2; 
      RotationAngle = RotationAngle % circle; 
     } 

Только, это не делает много. Он исходил от MSDN. Это было лучшее решение, которое я мог найти.

Все, что я хочу сделать, это позволить игроку вращаться вокруг корабля и стрелять в другом направлении. Я делаю игру, которая имеет справедливое сходство с астероидами, но я могу снимать только в одном направлении.

Любая помощь будет оценена :)

Edit: Это мои текущие Player.cs:

using System; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 

namespace GameTest 
{ 
    class Player 
    { 
     public Texture2D PlayerTexture; 
     public Vector2 Position; 
     public bool Alive; 
     public int Health; 
     public Vector2 origin; 
     public float RotationAngle; 
     KeyboardState currentKeyboardState; 
     KeyboardState previousKeyboardState; 
     public int Width 
     { 
      get { return PlayerTexture.Width; } 
     } 
     public int Height 
     { 
      get { return PlayerTexture.Height; } 
     } 


     public void Initialize(Texture2D texture, Vector2 position) 
     { 
      PlayerTexture = texture; 

      Position = position; 

      Alive = true; 

      Health = 10; 

      origin.X = PlayerTexture.Width/2; 
      origin.Y = PlayerTexture.Height/2; 
     } 

     public void Update(GameTime gameTime) 
     { 
      RotationAngle += 10f; 

      previousKeyboardState = currentKeyboardState; 
      currentKeyboardState = Keyboard.GetState(); 

      float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; 

      if (currentKeyboardState.IsKeyDown(Keys.A)) 
      { 

       //float circle = MathHelper.Pi * 2; 
       //RotationAngle = RotationAngle % circle; 
      } 

      if (currentKeyboardState.IsKeyDown(Keys.D)) 
      { 
       //rotation 
      } 
     } 

     public void Draw(SpriteBatch spriteBatch) 
     { 
      spriteBatch.Draw(PlayerTexture, Position, null, Color.White, RotationAngle, origin, 1f, SpriteEffects.None, 0f); 
     } 
    } 
} 
+0

Используете ли вы этот «RotationAngle» при рисовании спрайта на экране? Я уверен, что «SpriteBatch» имеет перегрузки, которые могут или не требуют поворота. – Nolonar

+0

Что вы подразумеваете под словом «это не так много»? Прокручивается ли игрок? Вам теперь нужно разобраться, как стрелять под углом, например? –

+0

Я использую его в 'SpriteBatch', да. И я имею в виду, что он не вращает спрайт вообще, он ничего не делает на данный момент. –

ответ

0

Моя догадка вам не хватает 'происхождение', или центр вращения:

RotationAngle += .5f; 
float circle = MathHelper.Pi * 2; 
RotationAngle = RotationAngle % circle; 

Vector2 origin = new Vector2(texture.Width/2, texure.Height/2); 

spriteBatch.Draw(texture, position, null, Color.White, RotationAngle, origin, 1.0f, SpriteEffects.None, 0f); 

Что касается угла вы хотите, чтобы стрелять, вы будете нуждаться в некоторой геометрии (что-то вроде этого, не проверял ... но если я правильно помню):

Vector2 velocity = new Vector2(speed*Math.Cos(RotationAngle), speed*Math.Sin(RotationAngle)); 

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

+0

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

+0

Я изменил «RotationAngle» до 30f, и он отлично повернул корабль. Я не знаю, как остановить код от поворота корабля. –

+0

Хм ... Попробуйте изменить угол поворота в основном методе обновления, поэтому он обновляется при каждом вызове (без необходимости нажатия кнопки, я имею в виду), и скажите мне что происходит. – Colton

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