Déplacer un sprite en XNA / C #, en utilisant des vecteurs

9

J'examine actuellement le développement de jeux XNA avec le langage C #.

J'ai deux classes: le gestionnaire de jeu principal et une classe "sprite". Voici un pseudo-code de base qui, je l'espère, décrit correctement le problème.

Game.cs

class game {
  sprite the_sprite;
  void update(time) {
    var mouse = mouse.state
    if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
    this.the_sprite.update(time)
    base.update(time)
  }
}

Sprite.cs

class sprite {
  vector2 location;
  vector2 move_to;
  void moveTo(x, y) { this.move_to = new vector2(x, y) }
  void update(time) {
    if(this.location.x > this.move_to.x /* (or less than) */) {
      // adjust location.x
    }
    if(this.location.y > this.move_to.y /* (or greater than) */) {
      // adjust location.y
    }
  }
}

Fondamentalement: lorsque l'utilisateur clique quelque part dans la fenêtre de jeu, les coordonnées x et y de la souris sont prises et l'objet de jeu se déplace vers cet emplacement sur une période de temps.

Eh bien ... le code fonctionne, mais c'est moche, et les objets ne se déplacent pas directement vers l'objet (à la place, c'est un mouvement diagonal, suivi d'un mouvement à axe unique). Je suppose qu'il y a des fonctions mathématiques que je peux utiliser, mais je n'ai honnêtement aucune idée par où commencer. Aucune suggestion?

Mat
la source
3
Bonjour invité. Que recherchez-vous, c'est la normalisation. Veuillez lire les réponses à cette question: gamedev.stackexchange.com/questions/7540/… . L'un offre le code dont vous avez besoin, le second explique comment il fonctionne très bien.
Notabene
Bonjour, j'ai regardé le lien et c'était exactement ce dont j'avais besoin. Je vous remercie!
Matt

Réponses:

12

Si je comprends bien votre problème, vous devriez simplement avoir une direction Vector2 représentant la direction dans laquelle vous voulez vous déplacer dans votre classe de sprites. Comme ça:

public Vector2 Direction { get; set; }

Il s'agit du vecteur normalisé (ce qui signifie qu'il a une longueur de 1) indiquant où vous voulez aller.

Ensuite, ajoutez une propriété Speed ​​float, qui indique la vitesse à laquelle le sprite doit aller.

public float Speed { get; set; }

Vous devez également ajouter une fonction UpdateSprite, alors pourquoi ne pas la mettre dans votre classe Sprite?

public Update(GameTime gameTime)
{
   Position += Direction * Speed * gameTime.ElapsedGameTime.TotalSeconds;
}

Cela mettra à jour la position du sprite pour le faire bouger (vous multipliez par les secondes delta pour que le sprite se déplace correctement sur les ordinateurs lents également).

Enfin, vous venez de définir votre propriété direction comme ceci:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();
Jesse Emond
la source
Notez également que si la longueur de sprite.Direction (avant normalisation) est inférieure à un certain seuil, votre sprite est arrivé.
TreDubZedd du
Exactement, j'étais sur le point de modifier mon message, mais je suppose que non. Si vous ne voulez pas que votre sprite recherche constamment la cible, définissez simplement la Direction sur Vector2.Zero lorsqu'il est suffisamment proche de la cible.
Jesse Emond
Très bonne réponse ... et vous m'avez également appris l'utilisation de gameTime (pour déplacer les sprites à une vitesse appropriée sur des ordinateurs plus lents), donc deux oiseaux avec une pierre. Je signalerai cette réponse comme acceptée.
Matt
:) Au fait, j'aime personnellement mettre la normalisation dans ma classe sprite (dans ma fonction de mise à jour), pour éviter d'avoir à la normaliser constamment en dehors de la classe. Vous devez également vous assurer que la longueur du vecteur n'est pas égale à 0, sinon vous obtiendrez une exception de division par 0. Vérifiez simplement si Direction.LengthSquared ()> 0 avant de le normaliser pour être sûr (longueur au carré afin que vous n'ayez pas à calculer cette fonction carrée coûteuse;)).
Jesse Emond
Disons que nous utilisons un IDE différent qui n'avait pas de fonction de normalisation, quelle serait l'équation de normalisation?
Spooks
1

Normalisation de Google ... je suis également un peu perdu à ce sujet, mais je suis sûr que cela vous aidera à résoudre votre problème. Quelqu'un d'autre peut élaborer ou réfuter ma réponse, je suis sûr

Edit: je pourrais mieux répondre à cela, excuses

Personnellement, je regarde toujours ce billet de blog pour aider avec ces types de problèmes: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

Il part de zéro et est pertinent pour le développement de jeux.

Douglas Rae
la source
3
Tu as raison, c'est la normalisation. Mais il est toujours préférable d'essayer de trouver une bonne réponse dans les questions précédentes. Et si vous répondez, il est toujours préférable de ne pas expliquer ou de partager du code ou tout ce que vous pensez qui peut être utile, pas seulement de pointer sur Google.
Notabene
J'aurais dû commenter, tu as raison.
Douglas Rae