Mover un sprite en XNA / C #, usando vectores

9

Actualmente estoy estudiando el desarrollo de juegos XNA con el lenguaje C #.

Tengo dos clases: el controlador principal del juego y una clase de "sprite". A continuación se incluye un pseudocódigo básico que espero describa adecuadamente el problema.

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

Básicamente: cuando el usuario hace clic en algún lugar de la ventana del juego, se toman las coordenadas x e y del mouse, y el objeto del juego se moverá hacia esa ubicación durante un período de tiempo.

Bueno ... el código funciona, pero es feo y los objetos no se mueven directamente hacia el objeto (en cambio, es un movimiento diagonal, seguido de un movimiento de un solo eje). Supongo que hay algunas funciones matemáticas que puedo usar, pero honestamente no tengo idea de dónde comenzar. ¿Alguna sugerencia?

Mate
fuente
3
Hola invitado Lo que buscas es la normalización. Lea las respuestas a esta pregunta: gamedev.stackexchange.com/questions/7540/… . Uno ofrece el código que necesita, el segundo explica cómo funciona muy bien.
Notabene
Hola, he mirado el enlace y fue exactamente lo que necesitaba. ¡Gracias!
Matt

Respuestas:

12

Si entiendo su problema correctamente, debería tener una dirección Vector2 que represente la dirección en la que desea moverse dentro de su clase de sprite. Me gusta esto:

public Vector2 Direction { get; set; }

Este es el vector normalizado (lo que significa que tiene una longitud de 1) que muestra hacia dónde desea ir.

Luego, agregue una propiedad de flotación de Velocidad, que dice qué tan rápido debe ir el sprite.

public float Speed { get; set; }

También necesita agregar una función UpdateSprite, entonces, ¿por qué no ponerla dentro de su clase Sprite?

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

Esto actualizará la posición del sprite para que se mueva (multiplicas por los segundos delta para que el sprite se mueva correctamente en computadoras lentas también).

Finalmente, solo establece su propiedad de dirección de esta manera:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();
Jesse Emond
fuente
Tenga en cuenta también que si la longitud del sprite.Direction (antes de la normalización) es menor que algún umbral, su sprite ha llegado.
TreDubZedd
Exactamente, estaba a punto de editar mi publicación, pero supongo que no lo haré. Si no desea que su sprite busque constantemente el objetivo, simplemente configure la Dirección en Vector2.Cero cuando esté lo suficientemente cerca del objetivo.
Jesse Emond el
Muy buena respuesta ... y también me enseñaste sobre el uso de gameTime (para mover sprites a una velocidad adecuada en computadoras más lentas), por lo que dos pájaros de un tiro. Marcaré esta respuesta como aceptada.
Matt
:) Por cierto, personalmente me gusta poner la normalización dentro de mi clase de sprite (dentro de mi función de actualización), para evitar tener que normalizarla constantemente fuera de la clase. También debe asegurarse de que la longitud del vector no sea igual a 0, de lo contrario obtendrá una excepción dividir por 0. Simplemente verifique si Direction.LengthSquared ()> 0 antes de normalizarlo para que sea seguro (longitud al cuadrado para que no tenga que calcular esa costosa función cuadrada;)).
Jesse Emond el
Digamos que estamos usando un IDE diferente que no tenía una función normalizar, ¿cuál sería la ecuación Normalizar?
Asusta el
1

Normalización de Google ... También estoy un poco perdido en esto, pero estoy bastante seguro de que esto ayudará a resolver su problema. Alguien más puede elaborar o refutar mi respuesta, estoy seguro

Editar: podría responder esto mejor, disculpas

Personalmente, siempre miro esta publicación de blog para ayudar con este tipo de problemas: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

Comienza desde cero y es relevante para el desarrollo del juego.

Douglas Rae
fuente
3
Tienes razón, es normalización. Pero siempre es mejor tratar de encontrar una buena respuesta en las preguntas anteriores. Y si está respondiendo, siempre es mejor explicar poco o compartir código o lo que crea que puede ser útil, no solo apunte al google.
Notabene
Debería haber comentado, tienes razón.
Douglas Rae