Volledige versie bekijken : [Game] Karakter valt door platforms heen
Av3ng3r
%Europe/Berlin %468 %2007, 11:15
Hallo allemaal,
Ik ben op het moment bezig om een spel te maken in flash mbv van Actionscript 2.0. Ik kan wel aardig programmeren in andere talen (PHP, C#, etc) alleen heb nog niet heel veel ervaring met het bouwen van dingen in actionscript/flash.
We hebben het spel op de volgen manier opgebouwd:
De main stage bestaat uit
Stevie - Het karakter, een movieclip geinstantieerd als char en daarin een andere movieclip FeetGuide wat twee doorzichtige streepjes voorstelt. Deze FeetGuide is geinstanieerd als fGuide.
Level - Een movieclip met daarin verschillende movieclips die het level opbouwen, ik laat het level bewegen via de gelinkte class die achter stevie hangt door de _x coordinaten te veranderen. In de movieclip Level heb ik ook een Movieclip Ground zitten waar weer in een Movieclip LineUp zit. Achter de movieclip LineUp hangt een class die een functie onEnterFrame bevat waar de hittest wordt uitgevoerd met het karakter (char).
class LineUp extends MovieClip {
function onEnterFrame() {
if(this.hitTest(_root.char.fGuide)) {
while(this.hitTest(_root.char.fGuide)) {
_root.char._y--;
}
}
}
}
Het karakter valt nu door de grond heen. Wat mij wel opviel was dat de coordinaten van de feetGuide niet veranderen en die van de aap wel. Ook op de eerste zoveel frames raakt de feetGuide de grond wel , maar zakt daarna weg.
Ik heb ook al geprobeerd om de twee methode van hittest te gebriuken (x,y,shapeFlag), maar dat mocht niet baten.
Iemand suggesties?
De swf op het moment: http://fristi.gethost.nl/Game.swf
De code van het spel valt hier te downloaden: http://fristi.gethost.nl/Game.zip
Av3ng3r
%Europe/Berlin %688 %2007, 16:31
Bump
Dauntless
%Europe/Berlin %556 %2007, 13:21
Meerdere pointers:
- Gebruik geen _root in je class. Elke class moet op zichzelf kunnen werken, zonder te moeten rekenen op een vaste tijdlijn
- Gebruik geen hard-coded variabelen. (Dus geen _root.char.fGuide).
- Maak een overkoepelende classe (bv Wereld) die alle objecten samenbrengt
Av3ng3r
%Europe/Berlin %943 %2007, 22:38
Oke , ik heb je punten bekeken, er zit wel een kern van waarheid in dat je bijvoorbeeld niet met root moet verwijzen, maar hoe roep ik dan in een onderliggende gelinkte class een bovenliggend object aan? Dmv _parent?
Ik weet ook niet of het een slim idee is om in de karakter class op elk frame een array van Line objecten te doorlopen om te kijken of hij deze raakt, want dit is eigenlijk precies hetzelfde als wat ik nu doe, alleen dan omgedraaid. Ik kijk nu vanuit elke line movieclip of de instantie char de lijn raakt.
Graag wat meer duidelijkheid, een tutorial waarmee je een game op een goede manier bouwt is misschien wel aan te raden (niet die van kirupa bv, waarhij alle code in de frames stopt).
Dauntless
%Europe/Berlin %956 %2007, 22:57
Maak een 'Hero' class die dus de hero voorstelt. Daarin sla je de levens op, zijn XP-points, zijn huidige gun, zijn gedachten, etc
Dan maak je een Line class die eigenlijk gewoon een (al dan niet zichtbaar) platform voorstelt.
Daarna maak je een World class die alles samen brengt, en waar de collision detection in gedaan wordt. Maak enkele methodes waardoor je lijnen kan toevoegen aan de wereld en een methode waardoor je het character kan instellen. De lijnen houd je in een array bij en voor de character moet je gewoon een simpele instance variabele maken.
In de World class luister je naar de onEnterFrame en check je de positie van de hero met alle lijnen in de lijnen-array. Je gebruikt beter gewone wiskunde ipv hitTest. Door middel van 'getBounds()' krijg je de coordinaten van de hoekpunten van elke rechthoek (zowel je char als een line wordt voorgesteld als een rechthoek) en die kan je dan met elkaar vergelijken om te vinden of je een hit hebt of niet.
Av3ng3r
%Europe/Berlin %007 %2007, 00:10
Ok heb nu een eigen functie gemaakt die eigenlijk precies hetzelfde doet als de hitTest van flash dmv getbounds. Het probleem waar ik nu mee zit is als volgt,
Wanneer ik van een platform afval of op een platform wil springen raakt de bounding box via de zijkant het platform (hij valt dus niet op het platform , maar er eigenlijk naast.
Het is nu mogelijk door naar links of rechts te bewegen de bounding box van het plaform te raken.
Doordat de de yMax van de Hero binnen de yMin en yMax van het platform valt en de yMin of yMax van de "Hero" binnen de yMin en yMax van het platform valt komt hij er via de volgende code altijd op:
Code van World.as
private function _hitTestPlatform(c:Stevie, p:Platform) {
//Platform bounds
var pBounds = p.getLineBounds(this);
//Character bounds
var cBounds = c.getFeetBounds(this);
if (this._rangeCheck(pBounds.yMin, pBounds.yMax, cBounds.yMax) && (this._rangeCheck(pBounds.xMin, pBounds.xMax, cBounds.xMin) || this._rangeCheck(pBounds.xMin, pBounds.xMax, cBounds.xMax))) {
return true;
}
return false;
}
private function _rangeCheck(min:Number, max:Number, val:Number) {
if (val>=min && val<=max) {
return true;
}
return false;
}
public function onEnterFrame() {
this["Hero"].Move(this);
for (var i in this) {
if (this[i] instanceof Platform) {
if (this._hitTestPlatform(this["Hero"], this[i])) {
while (this._hitTestPlatform(this["Hero"], this[i])) {
this["Hero"]._y--;
}
}
}
}
}
getLineBounds is de volledige bounding box, ik had hier de bounding box kleiner gemaakt na een box van 20px hoog , maar toen viel hij er door heen , waarschijnlijk door mijn ySpeed
getFeetBounds is als volgt:
public function getFeetBounds(targetCoordinateSpace:Object) {
var bb = this.getBounds(targetCoordinateSpace);
//Scale the bounding box up
bb.xMin += 22;
bb.xMax -= 37;
bb.yMin += 77;
return bb;
}
Dauntless
%Europe/Berlin %463 %2007, 11:07
Kan je niet even een .swf online zetten? Dat maakt het eenvoudiger te begrijpen.
Ps:
private function _rangeCheck(min:Number, max:Number, val:Number) {
if (val>=min && val<=max) {
return true;
}
return false;
}
Kan korter als:
private function _rangeCheck(min:Number, max:Number, val:Number) {
return (val>=min && val<=max);
}
Av3ng3r
%Europe/Berlin %517 %2007, 12:25
De swf op het moment: http://fristi.gethost.nl/Game.swf
De code van het spel valt hier te downloaden: http://fristi.gethost.nl/Game.zip
Allebei bijgewerkt
Dauntless
%Europe/Berlin %786 %2007, 18:52
Ah, op die manier :).
Je kan kijken of de aap op de vorige positie boven het platform hing. Zoja -> Hij staat er nu op. Zonee -> gewoon door laten vallen.
Nog enkele tips:
- Ik zie nu 'this["hero"]' staan: Maak een 'private var Hero:MovieClip' aan en dan kan je gewoon this.Hero gebruiken.
- Je hebt nu een 'for(i in this). Het is mooier als je alle platforms toevoegt aan een array (bv via 'addPlatform(p: Platform)'). Momenteel is jouw oplossing waarschijnlijk minder werk, maar het is in principe beter om nu al de levels dynamisch op te bouwen, dan heb je veel minder werk wanneer je nieuwe levels gaat maken. (Dynamisch = haal alle platformen uit een xml / database).
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.