Spostare uno sprite in XNA / C #, usando i vettori


9

Attualmente sto esaminando lo sviluppo del gioco XNA con il linguaggio C #.

Ho due classi: il gestore del gioco principale e una classe "sprite". Di seguito è riportato uno pseudo-codice di base che spero descriva adeguatamente il 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
    }
  }
}

Fondamentalmente: quando l'utente fa clic da qualche parte nella finestra di gioco, vengono prese le coordinate xey del mouse e l'oggetto di gioco si sposterà verso quella posizione per un periodo di tempo.

Bene ... il codice funziona, ma è brutto e gli oggetti non si muovono direttamente verso l'oggetto (invece, è il movimento diagonale, seguito dal movimento ad asse singolo). Immagino che ci siano alcune funzioni matematiche che posso usare, ma sinceramente non ho idea di dove iniziare. Eventuali suggerimenti?


3
Ciao ospite. Quello che stai cercando è la normalizzazione. Leggi le risposte a questa domanda: gamedev.stackexchange.com/questions/7540/… . Uno offre il codice di cui hai bisogno, il secondo spiega come funziona molto bene.
Notabene,

Ciao, ho guardato il link ed era esattamente quello di cui avevo bisogno. Grazie!
Matt,

Risposte:


12

Se capisco correttamente il tuo problema, dovresti avere solo una direzione Vector2 che rappresenta la direzione in cui vuoi spostarti all'interno della tua classe di sprite. Come questo:

public Vector2 Direction { get; set; }

Questo è il vettore normalizzato (il che significa che ha una lunghezza di 1) che mostra dove vuoi andare.

Quindi, aggiungi una proprietà float Speed, che indica la velocità con cui lo sprite dovrebbe andare.

public float Speed { get; set; }

Devi anche aggiungere una funzione UpdateSprite, quindi perché non inserirla nella tua classe Sprite?

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

Questo aggiornerà la posizione dello sprite per farlo muovere (moltiplichi per i delta secondi in modo che lo sprite si muova correttamente anche su computer lenti).

Infine, hai appena impostato la proprietà direction in questo modo:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();

Nota anche che se la lunghezza di sprite.Direction (prima della normalizzazione) è inferiore a qualche soglia, il tuo sprite è arrivato.
TreDubZedd,

Esattamente, stavo per modificare il mio post, ma credo di no. Se non vuoi che lo sprite cerchi costantemente il bersaglio, imposta la Direzione su Vector2.Zero quando è abbastanza vicino al bersaglio.
Jesse Emond,

Ottima risposta ... e mi hai anche insegnato l'uso di gameTime (per spostare gli sprite a una velocità adeguata su computer più lenti), quindi due uccelli con una fava. Contrassegnerò questa risposta come accettata.
Matt,

:) A proposito, personalmente mi piace inserire la normalizzazione nella mia classe sprite (all'interno della mia funzione di aggiornamento), per evitare di doverla normalizzare costantemente al di fuori della classe. Dovresti anche assicurarti che la lunghezza del vettore non sia uguale a 0, altrimenti otterrai una divisione per 0 eccezione. Controlla se Direction.LengthSquared ()> 0 prima di normalizzarlo per sicurezza (lunghezza al quadrato in modo da non dover calcolare quella costosa funzione quadrata;)).
Jesse Emond,

Diciamo che stiamo usando un IDE diverso che non aveva una funzione di normalizzazione, quale sarebbe l'equazione di normalizzazione?
Spook

2

Normalizzazione di Google ... Sono anche un po 'perso in questo, ma sono abbastanza sicuro che questo aiuterà a risolvere il tuo problema. Qualcun altro può elaborare o confutare la mia risposta, ne sono sicuro

Modifica: potrei rispondere meglio, scuse

Personalmente guardo sempre a questo post sul blog per aiutare con questi tipi di problemi: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

Inizia da zero ed è rilevante per lo sviluppo del gioco.


3
Hai ragione, è normalizzazione. Ma è sempre meglio cercare di trovare una buona risposta nelle domande precedenti. E se stai rispondendo è sempre meglio spiegare o condividere poco il codice o qualunque cosa pensi possa essere utile, non solo puntare a google.
Notabene,

Avrei dovuto commentare, hai ragione.
Douglas Rae,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.