2017-01-18 3 views
1

Я новичок в этом, поэтому не совсем уверен, правильно ли я размещаю это, но у меня возникло несколько проблем при создании моей игры. Моя главная цель - создать игровую игру с наивысшей стрельбой, используя движение, где «игрок» вращается на основе текущей позиции мыши и может нажимать «w», чтобы двигаться к нему с заданной скоростью.Обновление текстуры во время движения

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

Game1.cs:

player = new Player(Content, @"graphics\Player1", 500, 500, spritePosition); 
     spritePosition = new Vector2(player.CollisionRectangle.X, player.CollisionRectangle.Y); 

protected override void Update(GameTime gameTime) 
    { 
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 
      Exit(); 
     KeyboardState keyboard = Keyboard.GetState(); 
     MouseState mouse = Mouse.GetState(); 
     IsMouseVisible = true; 

     distance.X = mouse.X - spritePosition.X; 
     distance.Y = mouse.Y - spritePosition.Y; 

     //Works out the rotation depending on how far away mouse is from sprite 
     rotation = (float)Math.Atan2(distance.Y, distance.X); 

     // TODO: Add your update logic here 
     spritePosition = spriteVelocity + spritePosition; 
     spriteOrigin = new Vector2(player.DrawRectangle.X/2, player.DrawRectangle.Y/2); 

     if (Keyboard.GetState().IsKeyDown(Keys.W)) 
     { 
      spriteVelocity.X = (float)Math.Cos(rotation) * tangentialVelocity; 
      spriteVelocity.Y = (float)Math.Sin(rotation) * tangentialVelocity; 
     } 
     else if(spriteVelocity != Vector2.Zero) 
     { 
      Vector2 i = spriteVelocity; 

      spriteVelocity = i -= friction * i; 
     } 

Это основной код движения от функции обновления, а также, где был создан новый игрок.

Player.cs:

class Player 
{ 
    Texture2D sprite; 
    Rectangle drawRectangle; 

    int health = 100; 

    public Player(ContentManager contentManager, string spriteName, int x , int y, Vector2 velocity) 
    { 
     LoadContent(contentManager, spriteName, x, y, velocity); 
    } 

    public Rectangle CollisionRectangle 
    { 
     get { return drawRectangle; } 
    } 

    public Rectangle DrawRectangle 
    { 
     get { return drawRectangle; } 
     set { drawRectangle = value; } 
    } 

    public int Health 
    { 
     get { return health; } 
     set { 
      health = value; 
       if (health <= 0) 
       health = 0; 

      if (health > 100) 
       health = 100; 
      } 
    } 

    public Vector2 Velocity 
    { 
     get { return Velocity; } 
     set { Velocity = value; } 
    } 

    public void Update(GameTime gameTime, KeyboardState keyboard, MouseState mouse) 
    { 

    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(sprite, drawRectangle, Color.White); 
    } 

    private void LoadContent(ContentManager contentManager, string spriteName, int x, int y, Vector2 velocity) 
    { 
     sprite = contentManager.Load<Texture2D>(spriteName); 
     drawRectangle = new Rectangle(x - sprite.Width/2, y - sprite.Height/2, sprite.Width, sprite.Height); 
    } 

} 

я не знаю, что включить в функции обновления из player.cs, является ли код для движения должны идти туда или главный Game1.cs.

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

Заранее спасибо

+0

Мосты, я использовал метод SpriteBatch.Draw (Texture2D, Vector2, Rectangle, Color) 'для рисования спрайта в позиции. Где vector2 - позиция, а прямоугольник - источник текстуры. –

ответ

0

Для вращения вы хотите использовать «другой» вид spriteBatch.Draw, потому что функция Жеребьевка может иметь больше параметров, чем Вы в данный момент используете.

Полнофункциональный ничейный как следует:

SpriteBatch.Draw(Texture2D texture, Vector2 position, Rectangle sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerdepht) 

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

spriteBatch.Draw(sprite, drawRectangle, null, Color.White, rotation, Vector2.Zero, 1, SpriteEffects.None, 0); 

Что касается вашего вопроса для того, где ваш код должен идти. Приятно научиться ставить код, где он принадлежит, в этом случае игрок. Потому что, когда ваши программы станут больше, было бы очень грязно делать это таким образом.

Чтобы вызвать функцию обновления в вашем классе проигрывателя, вы можете просто вызвать player.Update (gameTime, клавиатуру, мышь) в обновлении Game1.

+0

Спасибо за ответ, он определенно помог мне начать понимать классы немного лучше. Единственное, что меня еще немного смущает, это то, что я знаю, что я бы поставил код движения внутри функции обновления класса, но как бы получить его текущее местоположение, если это просто класс? – GBAG1

+0

Ну, вы используете sprite.Position для размещения игроков, не так ли? Вы можете просто получить это в своем игровом классе, так как вы инициализируете спрайт в своем классе игрока. Также я думаю, вы думаете немного неправильно, это не «просто класс». Классы могут связывать друг с другом, что делает все на всей программе, но все организует. – J4stM4rt

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