Volledige versie bekijken : stage aanspreken vanuit package / class bestand?
houseofdreams
%Europe/Berlin %647 %2009, 16:32
Hallo,
Ben ondertussen al een heel stuk verder in mijn AS3 avontuur. Eerst heb ik een poging gedaan om mijn bestaande website te "vertalen" naar AS3, wat beetje bij beetje lukte.
Nu dat op zich wel gaat, vind ik dat mijn code, alhoewel ze in AS3 staat, nog enorm trekt op de werking van AS2. Anders gezegd, ik programeer nog steeds op de tijdslijn, ipv met packages / classes enz...
Dus ben ik nog maar eens opnieuw begonnen (de andere bestanden niet weggesmeten natuurlijk) maar nu wou ik het toch doen "volgens de regels van de kunst", te beginnen met de Document Class...
Op zich kan ik logischerwijs wel de structruur volgen, maar ik zit vast, met wat waarschijnlijk weer iets heel simpel is waar ik dus over heen kijk.
Ik wil dus op de stage een hoop vierkanten tegen elkaar zetten, van 100x100, die dan het hele scherm vullen. Dan via random ze een voor een via een animatie weg laten "vallen". In de gewone tijdslijn gaat dit perfect, maar bij het omzetten van die functie naar een aparte package, gaat er iets mis...
package be.houseofdreams.graphics
{
import flash.display.MovieClip;
public class Squares extends MovieClip
{
public function Squares()
{
trace("stage: "+ stage);
}
}
}
Dit is dus een hele simplistische voorstelling van mijn probleem. Deze trace geeft "null", dus ik kan dus ook niet stage.stageWidth opvragen...
Iemand een idee wat ik vergeet/misdoe?
Jan
%Europe/Berlin %668 %2009, 17:02
Dit is dus een hele simplistische voorstelling van mijn probleem. Deze trace geeft "null", dus ik kan dus ook niet stage.stageWidth opvragen...
Als je in een frame script dan wordt dat script door Flash in een class gegoten die het script vervolgens in een frame plaatst met addFrameScript en tegen dan is je main instance all aan de displaylist toegevoegd en dus kan je gewoon stage gebruiken in je script.
Als je een class gebruikt moet je wachten op het addedToStage event, dan weet je dat het toegevoegd is aan de display list en dan pas is de stage property niet meer null.
package be.houseofdreams.graphics
{
import flash.display.MovieClip;
import flash.events.*;
public class Squares extends MovieClip
{
public function Squares()
{
trace("stage: "+ stage);
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
trace(stage.stageWidth);
}
}
}
Sorry voor de chaos, kan er niks aan doen.
Groeten;
Jan
houseofdreams
%Europe/Berlin %755 %2009, 19:08
Ik zou het ook anders kunnen oplossen:
in de constructor de stage breedte en hoogte meegeven als variablen. De enige vraag waar ik dan mee zit is: is dit correcte code? [?]
package be.houseofdreams.graphics
{
import flash.display.MovieClip;
import flash.events.*;
public class Squares extends MovieClip
{
public function Squares(_width:Number, _height:Number)
{
//
Jan
%Europe/Berlin %774 %2009, 19:35
in de constructor de stage breedte en hoogte meegeven als variablen
Ja dat kan, maar ik dacht dat Squares je Document class was.
Vul je dat in bij properties: Document class?
Groeten;
Jan
houseofdreams
%Europe/Berlin %779 %2009, 19:42
Ja dat kan, maar ik dacht dat Squares je Document class was.
Vul je dat in bij properties: Document class?
Groeten;
Jan
Nee, e document class roept deze aparte class aan om "zijn ding te doen" en dan gewoon verder te gaan.
Ik veronderstel dat OOP toch in die richting werkt? Alles "hebruikbaar" maken en in packages? Ik zou alles natuurlijk in een groot .as bestand kunnen zetten en dan als Document Class gebruiken, maar da's waarschijnlijk "not done"
Jan
%Europe/Berlin %785 %2009, 19:50
Ja het kan op die 2 manieren. Het was moeilijk te beoordelen op basis van het gegeven script. Het beste is om je class zo onafhankelijk mogelijk te maken en dan is het meegeven van parameters in dit geval een goed idee.
Op die manier kan je later ook postioneren binnen een bepaalde Movieclip of Sprite ipv de Stage.
Dus in je Document class iets als:
var squares:Squares=new Squares();
addChild(squares);
squares.position(100,100);//of stage.stageWidth, stage.stageHeight
En in die Squares class handel je dan die position functie af.
Groeten;
Jan
houseofdreams
%Europe/Berlin %786 %2009, 19:52
Ja het kan op die 2 manieren. Het was moeilijk te beoordelen op basis van het gegeven script. Het beste is om je class zo onafhankelijk mogelijk te maken en dan is het meegeven van parameters het beste. Op die manier kan je later ook postioneren binnen een bepaalde Movieclip of Sprite ipv de Stage.
Dus in je Document class iets als:
var squares:Squares=new Squares();
squares.position(100,100);//of stage.stageWidth, stage.stageHeight
In in die Squares class handel je dan die position functie af.
Groeten;
Jan
Ok, laten we dat dan alvast eens proberen en zien hoe ver we geraken :)
Alvast bedankt!
e.l.dam
%Europe/Berlin %838 %2009, 21:08
Hmm, wat ik altijd doe is je main class meegeven aan nieuwe objecten, als je daar je main (stage) wilt gebruiken.
new Squares(this);en dan in Squars
public function Squares(main:MainClass):void
{
main.stage // je stage
}Of is dat heel erg bad practice?
Dauntless
%Europe/Berlin %842 %2009, 21:13
Indien 'MainClass' een echte classe is, en geen interface (wat hij ook is, anders zou hij MainInterface heten :p) zorg je er op die manier voor dat de Squars classe sowieso al gelinkt is aan je MainClass. Op dit moment is dat verband nog helemaal niet nodig en is het dus een bad practice. Als het gaat over 2 classes die sowieso bij elkaar horen, dan mag het natuurlijk wel.
houseofdreams
%Europe/Berlin %856 %2009, 21:33
new Squares(this);
Zoiets heb ik uiteindelijk ook gebruikt, lukt nu perfect... Ok ik zou het nog kunnen vereenvoudigen, maar ja... Zo kan je bezig blijven niet?
public function Squares(_width:Number, _height:Number, _target:MovieClip)Nu op naar het volgende :)
Wederom bedankt iedereen hier...
PS: kan je hier op een "SOLVED" knop drukken of zo? Had al geprobeerd om de titel in de eerste post aan te passen, maar dat veranderd niks in de berichtenlijst
jaspermuts
%Europe/Berlin %994 %2009, 00:52
Voor het topic wordt gesloten (dat gebeurt volgens mij alleen als het hele topic onzin is of neit overeenkomt met de regels en dat is nu niet zo), wil ik toch nog het volgende toevoegen.
Volgens mij is hier adnez' manier echt de 'best practice' om gebruik te kunnen maken van stage binnen een object... De stage-property is best aanroepbaar... Mits deze aan de displaylist is toegevoegd. En als dat niet het geval is, heeft het ook weinig nut om er gebruik van te maken (aangezien het object dan toch niet zichtbaar is). Dus wacht gewoon totdat je gebruik kan maken van 'stage' en ga er dan mee aan de slag.
Dit zorgt ook voor veel meer vrijheid als je niet elke keer een referentie naar de stage moet doorpassen (vooral als je de stage-property wil gebruiken op een object dat binnen een ander object wordt aangemaakt dat ook nog niet aan de displaylist is toegevoegd..en dieper)
Mijn vermoeden hierin wordt versterkt door het geval dat FlashDevelop bijvoorbeeld zijn classes al standaard zo aanmaakt.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.