View Single Post
Old 13-01-2010, 10:42   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Tutto dipende da come l'hai fatto la questione del navigatore si può risolvere con due behavior.

Uno si sveglia alla pressione dei tasti e l'altro gira in continuazione.

Quello che gira controlla la telecamera usando due vettori, uno per la direzione dello spostamento e uno per le rotazioni. Quando la telecamera è ferma i componenti dei due Vector3f valgono zero.

Il behavior che raccoglie l'input AWT e lo trasforma in "segnale" per il thread Java3D altro non fa che modificare i componenti di quei due vettori in accordo alla direzione che l'utente vuole impartire.

Tanto per essere meno astratti, la questione è:

behavior 1: due Vector3f, spostamento e rotazione.

behavior 2: reagisce alla condizione WakeupOnAWTEvent per tasto premuto, tasto rilasciato (e volendo movimento del mouse). Supponiamo che il tasto W significhi avanti e il tasto S indietro. Dirà, nel processStimulus:

se l'evento è W premuto: behavior1.spostamento.z = -1;
se l'evento è W rilasciato: behavior1.spsotamento.z = 0;
se l'evento è S premuto: behavior1.spostamento.z = 1;
se l'evento è S rilasciato: behavior1.spostamento.z = 0;

behavior 1, che nel frattempo gira come un pazzo, dice nel suo processStimulus:

float dz = PLAYER_SPEED * DTIME * spostamento.z;

poi applica dz al gruppo di trasformazione della vista. Il vettore spostamento stabilisce se la vista debba muoversi mantenendo o azzerando il prodotto PLAYER_SPEED * DIME. Nel caso in cui mantenga il prodotto, stabilisce la direzione negandolo o no. Lo stesso vale per lo spostamento lungo gli altri due assi e le rotazioni (tenendo però conto che in caso di rotazione lo spostamento va trasformato con la rotazione prima di essere applicato per mantenere la "direzione di marcia").

Per quanto riguarda la collisione ricordo che puoi usare una libreria per la fisica (tipo JBullet) se non vuoi far da te.
ok, già una cosa in più con 2 behavior, non ci avevo pensato.

per le collisioni non posso collegare il behavior pazzo alla mia mappa per verificare se è in "zona di collisione"?


ti spiego, io creo una matrice di char per creare un laabirinto con una sola uscita, e poi da questa matrice estraggo la mappa 3d, con muri, nemici, e posizione iniziale mia. poi quando vado a creare il mondo, nella cella del muro ci metto un box e così via...ovviamente lo spostamento di una pressione non equivale all'avanzamento di una singola cella, ma ad una frazione.

pensi che questo approccio sia sbagliato?
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso