|
Forum Flash, Actionscript, PHP e MySQL
|
|
|
|
|
|
| Autore |
Messaggio |
LeeFX
principiante

Registrato: 18/10/09 08:32
Messaggi: 35
|
Oggetto: Hit Test "intelligente" (CS 4, AS 2.0)
Inviato: 22.02.10 | 23:23 |
|
|
Salve,
sto cercando un modo per fare un hit test "intelligente".
Mi spiego:
http://www.swfcabin.com/open/1266870676
Usando la funzione hitTest () e trascinando il cerchio, il triangolo o la stella sul quadrato "HIT ME", posso solo sapere se il quadrato è stato colpito da qualcosa ( hitTest ritorna true o false), ma non da cosa.
A me serve una funzione che mi dica non solo se sono stato toccato, ma anche da cosa.
Come posso fare?
NOTA:
Lo so che nell'esempio specifico, potrei lavorare direttamente sul cerchio, stella o triangolo, in modo che, anzichè fare uscire l' "OK!!" mi faccia uscire il suo nome.
Ma questo è solo un esempio. A me serve qualcosa di più generico, perchè lavoro su un gioco in cui una serie di oggetti possono collidere tra loro, e non so a prescindere chi toccherà cosa.
L'ideale inoltre sarebbe avere un array con tutti gli oggetti in cui entro in collisione in un dato momento, ammesso che ce ne sia più di uno. |
|
| Torna in cima |
|
|
Sponsor
|
|
 |
Coach
amministratore


Età: -1981
Registrato: 31/01/03 13:50
Messaggi: 4546
Località: Verona
|
Oggetto:
Inviato: 24.02.10 | 15:55 |
|
|
Ciao LeeFX,
potresti postare del codice commentato, o il sorgente, tanto per vedere cosa stai facendo? ____________________________________________________________
Il Forum è uno strumento di condivisione, oltre a fare DOMANDE, si possono anche dare RISPOSTE! |
|
| Torna in cima |
|
|
LeeFX
principiante

Registrato: 18/10/09 08:32
Messaggi: 35
|
Oggetto:
Inviato: 02.03.10 | 19:48 |
|
|
Link dell'SWF:
http://www.swfcabin.com/open/1266870676
Semplicemente:
| Codice: | //"circle_mc" è il cerchio verde, trascinabile col mouse.
circle_mc.onPress = function() {
this.startDrag();
};
//una volta rilasciato, controlla se tocca "hitMe_mc" (il quadrato rosso al centro)
circle_mc.onRelease = function() {
this.stopDrag();
// se il quadrato rosso viene colpito
if (this.hitTest(hitMe_mc)) {
_root.hitMe_mc.hitMe_txt._visible = false; // cambia solo il testo da "HIT ME"...
_root.hitMe_mc.ok_txt._visible = true; //... a "OK!!"
}
else {
_root.hitMe_mc.ok_txt._visible = false; // o viceversa se non è colpito
_root.hitMe_mc.hitMe_txt._visible = true;
}
}; |
Il codice è ripetuto anche per la stella e il triangolo, ma questo è solo in questo esempio.
NOTA: nell'esempio l'hitTest è fatto una volta rilasciata una forma.
Nel mio caso però, le forme "vanno in giro da solo" per lo schermo, e devo fare un hitTest ad ogni frame.
Per risolvere il problema,
per ora mi sto arrangiando con un sistema di "hitPoint" e "shape" (forma) toccabili tra di loro.
Ogni hitPoint è un movieclip vuoto, figlio del movieclip shape,
e serve per delimitare i "punti sensibili" della forma.
Cosicchè, ad esempio, la shape del triangolo è circondata da un hitPoint per ogni angolo.
È un sistema necessario, perchè le coordinate x/y dei singoli hitPoint permettono di fare un test sulla sagoma effettiva delle altre forme, e non grossolanamente sul loro bounding box (vedi funzionamento di hitTest());
Da qui,
ogni forma ha un enterFrame per verificare, ad ogni ciclo, se tocca uno degli hitPoint di tutte le altre.
Una volta toccato un hitPoint, determino chi tocca chi, tramite
shape._name
e
hitPoint._parent._name
...
Bene,
questo mi risolve il problema iniziale (sapere chi tocca cosa)... peccato che sia troppo dispendioso.
Perchè all'aumentare delle forme in gioco, aumentano esponenzialmente gli hitPoint, e non solo ogni forma deve fare, ad ogni frame, un controllo su tutti gli hitPoint, ma i singoli hitPoint stessi hanno un enterFrame per aggiornare le loro coordinate, e convertirle da locali a globali (vedi localToGlobal());
Trattandosi di un gioco con delle routine relativamente pesanti, come il pathfinding e un po' di IA, non è un lusso che posso permettermi...
Speravo allora di ottimizzare con un sistema di Listening, ma non c'ho mai capito molto sull'argomento
P.S.: Scusa se rispondo dopo quasi un mese, non mi sono arrivate le notifiche di risposta. |
|
| Torna in cima |
|
|
|
|
Non puoi inserire nuovi Topic in questo forum Non puoi rispondere ai Topic in questo forum Non puoi modificare i tuoi messaggi in questo forum Non puoi cancellare i tuoi messaggi in questo forum Non puoi votare nei sondaggi in questo forum Non puoi allegare files in questo forum Puoi downloadare gli allegati in questo forum
|
|