Ruota l'oggetto per affrontare il giocatore


8

Questa è probabilmente una semplice domanda vettoriale, ma non sono sicuro di come farlo.

Ho un oggetto in posizione vettoriale (ox,oy). Potenzialmente ad ogni aggiornamento, l'utente cammina sullo schermo e sarà in posizione (px,py)in qualsiasi momento. Come lo faccio in modo che l'oggetto sia sempre rivolto verso il giocatore? Ho bisogno di ottenere l'angolo in gradi.

Questo è ciò con cui ho scherzato, ma la direzione non indica immediatamente dove si trova l'utente. Invece, aumenta lentamente nella direzione in cui l'utente sta camminando.

 objVec.Normalize(); 
 playerVec.Normalize();

 obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));

Potrei sbagliarmi completamente, quindi ogni aiuto è apprezzato!


Risposte:


13

Pensa diversamente al problema. Vuoi obiettare sempre per "affrontare" il giocatore, il che significa che vuoi che il suo vettore "in avanti" venga ruotato attorno per essere parallelo al vettore da se stesso al giocatore. Supponendo che il suo vettore "in avanti" sia normalmente in corrispondenza obj.Rotation = 0, la rotazione corretta è sostanzialmente l'arcotangente Vector2.Subtract(playerPos, objectPos). La maggior parte delle biblioteche matematiche avrà qualcosa del genere atan2che richiede due argomenti o uno Vector2che automaticamente determinerà il quadrante giusto per te.

EDIT: mi sono reso conto che sei in C # e queste sono in realtà classi integrate. Quindi non devi andare a caccia della documentazione della biblioteca matematica, posso farlo per te. Il codice giusto dovrebbe essere:

Vector2 facingVec = playerVec - objVec;
obj.Rotation = MathHelper.ToDegrees((float)Math.Atan2(facingVec.Y, facingVec.X));

Notare l'inversione X / Y; per l'uva passa isterica, Atan2 ha sempre gli argomenti invertiti.


Grazie, funziona. Penso di averlo provato prima, ma una volta rimossa la normalizzazione, ha funzionato.
XSL

1
È allettante tentare di normalizzare ogni vettore che incontri, ma non è sempre una buona idea. Vuoi assicurarti di mantenere chiara la differenza tra una posizione e una direzione; le direzioni possono essere tranquillamente normalizzate, ma le posizioni non dovrebbero mai esserlo. In questo caso objVec e playerVec sono chiaramente le posizioni delle rispettive entità e non dovrebbero mai essere normalizzate.
Paul Z,

9
Chi sono queste uvette isteriche di cui parli? Sono deliziosi?
Olhovsky,
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.