Orario: 19-06-2013, 19:24 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Movimento & Direzione
Autore Messaggio
player931402
gg I won alone

Messaggi: 971
Registrato: Jul 2011
Offline Offline
#1 Movimento & Direzione
0
Salve a tutti belli e brutti! ( Si pure a te yagami )

Ho due piccoli bug mentali e non riesco propio a risolverli!
Ho trovato una decina di metodi ma non mi ispirano piu di tanto, cosi son venuto qua per vedere se qualche mage mi potesse illuminare, dunque:


1) Movimento: il mio metodo, non mi sembra performante, propio per niente:

Nell'update prendo gli input:
Codice:
    if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::W))
        risorse->PlayerMoviment(0);
    if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::A))
        risorse->PlayerMoviment(1);
    if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::S))
        risorse->PlayerMoviment(2);
    if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::D))
        risorse->PlayerMoviment(3);


Gli elaboro:
Codice:
void Risorse::PlayerMoviment(short Direzione)
{
    float deltaT=window->GetFrameTime();
    sf::Vector2f Movimento;

    switch(Direzione)
    {
    case 0:
        Movimento.x=0;
        Movimento.y= - deltaT*player->GetVel();
        break;
    case 1:
        Movimento.x= - deltaT*player->GetVel();
        Movimento.y=0;
        break;
    case 2:
        Movimento.x=0;
        Movimento.y=  deltaT*player->GetVel();
        break;
    case 3:
        Movimento.x=  deltaT*player->GetVel();
        Movimento.y=0;
        break;
    }

    player->Move(Movimento);
}


E Muovo:
Codice:
void Player::Move(sf::Vector2f v)
{
    sprite->Move(v.x,v.y);
}



2) Data la posizione del mio mouse, voglio che il mio sprite sia rivolto con la faccia verso le suddette coordinate, qualcuno ha un buon metodo ? ( Qua non posto codice perchè son sicuro di non aver centrato il punto ! )

Edit: Domanda numero due risolta guardando qua


Grazie in anticipo!

Matteo Galeotti
(Questo messaggio è stato modificato l'ultima volta il: 27-03-2012 15:32 da player931402.)
26-03-2012 22:57
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
cominu
Senior Member

Messaggi: 591
Registrato: Sep 2010
Offline Offline
#2 RE: Movimento & Direzione
0
IMHO, non credo esistano delle tecniche standard per queste cose.
Fosse per me lascerei il codice così com'è ora: a patto che funzioni come si deve non vedo l'utilità di ottimizzarlo adesso. Se proprio devi ottimizzarlo l'unico consiglio che posso darti è quello di usare un profiler per scoprire quali sono le parti realmente "lente"

Più giochi, meno codice! ;-)

Alessandro Cominu [Development blog] [Twitter] [Google+]
26-03-2012 23:23
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
GOO
Cartellonista

Messaggi: 1,358
Registrato: Jul 2010
Offline Offline
#3 RE: Movimento & Direzione
0
Ma più che altro, il player è uno solo quindi non penso che qualche if in più rallenti
irreparabilmente le performances Occhiolino

Comunque, il movimento 2D sembra banale ma non lo è. Molto spesso premendo destra e poi premendo sinistra rimane fermo, mentre facendo il contrario si muove. E' un bug dovuto alla successione degli if vari. Per rendere il tutto perfetto in genere si fa:

1) Un if di key pressed che assegna la direzione al pg.
2) Ogni ciclo in base alla direzione assegnata si aumenta velocità e si muove il personaggio.
3) Se la key corrente è rilasciata, si controllano altre key premute, altrimenti si stoppa.

Mattia Russomando
(Questo messaggio è stato modificato l'ultima volta il: 27-03-2012 0:28 da GOO.)
27-03-2012 0:26
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
kunos
Gatto Incavolato

Messaggi: 2,419
Registrato: Jul 2010
Online Online
#4 RE: Movimento & Direzione
0
Come performances c'e' poco da dire, come eleganza del codice diciamo che e' un disastro.
Primo evidente problema e' la nomenclatura, uno strafalcione dopo l'altro. PlayerMovIment? Asd ma che e' ? Mezzo italiano mezzo inglese. Un bordello, un disastro, illegibile... passiamo al codice vero e proprio

I "numeri magici" vanno evitati come la morte. Magari oggi leggere "risorse->PlayerMoviment(0);" ti e' completamente chiaro, il codice lo hai scritto 10 minuti fa e l'associazione fra lo 0 e il tipo di movimento richiesto e' ancora "calda". Ti assicuro che fra 1 mese leggerai sta cosa e dirai: "che gatzo faceva sto zero qua?" .

Andiamo avanti, perche' per muovere il giocatore devo parlare con risorse? "Risorse" dovrebbe essere un manager no? Un manager gestisce i suoi subalterni, non lavora per loro.. quindi non ha senso dire a Risorse "playerMovement" . Se un giorno devi far sparare il player che fai? Crei una playerShoot dentro manager che chiama "shoot" del player? Sembra assurdo no?
Risorse dovrebbe avere una semplice:

Player& getPlayer();

Fine della sorella. Da li in poi parli con il player.

Una volta preso il player tocca spostarlo. La "Move" come e' adesso va bene, ma IMO ha il problema di delegare il calcolo della quantita' di movimento all'esterno di player. Ci sono molte possibili soluzioni... la prima e' ignorare il problema e fare:

Player& player=risorse->getPlayer();
if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::W))
player.move( Vector2f( 0 , -player.getSpeed() * deltaT));
...

