C# [HELP]Come si calcola la direzione e il verso di uno sprite?

Stato
Discussione chiusa ad ulteriori risposte.
Se stai parlando di 2D, per la direzione e il verso non è necessario alcun calcolo. Ci sarà una classe che rappresenta lo sprite: in un campo di questa classe salvi direzione e verso. Ogni volta che si verifica la condizione di cambiamento della direzione e del verso, cambi il valore di questo campo.
Se stai parlando di 3D (in questo caso non dovresti parlare di sprite ma di "modelli"), si utilizzano le matrici per posizione, verso, direzione, ecc. Dovresti saper lavorare con le matrici.
 
Grazie Jack ... ;D (Ho scritto sprite proprio perché volevo parlare di un'immagine 2D).Però la mia domanda è troppo generale ... . Allora io sto cercando di ruotare l'immagine finché vada verso il cursore (Hai presente Dark Orbit ? Vorrei fare la stessa identica cosa ) . Spero di averti fatto capire , quello che sto cercando :)
 
Non conosco Dark Orbit.
Comunque, lo sprite deve ruotarsi, il metodo Draw della classe SpriteBatch accetta anche in ingresso un parametro di tipo float che rappresenta l'angolo di rotazione. Prima ovviamente dovrai calcolare questo angolo.

P.S.: Ho trovato anche un po' di documentazione che può aiutarti a calcolare l'angolo di rotazione. Comunque è cosa facile: Rotazione di uno sprite
 
Non conosco Dark Orbit.
Comunque, lo sprite deve ruotarsi, il metodo Draw della classe SpriteBatch accetta anche in ingresso un parametro di tipo float che rappresenta l'angolo di rotazione. Prima ovviamente dovrai calcolare questo angolo.

P.S.: Ho trovato anche un po' di documentazione che può aiutarti a calcolare l'angolo di rotazione. Comunque è cosa facile: Rotazione di uno sprite

Non penso che gli vada bene quel parametro. Comunque per trovare il verso ti devi calcolare il delta delle coordinate X e Y tra posizione del mouse e posizione dello sprite (es: se delta x è positivo lo sprite sarà girato verso destra)
 
Non penso che gli vada bene quel parametro. Comunque per trovare il verso ti devi calcolare il delta delle coordinate X e Y tra posizione del mouse e posizione dello sprite (es: se delta x è positivo lo sprite sarà girato verso destra)
Ah bhé sì. Io parlavo della rotazione dell'immagine dello sprite.
Per il movimento deve calcolare il delta delle coordinate (cosa di cui ha bisogno anche se vuole calcolare l'angolo di rotazione dello sprite, visto che la rotazione del suo sprite deve dipendere dalla posizione del mouse) e, fissato a livello di classe un campo velocità di tipo Vector2 e un campo posizione sempre di tipo Vector2, aumentare o diminuire la X o la Y (o entrambi) del campo posizione di un valore pare alla X o alla Y del campo velocità.
 
Non penso che gli vada bene quel parametro. Comunque per trovare il verso ti devi calcolare il delta delle coordinate X e Y tra posizione del mouse e posizione dello sprite (es: se delta x è positivo lo sprite sarà girato verso destra)
Purtroppo questo non funziona :S , ora sto provando la soluzione di speed

---------- Post added at 13:49 ---------- Previous post was at 13:07 ----------

Mi spiego meglio ... , voglio che il verso del mio sprite sarà sempre ruotato verso il mio cursore :)
 
