[as3] Het aanroepen van je document class

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Ik probeer een code uit mijn document class aan te roepen. Dit krijg ik alleen niet zo snel voor elkaar.

in mijn document class(Menu) roep ik een andere class (mainMenuScreen) aan deze extends (myMenus).

Code vanuit mijn document class Menu
Flash ActionScript:
1
2
mainMenu=new mainMenuScreen(getScreenObj('mainMenu'));
mainMenu.enable();


de functie enable in de class mainMenuScreen
Flash ActionScript:
1
2
3
4
5
public function enable():void
{
    trace(screenName);
    Menu.showScreen(screenName);
}


De functie showscreen zit in mijn document class en ik heb geen idee hoe ik deze kan aanroepen.

Dit is the fout die ik krijg
code:
1
1061: Call to a possibly undefined method showScreen through a reference with static type Class.


als ik de functie showScreen verander naar static dan kan ik functies zoals getChildAt en numChildren niet meer aanroepen.

Als ik Menu(parent).showScreen(screenName); of (root as Menu).showScreen(screenName); aanroep krijg ik de error
code:
1
Error #1009: Cannot access a property or method of a null object reference.



Dus in het kort: Hoe roep ik de functie showScreen uit mijn document class Menu aan vanuit de class mainMenuScreen?

[ Voor 8% gewijzigd door clooner op 12-12-2008 09:26 ]

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:40

alienfruit

the alien you never expected

Uh, je cast nu je stage naar Game ipv. Menu. De klasse Game moet dan wel de functie showScreen hebben.
Als je Game aanpast in Menu zou het misschien wel werken.

Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
alienfruit schreef op vrijdag 12 december 2008 @ 09:20:
Uh, je cast nu je stage naar Game ipv. Menu. De klasse Game moet dan wel de functie showScreen hebben.
Als je Game aanpast in Menu zou het misschien wel werken.
Was een fout in de post 8)7 Het probleem is er nog steeds. Ik gebruik een preloader om de flash te laden. Ik heb een idee dat het daar aan ligt. Ik laat namelijk via de preloader de menu flash. De menu flash bevat de document class Menu. De preloader bevat de document class PreLoader.

[ Voor 25% gewijzigd door clooner op 12-12-2008 09:32 ]

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:40

alienfruit

the alien you never expected

Menu.showScreen() moet dus een static functie zijn is dat ook zo? Verder wanneer roep je die functie aan je moet namelijk wachten tot dat je de ADDED_TO_STAGE event hebt ontvangen dan pas is stage != null.

Verder kan je natuurlijk ook in je document class het volgende toevoegen:

code:
1
2
public static var stage:Stage;
public static var root:DisplayObject;


en vervolgens deze variabelen initialiseren in de constructor.

Vervolgens kan je dan doen Menu.stage ;)

[ Voor 40% gewijzigd door alienfruit op 12-12-2008 09:32 ]


Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
alienfruit schreef op vrijdag 12 december 2008 @ 09:31:
Menu.showScreen() moet dus een static functie zijn is dat ook zo? Verder wanneer roep je die functie aan je moet namelijk wachten tot dat je de ADDED_TO_STAGE event hebt ontvangen dan pas is stage != null.

Verder kan je natuurlijk ook in je document class het volgende toevoegen:

code:
1
2
public static var stage:Stage;
public static var root:DisplayObject;


en vervolgens deze variabelen initialiseren in de constructor.

Vervolgens kan je dan doen Menu.stage ;)
hoezo moet deze static zijn? en hoe moet ik de bovenstaande variabelen initialiseren?

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:40

alienfruit

the alien you never expected

Omdat je er dan altijd bij kan via Menu.stage..

code:
1
2
3
4
public function Menu() {
   Menu.stage = this.stage;
   Menu.root = this.root;
}



Overigens kan je het volgende ook proberen (meer code is wel makkelijker, imho):

code:
1
2
3
4
5
6
7
8
9
code...
mainMenu=new mainMenuScreen(getScreenObj('mainMenu'));
// Event.ADDED_TO_STAGE wordt gedispatched wanneer mainMenu is toegevoegd aan de stage (en dus stage != null is)
mainMenu.addEventListener( Event. ADDED_TO_STAGE, onMenuInitialize );


private function menuInitialize(event: Event): void {
  mainMenu.enable();
}

[ Voor 11% gewijzigd door alienfruit op 12-12-2008 09:40 ]


Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
alienfruit schreef op vrijdag 12 december 2008 @ 09:37:
Omdat je er dan altijd bij kan via Menu.stage..

code:
1
2
3
4
public function Menu() {
   Menu.stage = this.stage;
   Menu.root = this.root;
}
Hey bedankt het werk :D
Ik roep de document class nu aan door:
code:
1
Menu(Menu.root).showScreen(screenName);


en ik initialiseer de variabelen eerst door:
code:
1
2
3
4
5
6
public static var stage:Stage;
public static var root:DisplayObject;   

in de constructor
Menu.stage = this.stage; // set the stage 
Menu.root = this.root;   // set the root!

[ Voor 6% gewijzigd door clooner op 12-12-2008 10:11 ]

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:40

alienfruit

the alien you never expected

Ja, mooi. Overigens kan je ook nog de versie met ADDED_TO_STAGE event proberen.

Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
alienfruit schreef op vrijdag 12 december 2008 @ 10:17:
Ja, mooi. Overigens kan je ook nog de versie met ADDED_TO_STAGE event proberen.
Heb ik gedaan maar het werkt zonder ook goed. Het initialiseren en het aanroepen van enable staat ook niet direct achter elkaar.

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Het is mooi dat het werkt. Ik begrijp het alleen niet helemaal.

code:
1
Menu(Menu.root).showScreen(screenName);


waarom is het Menu(Menu.root) en niet simpelweg Menu.root?

Inside The Matrix, they are everyone, and they are no one.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:40

alienfruit

the alien you never expected

Omdat de property root altijd een type DisplayObject teruggeeft en deze moet je vervolgens casten naar Menu zodat je de functies van de Menu kan aanroepen anders kan je alleen maar de functies of variabelen gebruiken van DisplayObject.
root : DisplayObject
[read-only] For a display object in a loaded SWF file, the root property is the top-most display object in the portion of the display list's tree structure represented by that SWF file.
Pagina: 1