This is a discussion on HitTest con Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Il caro buon vecchio metodo hitTest ? E' stato rimosso, o per meglio dire è stato diviso in 2 separati metodi che ...
Il caro buon vecchio metodo hitTest ? E' stato rimosso, o per meglio dire è stato diviso in 2 separati metodi che si chiamano HitTestObject e hitTestPoint.
L' utilizzo di questi metodi non è molto diverso dal vecchio hitTest.
Vediamo come funzionano...
La Document Class che ho creato è questa:
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
public class ProvaNuovoHitTest extends MovieClip
{
public function ProvaNuovoHitTest()
{
primoCaso();
secondoCaso();
}
private function primoCaso():void
{
black_mc.addEventListener(Event.ENTER_FRAME,controllaMouse);
}
private function controllaMouse(e:Event):void
{
if(black_mc.hitTestPoint(mouseX,mouseY,true))
debug_0_txt.text='si';
else
debug_0_txt.text='no';
}
private function secondoCaso():void
{
circle_1_mc.buttonMode=true;
circle_1_mc.addEventListener(MouseEvent.MOUSE_DOWN,sposta);
circle_1_mc.addEventListener(MouseEvent.MOUSE_UP,ferma);
}
private function sposta(m:MouseEvent):void
{
circle_1_mc.startDrag(true);
circle_1_mc.addEventListener(Event.ENTER_FRAME,controllaContatto);
}
private function controllaContatto(e:Event):void
{
if(circle_1_mc.hitTestObject(circle_0_mc))
debug_1_txt.text='si';
else
debug_1_txt.text='no';
}
private function ferma(m:MouseEvent):void
{
circle_1_mc.stopDrag();
circle_1_mc.removeEventListener(Event.ENTER_FRAME,controllaContatto);
}
}
}
Risultato:
Analizziamo il codice:
nel primoCaso ( metodo ) lo script controlla sotto evento ENTER_FRAME se la clip collide con il mouse.
In questo caso utilizzo il metodo hitTestPoint che ' vuole ' 3 parametri:
-x del punto
-y del punto
-forma: è un valore boolean ( true/false ) con il quale si può decidere se applicare hitTestPoint solo alla reale sagoma della forma dell' oggetto oppure al suo bounding box.
Invito a provare di cambiare quel valore per poter capire meglio se qualcuno avesse dei dubbi :)
Nel secondoCaso ( metodo ) controllo se la MovieClip rossa ( che è trascinabile ) collide con quella blu utilizzando il metodo hitTestObject che vuole un solo parametro ( appunto l' oggetto di cui si vuole verificare la collisione ).
Con il metodo hitTestObject non è possibile scegliere se appilcarlo alla reale forma oppure albounding box. Per fare ciò ci sono altre maniere e richiedono un livello molto avanzato di Actionscript e di trigonometria ( lo vedremo più avanti ).
Salve a tutti. Mi ricollego a questo topic per un piccolo problema riguardo la funzione hitTest.
Sto provando a realizzare un semplice platform game e utilizzo dunque la funzione hitTest per controllare quando il mio personaggio tocca o meno il terreno.
Ho dunque inserito nel mio livello un movieclip chiamato Omino e un movieclip chiamato Terreno.
Con la funzione:
Code:
Omino.hitTestObject(Terreno)
riesco a vedere effettivamente se il mio omino tocca il terreno.
Il problema sorge però se voglio modificare il terreno e renderlo da piatto (ho usato inizialmente un semplice rettangolo) a qualcosa di più complesso (ad esempio una sporgenza o una buca). In questo caso hitTest funziona, ma restituisce true se l'oggetto Omino ha la X uguale alla sporgenza più alta del Terreno. In pratica, viene restituito true se l'oggetto Omino entra in contatto con l'oggetto Terreno, indipendentemente dalla sua forma, ma solo dalla sua 'altezza' massima.
(Nell'allegato trovate un esempio di omino su buca: come si può vedere, viene considerata l'altezza del Terreno e non l'effettiva forma)
Come è possibile rimediare?