PDA

Volledige versie bekijken : collision detection voor meerdere movieclips


x_jantine_x
%Europe/Berlin %541 %2009, 12:59
Hallo,

Ik ben een website aan het maken en werk hierbij met verschillende objecten die op elkaar reageren d.m.v. hittest. Dit werkt prima.
Maar deze objecten zijn niet allemaal rechthoekig, dus dan moet ik collision detection gebruiken. Hiervoor heb ik verschillende tutorials op internet opgezocht en dit werkt wel. Echter, het lukt me alleen maar bij 2 movieclips, en niet met meer. Ik weet niet hoe ik de andere movieclips in het script moet zetten. Dit is het script wat ik gebruik:


balletje.onPress = function() {
startDrag(this);
};
balletje.onRelease = function() {
stopDrag();
};


onEnterFrame=function() {
contact = false;
for (i in _root.obstakel) {
plek = new Object();
plek.x = _root.obstakel[i]._x;
plek.y = _root.obstakel[i]._y;
_root.obstakel.localToGlobal(plek);
if (_root.balletje.hitTest(plek.x, plek.y, true)) {
contact = true;
}
}
if (contact== true) {
balletje._alpha = 50;

} else {
balletje._alpha = 100;

}
}



Weet iemand hoe ik meerdere movieclips in dit script kan zetten?

Alvast bedankt!

Groeten Jantine

digitalecartoons
%Europe/Berlin %577 %2009, 13:51
Hier het voorbeeld uit:
http://www.vintagesworld.be/tutorials/ActionScript/2/

Maar nu met twee balletjes: balletje1 en balletje2.

balletje1.onPress = function() {
startDrag(this);
clip = 1;
};
balletje1.onRelease = function() {
stopDrag();
};
balletje2.onPress = function() {
startDrag(this);
clip = 2;
};
balletje2.onRelease = function() {
stopDrag();
};
onEnterFrame = function () {
contact = false;
for (i in _root.obstakel) {
plek = new Object();
plek.x = _root.obstakel[i]._x;
plek.y = _root.obstakel[i]._y;
_root.obstakel.localToGlobal(plek);
balletje = "balletje"+clip;
if (_root[balletje].hitTest(plek.x, plek.y, true)) {
contact = true;
}
}
if (contact == true) {
_root[balletje]._alpha = 50;
info.text = "raak: "+balletje;
} else {
_root[balletje]._alpha = 100;
info.text = "mis";
}
};

x_jantine_x
%Europe/Berlin %593 %2009, 14:14
Ah bedankt dat werkt. :)
Maar wat nou als er ook 2 'obstakels' zijn? Ik wil namelijk dat alles op elkaar gaat reageren. Dus balletje 1 met balletje 2, balletje 2 met obstakel 1, balletje 2 met obstakel 2 enz.
En dan wil ik elke keer als 2 bepaalde movieclips elkaar raken, dat er dan verschillende reacties plaatsvinden, bijvoorbeeld elke keer een andere movieclip aansturen. Dus niet zoals hierboven dat de alpha elke keer 50% wordt. Kan ik dat ook met die clips aangeven dan?

digitalecartoons
%Europe/Berlin %636 %2009, 15:16
Dat kan op zich ook. Door niet enkel dat obstakel van die hittest-omtrek bolletjes te geven, maar ook de balletjes zelf. Bijgaand een voorbeeltje met drie shapes. Die hebben alle drie omtrek-clips die met hittest werken. Op de main timeline heb ik deze code gezet:

mcGreen.onPress = function() {
startDrag(this);
mcGreenDrag = true;
};
mcGreen.onRelease = function() {
stopDrag();
mcGreenDrag = false;
};
mcBlue.onPress = function() {
startDrag(this);
mcBlueDrag = true;
};
mcBlue.onRelease = function() {
stopDrag();
mcBlueDrag = false;
};
mcRed.onPress = function() {
startDrag(this);
mcRedDrag = true;
};
mcRed.onRelease = function() {
stopDrag();
mcRedDrag = false;
};

Dit onthoudt bij het klikken welke clip er momenteel gesleept wordt.

In elk van de drie clips heb ik min of meer dezelfde code gezet. Dit is de code b.v. die in de groene shape zit:
onEnterFrame = function () {
for (i in this.obstakel) {
plek = new Object();
plek.x = this.obstakel[i]._x;
plek.y = this.obstakel[i]._y;
this.obstakel.localToGlobal(plek);
if ((_root.mcBlue.hitTest(plek.x, plek.y, true) && (_root.mcGreenDrag == true))) {
_root.whichclips.text = "groen-blauw";
}
if ((_root.mcRed.hitTest(plek.x, plek.y, true) && (_root.mcGreenDrag == true))) {
_root.whichclips.text = "groen-rood";
}
}
};

Zoals gezegd: iedere shape heeft nu dus zo'n hittest-omtrek (niet enkel het obstakel). Ik laat tevens zien welke shape op welk andere shape gesleept wordt. Hier doe ik dat door bij de hitest tevens naar de mcGreenDrag variabele uit de main timeline te kijken. Houdt dus in dat ik enkel resultaat wil zien als ook de groene shape gesleept wordt. Als je de groene op de blauwe sleept krijg je dus 'groen-blauw' te zien en sleep je de blauwe op de groene 'blauw-groen'. De code bij de andere shaps zijn hetzelfde m.u.v. het hittest stuk (andere kleuren uiteraard). Het kan wellicht wat efficienter gecodeerd, maar je snapt de bedoeling hopelijk :)

x_jantine_x
%Europe/Berlin %779 %2009, 18:42
Perfect! bedankt :)
Misschien een domme vraag, maar ben nogal een leek op het gebied van actionscript, maar waar staat dat 'obstakel' nu voor? Want die staat niet meer in bestand toch?

digitalecartoons
%Europe/Berlin %783 %2009, 18:48
Jawel hoor, als je op het rode, blauwe of groene object dubbelklikt zie je dat die uit drie lagen bestaat. De actions laag, de laag met de witte bolletjes die als hittest-omtrek dienen en de rode, blauwe of groene shape. Die clip met de witte bolletjes heeft als instancenaam 'obstakel'.

x_jantine_x
%Europe/Berlin %814 %2009, 19:32
Owja, niet ver genoeg gekeken... 8~
Maar ik kan weer verder :)

Bedankt voor de snelle reacties!

x_jantine_x
%Europe/Berlin %697 %2009, 16:44
Hoi nog even een vraagje.

De hittest met de movieclips werkt prima zo, maar is dit ook van invloed op het actionscript wat ik in die movieclip zet? Het zit namelijk zo; als twee movieclipjes elkaar raken, speelt een mc, en kom je op een andere pagina (in een mc). In die mc wil ik buttons maken, die doorlinken naar frames binnen die movieclip.

Ik heb deze code

testbutton.onRelease = function(){
gotoAndStop(79);
}


Maar dit werkt nu niet, terwijl dit anders wel werkt...(dacht ik)
Dus ik dacht misschien komt het omdat ik ook die codes met hittest enzo in het bestand heb. Weet iemand of dat zo is, en welke code ik dan kan gebruik om links te maken?

Alvast bedankt,

groeten Jantine