Volledige versie bekijken : SideScrollingSpel - Depth/z-order probleem
Cazzz
%Europe/Berlin %833 %2005, 21:00
Just 4 fun maak in een good-old sidescroll spel zoals secret of mana of Illusion of Gaia. Nu wil alles wel lukken behalve dan de orderning van de verschillende 'sprites'. Normaal gesproken werk ik nooit met Flash dus ik vind het een beetje brutaal om het hier zo te vragen. Ik heb wel gezocht maar kon niks werkends vinden.
Wat ik wil is ó zó simpel (in theorie) maar ik snap gewoon niet hoe het in Flash moet. Ik wil dat als de Y positie van de speler groter is dan die van een ander personage (meisjes) dat deze dan er voor wordt getekend. Anders juist er achter.
Echter kan ik zover ik weet niet gelijk de diepte waarde aanpassen. Dit doe ik in Flash MX met swapDeths. Echter gebeurt er dan weinig. Dit is te zien: Hier (http://svi.cs.hro.nl/~cazzz/abs.html).
Mijn z-order routine ziet er zo uit:
for (var i = 0; i<10; ++i) {
if (mainPlayer._y > getProperty("woman"+i, _y)) {
mainPlayer.swapDepths("woman"+i);
}
Hopelijk kan iemand mij een waardevolle tip geven of een goede website? Bijvoorbaad dank.
ps. Mocht je geen andere meisjes zien dan moet je met de pijltjes toetsen even naar rechtslopen. Soms is de Math.Random zo bij de hand om alles rechts te plaatsen.
Roenes
%Europe/Berlin %836 %2005, 21:04
Hoi Cazzz,
Deze showcase is bedoelt voor het tonen van afgewerkte ActionScript programma's en spellen. Deze vraag hoort thuis in het ActionScript forum. Ik verplaats de topic dus even :)
Dauntless
%Europe/Berlin %940 %2005, 23:34
Op het eerste zicht ziet dat er wel juist uit ...
Verander getProperty eens met de nieuwe variant:
for (var i = 0; i<10; ++i) {
if (mainPlayer._y > this["woman"+i]._y) {
mainPlayer.swapDepths("woman"+i);
}
}
Maar dat gaat het waarschijnlijk niet doen... Dan moet je gaan tracen :).
for (var i = 0; i<10; ++i) {
trace("iteratie #"+i);
trace("mainPlayer._y = "+mainPlayer._y);
trace("this['woman'+i] = "+this["woman"+i]);
trace("En haar ._y is "+this["woman"+i]._y);
if (mainPlayer._y > this["woman"+i]._y) {
mainPlayer.swapDepths("woman"+i);
}
}
Wat krijg je dan? Er zal wel een undefined tussen zitten ergens...
SaphuA
%Europe/Berlin %975 %2005, 00:25
Wat doe je ingewikkeld?
Als een poppetje zijn y-positie veranderd, verander je ook zijn depth. Depth kun je bijv. gelijk maken aan de y-positie van het poppetje. Die for-loop is dus nergens voor nodig :)
Flashingback
%Europe/Berlin %011 %2005, 01:16
Ik denk dat de depth dezelfde waarde geven van je y positie voor problemen kan zorgen als er bijvoorbeeld 2 mc's zijn die op dezelfde y positie zitten want dan zal het niet zichtbaar zijn.
Dauntless
%Europe/Berlin %361 %2005, 09:40
swapDepths(Math.floor(this._y)); gaat in principe geen problemen geven hé...
Cazzz
%Europe/Berlin %374 %2005, 09:59
@Saphua
Flashingback heeft gelijk. Maar ik heb het al eerder geprobeerd. Dat werkte niet aangezien je niet gelijk de diepte kan zetten (zover ik weet) . Je mag alleen dieptes wisselen. Maar doe je dat met een positie die geen object heeft dan kopiert hij de bron naar de nieuwe diepte maar laat de andere staan. Dan zit ik op eens met 2 hoofdpersonen.
@ Dauntless
Ik heb beide geprobeerd maar er zijn geen undefined's :'(
En er veranderd zowiezo weinig waardes anders dan de _y en _x waardes (maar goed dat komt omdat ik de mc(main charcter?) bestuur.
SaphuA
%Europe/Berlin %423 %2005, 11:09
@Dauntless: Precies wat ik bedoelde :)
@Cazz: Natuurlijk niet, er zijn zat manier om er omheen te werken en het te fixen. De eenvoudigste manier is alsvolgt: zorg dat het hoofdcharacter altijd 1pixel boven de andere characters zit. Je kunt ze bijvoorbeeld allemaal 3px omhoog laten lopen als ze een stap doen, zo blijft het maincharacter altijd boven de andere:
MainY: 400 CharY: 401
MainY: 397 CharY: 398
MainY: 394 CharY: 395
Etc. etc.
En zorgen dat elk character begint op een afgeronde pixel (dus niet 24.3) en ook altijd met een vast getal kan verplaatsen (dus 3 bijv.)
En dan kan je dus gewoon de code van Dauntless gebruiken:
swapDepths(this._y);
SaphuA
%Europe/Berlin %436 %2005, 11:29
Kon het niet laten :)
Dit is toch wel iets beter dan voor elke stap door elke character te loopen? :)
Kleine edit in de code van de enemies:
tempY -= (tempY%moveY)+1;
Wordt:
tempY -= (tempY%moveY)+Math.round(moveY/2);
Zodat de hero altijd precies tussen 2 enemies zit (als die 2 allebij 1 stap van elkaar verwijderd zijn).
Dauntless
%Europe/Berlin %525 %2005, 13:36
En dan kan je dus gewoon de code van Dauntless gebruiken:
swapDepths(this._y);
Rondt hij die dan automatisch af? Anders ga je problemen krijgen als je y = 36.9...
SaphuA
%Europe/Berlin %648 %2005, 16:34
Dauntless, dat is niet nodig als je char per pixel loopt. En dat is ook beter om te doen, omdat als je het afrond je alsnog af en toe de verkeerde depths krijgt.
Dauntless
%Europe/Berlin %661 %2005, 16:52
Als je zegt dat je op de hele pixel loopt, dan gaat Math.floor() niets foutdoen :p
SaphuA
%Europe/Berlin %672 %2005, 17:08
Jah dan heb je 't niet eens nodig 8~
Cazzz
%Europe/Berlin %456 %2005, 11:57
Owkee bedankt voor de info. Maar ik heb nu jullie optie geprobeerd maar die zorgt voor een raar probleem [V]. Wanneer ik de depth zet aan de hand van de MC's _y dan wordt deze de hele tijd gekopierd. Zie ook de Fla en SWF hier onder. IK heb SaphuA's voorbeeld wel gedownload maar dat kon door mijn Flash MX niet worden geladen. Ik heb wel de AS gelezen in wordpad maar het kan goed dat ik een regel ben vergeten.
Weet iemand waardoor het kopieren van MC's niet gebeurd bij het aanroepen van swapDepths?
FLA (http://svi.cs.hro.nl/~cazzz/abs.fla)
SWF (http://svi.cs.hro.nl/~cazzz/abs.html)
SaphuA
%Europe/Berlin %560 %2005, 14:26
Woah!
Cazzz, voordat je verder gaat met je project moet je echt je code even opschonen. Je hebt precies dezelfde if-functies voor elke vrouw (frame 11), maar dan elk met een ander nummer. Waarom combineer je het niet in een for-loop?
if (Key.isDown(Key.SPACE)) {
var qbOffset = 70;
for(var i=0; i<9; i++){
if (_root["woman"+i].isInCollisionWithPlayer()) {
questionbox._visible = true;
questionbox._y = _root["woman"+i]._y-qbOffset;
questionbox.gotoAndStop(i+2);
}
}
}
En dit is maar een voorbeeldje, er zijn een hoop dingen die je kunt verbeteren.
En hier is de code van mijn "side-scroller" zodat je hem zelf kunt maken:
this.createEmptyMovieClip("cont", 1);
//--
var enemies = 22;
var occupied = {};
var moveX = 5;
var moveY = 3;
//--
var charY = 200;
var charX = 80;
charY -= charY%moveY;
cont.attachMovie("char", "char", charY);
cont.char._x = charX;
cont.char._y = charY;
cont.char.stop();
//--
for (var i = 0; i<enemies; i++) {
var tempX = random(200)+random(200)+random(200)+random(200);
var tempY = random(400);
tempY -= (tempY%moveY)+1;
while (occupied[tempY]) {
var tempY = random(400);
tempY -= (tempY%moveY)+1;
}
cont.attachMovie("char", "char"+i, tempY);
cont["char"+i]._x = tempX;
cont["char"+i]._y = tempY;
cont["char"+i].gotoAndStop(2);
occupied[tempY] = 1;
}
//--
cont.char.onEnterFrame = function() {
if (Key.isDown(Key.UP)) {
this._y -= moveY;
this.swapDepths(this._y);
} else if (Key.isDown(Key.DOWN)) {
this._y += moveY;
this.swapDepths(this._y);
}
if (Key.isDown(Key.LEFT)) {
this._x -= moveX;
cont._x += moveX;
} else if (Key.isDown(Key.RIGHT)) {
this._x += moveX;
cont._x -= moveX;
}
};
Nou hoef je alleen nog een MC te maken met linkage 'char'. Op frame 1 een 'hero' image, en op frame 2 een slechterik.
Cazzz
%Europe/Berlin %796 %2005, 20:06
Hartelijk dank voor je uitleg en voorbeelden SaphuA. Ik ga er zo dadelijk mee aan de slag.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.