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