2017-01-18 5 views
1

Ich bin neu, damit nicht ganz sicher, ob ich das richtig poste, aber ich habe ein paar Probleme bei der Erstellung meines Spiels. Mein Hauptziel ist es, ein Topdown-Shooter-Stil-Spiel zu erstellen, das eine Bewegung verwendet, bei der sich der "Spieler" basierend auf der aktuellen Position der Maus dreht und "w" drücken kann, um sich mit einer festgelegten Geschwindigkeit darauf zu bewegen.Aktualisierung der Textur während der Bewegung

Das Hauptproblem ist, wenn das Spiel lädt, funktioniert die Bewegung genau, wie ich es will, aber die Textur selbst bewegt sich nicht, sondern nur die 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; 
     } 

Dies ist der Hauptbewegungscode aus der Funktion aktualisieren sowie wo hat der neue Spieler erstellt.

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

} 

Ich weiß nicht, was in der Update-Funktion der player.cs enthalten, ob der Code für die Bewegung dort oder die Haupt Game1.cs gehen sollte.

Hoffentlich ist dies genug Code für Sie, um zu helfen. Es tut mir leid, dass es ziemlich viel Code gibt, aber ich bin mir nicht sicher, wo der Fehler auftritt.

Vielen Dank im Voraus

+0

Mosty, ich benutzte 'SpriteBatch.Draw-Methode (Texture2D, Vector2, Rectangle, Color)' um Sprite an Position zu zeichnen. Wo Vektor2 Position ist, und Rechteck ist Quelle von Textur. –

Antwort

0

Für die Rotation Sie ‚andere‘ Art von spriteBatch.Draw, verwenden, da die Zeichenfunktion mehr Parameter haben kann als Ihre derzeit verwenden wollen.

Die vollständige Zeichenfunktion ist wie folgt:

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

Wie Sie sehen können, jetzt haben wir einen Parameter für eine Rotation haben, die verwendet werden können. So wird Ihr Code wie folgt aussehen:

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

Was Ihre Frage nach, wo Sie den Code gehen sollte. Es ist gut, sich selbst zu lernen, den Code dorthin zu legen, wo er hingehört, in diesem Fall der Spieler. Denn wenn deine Programme größer werden, wäre es sehr unordentlich, dies auf diese Weise zu tun.

Um die Update-Funktion in Ihrer Player-Klasse aufzurufen, rufen Sie einfach player.Update (gameTime, keyboard, mouse) im Update von Game1 auf.

+0

Danke für die Antwort, es hat mir definitiv geholfen, den Unterricht etwas besser zu verstehen. Die einzige andere Sache, auf die ich noch etwas verwirrt bin, ist, dass ich weiß, dass ich den Bewegungscode innerhalb der Update-Funktion der Klasse setzen würde, aber wie würde es seinen aktuellen Standort bekommen, wenn es nur eine Klasse ist? – GBAG1

+0

Nun, Sie verwenden sprite.Position für den Spieler Standort, richtig? Du kannst das nur in deiner Spielerklasse nachholen, da du das Sprite in deiner Spielerklasse initialisierst. Ich denke auch, du denkst ein bisschen falsch, es ist nicht "nur eine Klasse". Klassen können miteinander kommunizieren, was alles zum Programm macht, aber die Dinge organisiert. – J4stM4rt

Verwandte Themen