e via discorrendo. E qui hai risolto il problema dei numeri magici. Lo spostamento viene espresso esplicitamente dopo l'if quindi sai esattamente cosa sta facendo quella cosa e come.

Un'altra e' lasciare la logica di movimento a player, indicando a questo solo una direzione di movimento e un deltaT:

Player& player=risorse->getPlayer();
if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::W))
player.moveToDirection( Vector2f( 0 , -1) , deltaT));
...

dove:

void Player::moveToDirection(const Vector2f& dir , float deltaT)
{
sprite->Move( dir.x * speed * deltaT , dir.y * speed * deltaT);
}

Cosi' hai il vantaggio che, se domani vuoi implementare un player che accelera e rallenta, tutta la sua interfaccia resta invariata, e devi cambiare solo moveToDirection.

E per finire, l'ultima soluzione, che e' quella che io uso, che astrae ancora di piu' le interfacce. Ed e' una cosa tipo:

struct PlayerControls
{
PlayerControls()
{
... // INIZIALIZZA TUTTO A ZERO
}
float xAxis; // E' float cosi' puoi supportare i pad analogici e i joystick
float yAxis; // Idem con patate
bool isFiring; // Premuto il pulsante per sparare?
... // TUTTO QUELLO CHE UN PLAYER PUO' ricevere dall'esterno
};

Poi quando gestisci l'input da tastiera:

PlayerControls controls;

if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::W))
controls.yAxis=-1;

if ( sf::Keyboard::IsKeyPressed(sf::Keyboard::A))
controls.xAxis=-1;

... // E VIA COSI' FINO A:

risorse->getPlayer().setControls(controls);

dove setControls non fa altro che farsi una copia dei controls passati.. poi in:

void Player::update(float deltaT)
{
// QUI USO IL MIO STATO DI INPUT PER AGGIORNARE IL MIO STATO
sprite->Move( controls.xAxis * speed * deltaT , contorls.yAxis * speed * deltaT);
}

In questo modo hai sganciato completamente la logica di rilevazione dei controlli da quello che i controlli effettivamente fanno, e ora tutta la logica del funzionamento del player e', correttamente, dentro alla classe player.

e chest'e' zam zam

Stefano Casillo

www.assettocorsa.net
www.netkar-pro.com
Twitter
[Immagine: acsign.jpg]
(Questo messaggio è stato modificato l'ultima volta il: 27-03-2012 9:15 da kunos.)
27-03-2012 9:12
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
player931402
gg I won alone

Messaggi: 971
Registrato: Jul 2011
Offline Offline
#5 RE: Movimento & Direzione
0
(27-03-2012 9:12)kunos ha scritto:  bla bla bla


Grazie mille, tutte cose molto interessanti ( comprese le critiche, lo sò di essere un babbaleo in inglese xD ).
Penso che proverò a inserire la terza soluzione. Grazie infinite ancora, sei di nuovo stato molto d'aiuto: Mi sà propio che per sdebitarmi devo comprare AssettoCorsa quando esce!

Matteo Galeotti
27-03-2012 14:08
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Gabriele
Posting Freak

Messaggi: 4,608
Registrato: Oct 2010
Offline Offline
#6 RE: Movimento & Direzione
0
Player& player=risorse->getPlayer();

se vede che non usate g++ Asd

Gabriele Di Bari
Account G+
Account bitbucket
Account GITHUB
E ricordate: ((VMJava*)(NULL))->~VMJava();
27-03-2012 15:08
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
kunos
Gatto Incavolato

Messaggi: 2,419
Registrato: Jul 2010
Online Online
#7 RE: Movimento & Direzione
0
(27-03-2012 15:08)Gabriele ha scritto:  Player& player=risorse->getPlayer();

se vede che non usate g++ Asd

?
Che fa g++ ?

Stefano Casillo

www.assettocorsa.net
www.netkar-pro.com
Twitter
[Immagine: acsign.jpg]
27-03-2012 15:11
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Gabriele
Posting Freak

Messaggi: 4,608
Registrato: Oct 2010
Offline Offline
#8 RE: Movimento & Direzione
0
(27-03-2012 15:11)kunos ha scritto:  
(27-03-2012 15:08)Gabriele ha scritto:  Player& player=risorse->getPlayer();

se vede che non usate g++ Asd

?
Che fa g++ ?
come dico io, no const not work!
(se non fai riferimenti costanti rompe i maroni)

esempio:

[questo va su g++ e VC9]
Codice:
const Matrix4x4& matrixTMP_model= this->GetMatrix();
        APIRender::SetModelMatrix((Matrix4x4*)(&matrixTMP_model));
[questo va solo su VC9]
Codice:
Matrix4x4& matrixTMP_model= this->GetMatrix();
        APIRender::SetModelMatrix((Matrix4x4*)(&matrixTMP_model));

Gabriele Di Bari
Account G+
Account bitbucket
Account GITHUB
E ricordate: ((VMJava*)(NULL))->~VMJava();
(Questo messaggio è stato modificato l'ultima volta il: 27-03-2012 15:23 da Gabriele.)
27-03-2012 15:20
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: