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
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. –