Quick Tips: Collision Detection Mellom Circles

Quick Tips: Collision Detection Mellom Circles
5
Del
11
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Collision Detection og Reaction.Quick. Tips: Kollisjon Detection Mellom en sirkel og en linje

Kollisjon påvisning er en gren av algoritmer som sjekker om to figurer lapper. Hvis du bygger fysikk eller actionspill med Actionscript, vil du sikkert ikke unnslippe bekjentskap med dette temaet. Dette er den første av serien av kollisjoner. I denne hurtig Tip, skal vi se på Actioninnebygde kollisjonsdeteksjonsmetode, hitTestObject (), og skrive våre egne for å oppdage overlapping mellom to sirkler.




Forhåndsvisning Endelig resultat

Dette er det siste SWF vi vil skape i denne hurtig Tip. Klikk den blå sirkelen og dra den mot den grønne. Når de overlapper hverandre, vil den grønne sirkelen endre farge; hvis du fjerner den blå sirkelen igjen, vil den andre gå tilbake til å være grønn



Trinn 1:. Markeringsramme Sjekker

De som er kjent med Actionscript 2.0 vil definitivt kjenne metoden, hitTest (). Denne kommandoen sjekker for overlapping mellom to former, eller mellom en form og et enkelt punkt. I Actionscript 3.0 er det delt inn i to separate metoder: hitTestObject () og hitTestPoint ().

Vi skal se på hitTestObject () først. Dette commnad passer generelt dueller for boks-lignende former (firkanter, rektangler). En markeringsrammen er trukket rundt figurer og når disse markeringsbokser overlappe hverandre, hitTestObject () returnerer true.

Sjekk ut eksempelet nedenfor. Dra den blå boksen mot den grønne. Som de overlapper hverandre, mørkner den grønne boksen sin skygge.

Jeg legger her den tilsvarende Action som genererer over presentasjonen. Box er en tilpasset skriftlig klasse å enkelt generere firkantede former. Jeg har tatt klassene i kildemappen; referere til dem. Det viktige script for kollisjoner er uthevet nedenfor
pakke {import flash.display.Graphics.; import flash.display.Sprite; import flash.events.MouseEvent; /** * Enkel hitTest med bokser *author Shiu * /[SWF (width = 400, height = 300)] public class Simple strekker Sprite {private Var box1: Box, BOX2: Box; offentlig funksjon Simple () {box1 = ny Box (0x0000FF); addChild (box1); box1.x = 250; box1.y = 250; box1.addEventListener (MouseEvent.MOUSE_DOWN, start); box1.addEventListener (MouseEvent.MOUSE_UP, end); BOX2 = ny Box (0x00FF00); addChild (BOX2); box2.x = 100; box2.y = 50; } Private funksjon start (e: MouseEvent): void {e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, sjekk); } Private funksjon enden (e: MouseEvent): void {e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, sjekk); } Private funksjonskontroll (e: MouseEvent): void {if (e.target.hitTestObject (BOX2)) box2.color = 0x00AA00; annet box2.color = 0x00FF00; }}}



Trinn 2: Mangler av markeringsbokser

Du kan imidlertid kollisjon mellom sirkler ikke være effektivt kontrolleres ved hjelp av denne kommandoen. Sjekk ut presentasjonen under. Dra den blå sirkelen mot den grønne. Før figurene kolliderer, deres grenseboksene allerede overlapper og hitTestObject () er sant. Vi trenger en mer nøyaktig løsning.

Dette problemet er utbredt, ikke bare for kollisjoner mellom sirklene, men ikke-firkantede former generelt. Observere diagrammet nedenfor. For organiske former som er vanskelige å løse ved polygoner, skal vi gjøre bruk av supernøyaktig dueller
Various unøyaktig kollisjon oppdages gjennom hitTestObject



Trinn 3:.. Avstand mellom sentrene Anmeldelser

Løsningen på dette problemet er ganske enkel: Vi skal måle avstanden mellom sentrene av disse sirklene. Hvis sentrene komme nær nok til hverandre, skal vi flagge kollisjon som sant. Men hvor nær er nær nok?
Avstand mellom sirklene.

Følg diagrammet over. r 1 refererer til den radius på circle1 og r 2 refererer seg til radien til circle2. Avstanden mellom sirklene er beregnet på hver ramme. If (og bare hvis) er lik eller mindre enn summen av begge radier (r 1+ r 2), og de to sirklene må være berører eller overlapper hverandre.



Trinn 4: Circle-Circle Collision Detection

Her er det viktig Action for gjennomføringen av konseptet ovenfor:
minDist = circle1.radius + circle2.radius; privat funksjonskontroll (e: MouseEvent ): void {var distanse: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); if (avstand < = minDist) circle2.color = 0x00FFAA; annet circle2.color = 0x00FF00;}



Trinn 5: Eksempel Solution

Her er et utvalg av løsningen. Dra den blå sirkelen mot til den grønne. Som de overlapper hverandre, vil du se grønn farge endring. Den går tilbake til normalt når begge sirklene ikke kolliderer

Jeg har tatt med Actionscript gjennomføringen nedenfor
pakke {import flash.display.Sprite..; import flash.events.MouseEvent; /** * Simple kollisjon mellom 2 sirkler *author Shiu * /[SWF (width = 400, height = 300)] public class Simple3 strekker Sprite {private Var circle1: Circle, circle2: Circle; private Var minDist: Number; offentlig funksjon Simple3 () {circle1 = new Circle (0x0055AA, 30); addChild (circle1); circle1.x = 250; circle1.y = 250; circle1.addEventListener (MouseEvent.MOUSE_DOWN, start); circle1.addEventListener (MouseEvent.MOUSE_UP, end); circle2 = new Circle (0x00FF00, 30); addChild (circle2); circle2.x = 100; circle2.y = 50; minDist = circle1.radius + circle2.radius; } Private funksjon start (e: MouseEvent): void {e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, sjekk); } Private funksjon enden (e: MouseEvent): void {e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, sjekk); } Private funksjonskontroll (e: MouseEvent): void {var distanse: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); if (avstand < = minDist) circle2.color = 0x00FFAA; annet circle2.color = 0x00FF00; }}}



Konklusjon

Som du kan se, er det generelle prinsippet om dueller å bruke matematiske formler for å sjekke for overlappinger mellom ulike former. Vector matematikk spiller en viktig rolle også. Neste som kommer er kollisjon mellom en sirkel og en linje. Takk for lesing og se deg snart. Anmeldelser



Previous:
Next Page: