Ho un problema e non ho ancora trovato una soluzione spiegata per fartela confidare nella mente:
Voglio che il mio oggetto esegua una rotazione di base VERSO il cursore del mouse, non il blocco.
So che deve essere abbastanza imbarazzante dal momento che non ci sono molti thread che lo documentano, eppure sto perdendo la testa quando vedo (wantedAngle-object.getRotation())
che raggiunge da -180 a 180 gradi.
Ho provato ad aggiungere / sottrarre 180 o 360 dopo aver calcolato wantedAngle e invertirlo prima di calcolare la direzione di rotazione desiderata con if-statements come
if(wantedAngle<-0){//turn left applying turnSpeed etc}
come esempio
Questo è il codice con cui sono bloccato e faccio test su:
void myObject::stareAtMouse(sf::Vector2i mouseLoc)
{
float dx = rect.getPosition().x - mouseLoc.x;
float dy = rect.getPosition().y - mouseLoc.y;
float wantedAngle = atan2(dy,dx) * 180 / M_PI;
cout<<wantedAngle-rect.getRotation()<<endl; //Prints -180 to 180
}
Per favore dimmi come affrontare questo problema, cus sto perdendo la testa per questo! Ci sono forse diversi modi per risolvere / convertire questo?
Grazie in anticipo e scusa per la domanda noobish
EDIT:
Come pensavo, ero così eccessivamente concentrato su di esso e reso più complicato di quello che era.
Ho creato un offset
prima ma lo ho scambiato per gradi, quindi ovviamente non aveva alcun senso.
Ora ho incrementato il wantedAngle
di 180 dopo la funzione atan2 anche per il campo di gioco per offset
e getRotation()
, quindi ho ottenuto offset
da wantedAngle-object.getRotation()
e poi uso if / else istruzioni if per vedere se offset
è minore di 0 o maggiore di 0 per farla ruotare rispettivamente.
Grazie per le tue risposte finora, hanno aiutato molto!
- > L'unica cosa da sistemare ora è che l'offset si ritira in negativo una volta che il mouse si trova sulla destra dell'oggetto. La rotazione dell'oggetto non sembra influenzare affatto questo problema.
EDIT_2: Ho trovato tutto funzionante ora e posterò il mio codice qui: void Monster :: stareMouse (sf :: Vector2i mouseLoc)
{
float dx = monsterShape.getPosition().x - mouseLoc.x;
float dy = monsterShape.getPosition().y - mouseLoc.y;
float currentAngle = monsterShape.getRotation() / 180 * M_PI;
float wantedAngle = (atan2(dy,dx) * 180 / M_PI)+180;
float monsterAngle = monsterShape.getRotation();
float offset = wantedAngle - monsterAngle;
if(offset<-180)offset+=360;
else if(offset>180)offset-=360;
if(offset<0)monsterShape.rotate(-turnSpeed);
else if(offset>0)monsterShape.rotate(turnSpeed);
sf::Vector2f mover;
if(abs(offset)>30)
{
mover.x = cos(currentAngle)*(speed/3);
mover.y = sin(currentAngle)*(speed/3);
}
else
{
mover.x = cos(currentAngle)*speed;
mover.y = sin(currentAngle)*speed;
}
cout<<offset<<endl;
monsterShape.move(mover);
}
Non ancora formattato bene, ma ho funzionato perfettamente.
if(offset<-180)offset+=360;
else if(offset>180)offset-=360; //Basically going all the way around and stopping
if(offset<0)monsterShape.rotate(-turnSpeed);
else if(offset>0)monsterShape.rotate(turnSpeed); //Rotate in the direction of need
Il risultato è un oggetto in movimento che si muove normalmente mentre il bersaglio si trova all'interno di un cono (30 gradi qui) davanti all'oggetto e una volta fuori dalla "visione", rallenta per rimettere a fuoco il bersaglio che sembra abbastanza realistico. link solo per mostrarti com'è ora:)