PDA

Volledige versie bekijken : richting aangeven bij hittest


peres
%Europe/Berlin %558 %2005, 14:23
Hey flashers,

Hoe kan ik met een collision detection bij een verticale MC, 2 hittests met elkaar combineren? Bijvoorbeeld als de speler van rechts naar links (horizontaal) tegen de grens aan loopt, naar linksonder wordt gestuurd. Maar tegelijkertijd, als hij van onder komt (verticaal) en dan de grens raakt, hij naar rechtsboven wordt gestuurd.

Dus hoe kan ik deze 2 script zo met elkaar combineren in één MC?

if (_root.cirkel.hitTest(plek.x, plek.y, true)) {
_root.cirkel._x = _root.cirkel._x - 10;
_root.cirkel._y = _root.cirkel._y + 10;
}

en
if (_root.cirkel.hitTest(plek.x, plek.y, true)) {
_root.cirkel._x = _root.cirkel._x + 10;
_root.cirkel._y = _root.cirkel._y - 10;
}


Hier 2 plaatjes van mijn idee:

-als hij van onder komt: naar rechtsboven sturen
-als hij van rechts komt: naar linksonder sturen
http://members.chello.nl/r.stultiens/test.jpghttp://members.chello.nl/r.stultiens/test2.jpg

ik heb al simpel geprobeerd:
if (_root.cirkel.hitTest(plek.x, plek.y, true)) {
_root.cirkel._x = _root.cirkel._x + 10;
_root.cirkel._y = _root.cirkel._y + 10;
}

Maar dit geeft een heel houterig effect :(



Kan iemand mij hiermee misschien helpen?

theFlashWizard
%Europe/Berlin %862 %2005, 21:42
volgens mij kan dit niet zomaar.. want flash weet nou 1maal niet in welke richting die muur staat.. mshn heb je er wat aan als je de rotatie van die muur nakijkt?
of je zal per dat soort muur n variabele moeten maken die het opslaat.

peres
%Europe/Berlin %894 %2005, 22:27
Ik heb er flink over na zitten denken. volgens mij is het dan makkelijker om de ifKey.isDown functie te veranderen. Dus als je het pijltje omhoog drukt, dan gaat hij omhoog totdat hij de muur raakt, dan gaat hij rechts omhoog. Dus als het ware wordt de Key.isDown functie verandert bij hittest.


Dus deze functie als hij de muur niet raakt (de MC gaat gewoon omhoog):
if (Key.isDown(40)) {
_y=_y-10;
}


En deze functie als hij de muur aanraakt (de MC gaat omhoog + naar rechts):

if (Key.isDown(40)) {
_y=_y-10;
_x=_x+10;
}

Dus dan moet het worden zoiets als dit:

onClipEvent (enterFrame) {
if (Key.isDown(38)) {
_y=_y-10;
}
if (hitTest(_root.muur)==true) {
if (Key.isDown(38)) {
_y=_y-10
_x+_x+10
}
}


alleen ik weet niet hoe ik deze code goed moet schrijven :( want hij klopt nou niet

Pimm
%Europe/Berlin %896 %2005, 22:30
Zo?onClipEvent (enterFrame) {
if (Key.isDown(38)) {
_y = _y-10;
}
if (this.hitTest(_root.muur)) {
if (Key.isDown(38)) {
_y = _y-10;
_x+_x+10;
}
}
}

peres
%Europe/Berlin %897 %2005, 22:33
sorry in mijn script stond

_x+_x+10;

en het moest zijn

_x=_x+10;

nou doet ie het

theFlashWizard
%Europe/Berlin %903 %2005, 22:41
_x=_x+10;
==
_x += 10;

kH_
%Europe/Berlin %569 %2005, 14:39
Je moet rekening houden met de rotatiehoek van de muur. Je kunt dan simpelweg via Pythagoras stelregels berekenen wat je bij X moet optellen en wat bij Y. Kijk goed naar je getekende plaatjes en kijk wat je met de volgende regels kunt doen:

A^2=B^2+C^2

sin(alpha)=Overstaand/Schuin
cos(alpha)=Aanliggend/Schuin
tan(alpha)=Overstaand/Aanliggend

Je snapt zelf wel dat Overstaand meestal Y is en Aanliggend X is. Transformeer de formules via de piramide regel en je komt uit op:

Y=Schuin*sin(alpha)
X=Schuin*cos(alpha)
Y=inverse tan(alpha)*X
X=Y/inverse tan(alpha)

Merk op, hoeken in radialen (1 radiaal is 180/PI graden)

Hier moet je genoeg mee kunnen. Ben je niet erg wiskundig ingesteld, probeer dan bijvoorbeeld via fuzzy logic op het gewenste resultaat te komen. Maarja, als je muur altijd onder een vaste hoek staat, dan kun je het natuurlijk eenmalig bereken. Immers, de deflectie -hoek van de bal is dan altijd hetzelfde.

Succes ermee!