2017-01-18 2 views
1

Je suis nouveau à ce sujet, donc je ne sais pas si je publie cela correctement, mais j'ai eu quelques problèmes lors de la création de mon jeu. Mon objectif principal est de créer un jeu de style shooter topdown, en utilisant le mouvement où le «joueur» tourne en fonction de la position actuelle de la souris et peut appuyer sur «w» pour se déplacer vers lui à une vitesse définie. Le problème principal est, quand le jeu se charge, le mouvement fonctionne exactement comme je le veux, mais la texture elle-même ne bouge pas, mais seulement le drawRectangle.Mise à jour de la texture pendant le mouvement

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; 
     } 

Ceci est le code principal de mouvement de la fonction de mise à jour ainsi que lorsque le nouveau joueur a été créé.

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

} 

Je ne savais pas quoi inclure dans la fonction de mise à jour des player.cs, si le code pour le mouvement devrait aller là-bas ou la principale Game1.cs.

Espérons que c'est assez de code pour que vous puissiez aider. Désolé pour le fait qu'il y ait pas mal de code, mais je ne sais pas trop où l'erreur se produit.

Merci à l'avance

+0

Tout à fait, j'utilisais 'SpriteBatch.Draw Method (Texture2D, Vector2, Rectangle, Couleur)' pour dessiner sprite à la position. Où vector2 est la position, et rectangle est la source de la texture. –

Répondre

0

Pour la rotation que vous voulez utiliser un « autre » type de spriteBatch.Draw, parce que la fonction de tirage au sort peut avoir plus de paramètres que votre utilisant actuellement.

La fonction complète de tirage est comme suit:

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

Comme vous pouvez le voir, nous avons maintenant un paramètre de rotation qui peut être utilisé. donc votre code ressemblera à quelque chose comme ceci:

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

Quant à votre question où votre code devrait aller. Il est bon d'apprendre à mettre le code là où il appartient, dans ce cas le joueur. Parce que quand vos programmes deviennent plus gros, ce serait très compliqué de le faire de cette façon.

Pour appeler la fonction de mise à jour dans votre classe de joueur, vous pouvez simplement appeler player.Update (gameTime, keyboard, mouse) dans la mise à jour de Game1.

+0

Merci pour la réponse, cela m'a définitivement aidé à commencer à mieux comprendre les cours. La seule autre chose que je suis encore un peu confus est que je sais que je mettrais le code de mouvement dans la fonction de mise à jour de la classe, mais comment pourrait-il obtenir son emplacement actuel si c'est juste une classe? – GBAG1

+0

Eh bien, vous utilisez sprite.Position pour l'emplacement des joueurs, non? Vous pouvez le faire dans votre classe de joueur, puisque vous initialisez le sprite dans votre classe de joueur. Aussi je pense que vous pensez un peu tort, ce n'est pas "juste un cours". Les classes peuvent communiquer entre elles ce qui fait tout sur tout le programme, mais les choses restent organisées. – J4stM4rt