Purtroppo questo non funziona :S , ora sto provando la soluzione di speed
La mia soluzione in fondo è la stessa cosa. Nel primo messaggio ti ho detto come fare per la rotazione dello sprite, nel secondo come muovere lo sprite nella direzione del mouse (se questo ti interessa). Altrimenti, se non devi spostare lo sprite, ti basta calcolare l'angolo di rotazione (sempre sfruttando il delta tra le coordinate) e ruotare lo sprite come spiega MSDN nel link che ti ho passato.
Per calcolare l'angolo di rotazione, puoi fissare (idealmente) un sistema di assi cartesiani con l'origine sullo sprite. Il deltaX e il deltaY delle coordinate del mouse e dello sprite corrisponderanno alle coordinate del mouse nel nuovo sistema di riferimento cartesiano creato.
Poi dando un'occhiata al metodo Draw che serve: SpriteBatch.Draw Method (Texture2D, Rectangle, Nullable<Rectangle>, Color, Single, Vector2, SpriteEffects, Single) si vede la descrizione del parametro rotation:
MSDN ha detto:
Specifies the angle (in radians) to rotate the sprite about its center.
L'angolo deve essere in radianti. Allora prima di tutto calcoliamo il coefficiente angolare (m) della retta passante per lo sprite (origine O) e il mouse (punto A). Possiamo farlo con la formula:
m = (Ya - Yo) / (Xa - Xo) = Ya / Xa
Trovato il coefficiente angolare, basterà calcolare l'arcotangente di questo numero per trovare l'angolo espresso in radianti. Per calcolare l'arcotangente puoi usare: Metodo Math.Atan (System)

Mi spiego meglio ... , voglio che il verso del mio sprite sarà sempre ruotato verso il mio cursore :)
Perfetto: fai come ti ho spiegato ora qui sopra :)
 
Ultima modifica:
Supponiamo che:
X1 = coordinata X dello sprite
Y1 = coordinata Y dello sprite
X2 = coordinata X del mouse
Y2 = coordinata Y del mouse
(tutte le coordinate sono rispetto al world)

Basta fare:
distX = X2-X1
distY = Y2-Y1
distanza = sqrt(distX^2+distY^2) // teorema di pitagora
if(distanza != 0) // non puoi dividere per 0
{
deltaX = distX / distanza
deltaY = distY / distanza
}
X1 = X1 + (deltaX * costante_di_velocità)
Y1 = Y1 + (deltaY * costante_di_velocità)


PS.
Con questo sposti lo sprite verso il mouse ad una velocità costante.
 
Ultima modifica:
St3ve, da quel che ho capito non vuole muovere lo sprite, ma semplicemente ruotarlo. Ha bisogno quindi di calcolare l'angolo di rotazione in radianti.
guardian2 prova il mio metodo e dicci se sei riuscito ad applicarlo :)
 
Allora sì... coefficiente angolare e arcotangente.
A seconda dal tipo di visuale e dal tipo di oggetto può essere necessario disegnarlo speculare in caso il coefficiente angolare sia negativo, ma vedendo i video di dark orbit suppongo che lui non ne abbia bisogno.
 
  • Mi piace
Reazioni: guardian2
Ultima modifica:
Codice:
            float Ya_Yo = Mouse.GetState().Y - Centro_Imm.Y ;
            float Xa_Xo = Mouse.GetState().X - Centro_Imm.X ;
            double coeff = Ya_Yo / Xa_Xo;
            double arc = Math.Atan(coeff);
            Rotazione = Convert.ToSingle(arc) ;
Va perfetto ;D ;
Questo sopra è il codice :D
Grazie speed +1 :D , anche a Steve +1 ;D
P.S: Solo in pochissime direzioni segue il mouse >.< ...
P.P.S : Sono riuscito a risolverlo il problema :D
Codice:
            float M_A = Mouse.GetState().X - Pos_Cursore.X;
            float M_B = Mouse.GetState().Y - Pos_Cursore.Y;
            Rotazione = (float)Math.Atan2(M_B, M_A) - Errore;
// Se non sbaglio nella rotazione alcune volte fa degli errori 
// Io ho risolto un po a culo , vedendo graficamente quanto è l'errore :)
// L'errore deve essere una variabile float
 
[HELP]Come ottenere la posizione esatta del mouse con una Camera 2D

Perché lo sprite arrivato ad un certo punto seguendo il mouse non riesce più a "seguirlo" .
Come succede nel video che ho fatto.
Errore Gioco - YouTube
 
Re: [HELP]Come ottenere la posizione esatta del mouse con una Camera 2D

Non aprire 1000 discussioni per un problema: unisco le discussioni.
Comunque, è sicuramente un problema dell'algoritmo che usi. Dovresti incollare il codice (se non è lo stesso del messaggio precedente).
 
Ultima modifica:
Edit.
P.S Ho risolto l'errore ... forse farò un post su questa cosa :) (Cercherò di spiegare quello che ho capito su questi Matrix e Vector2D
 
Stato
Discussione chiusa ad ulteriori risposte.