Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-08-2009, 13:12   #1 (permalink)
Neuer User
 
Benutzerbild von Irrwahn
 
Registriert seit: Jan 2008
Beiträge: 9
Question Funktion auf Bühne Starten

Hallo Flashisten,
habe mal wieder eine Frage, die aufgrund Ihrer Einfachheit wohl noch nicht behandelt wurde.

Ich möchte einfach aus einer Klasse heraus eine Funktion auf der Stage aufrufen.

Hier eine vereinfachte Form der Klasse:
ActionScript:
  1. package {
  2.     import flash.display.*;
  3.     import flash.utils.*;
  4.     import flash.events.*;
  5.     public class Testklasse {
  6.         stage.testFunktion();
  7.     }
  8. }

Und hier das Skript auf der Bühne:
ActionScript:
  1. var klassenTest:Testklasse=new Testklasse();
  2. addChild(klassenTest);
  3. function testFunktion() {
  4.     trace("Hallo");
  5. }

Bekomme immer folgende Fehlermeldung:
1120: Zugriff auf eine nicht definierte Eigenschaft stage.

Was mache ich falsch?
Muss ich eine Mainfunction wie in Java anlegen?

Danke für eure Hinweise ...
Irrwahn
Irrwahn ist offline   Mit Zitat antworten
Alt 06-08-2009, 14:17   #2 (permalink)
in and out
 
Benutzerbild von Nikolai
 
Registriert seit: Jun 2001
Ort: hamburg
Beiträge: 142
geiles userpic - ich liebe den film

Du kannst wenn du es einfach machen möchtest der Sub-Klasse eine Referenz auf die Main mitgeben. Stage ist in dem Fall nicht gleich zusetzen mit _root aus AS2.

D.h. hier die Main Class
PHP-Code:
package com.xxx.xxx.website.core {
    
import flash.display.Sprite;
    
    
/**
     *    @author    Nikolai
     *    @date      15:14:49 06.08.2009
     */
    
public class MainClass extends Sprite {
        private var 
subclass SubClass;
        
        public function 
MainClass() {
            
subclass = new SubClass(this);
        }

        public function 
doSome() : void {
            
trace("ich bin dein Anwalt");
        }
    }



hier die subclass
PHP-Code:
package com.xxx.xxx.website.core {
    
import flash.display.Sprite;
    
    
/**
     *    @author    Nikolai
     *    @date      15:15:14 06.08.2009
     */
    
public class SubClass extends Sprite {
        private var 
main Sprite;
        
        public function 
SubClass(arg:Sprite) {
            
main arg;
            
            
main.doSome();
        }
    }

__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 06-08-2009, 21:29   #3 (permalink)
Neuer User
 
Benutzerbild von Irrwahn
 
Registriert seit: Jan 2008
Beiträge: 9
Danke Nikolai,
weil mein echtes Skript schon um einiges umfangreicher ist (will 6 Funktionen auf Klassen auslagern, die MovieClips enthalten) und ich für eine bösartige REWE-Klausur büffeln muss, werde ich wohl etwas Zeit brauchen um das zu implementieren. Werde aber Rückmeldung geben ob es funzt.

Danke erstmal,
Irrwahn

PS: Wirklich`n geiler Film...
Irrwahn ist offline   Mit Zitat antworten
Alt 07-08-2009, 00:46   #4 (permalink)
lebt in stereo
 
Benutzerbild von figure8
 
Registriert seit: Mar 2008
Ort: karlsruhe
Beiträge: 1.093
nur als tipp: bevor du dich in eine klassenstruktur (6 funktionen sind nicht wirklich viel..) stürzt, solltest du erstmal grundlegend nachdenken, ob das sinn macht. alleine, dass du von einer subclass aus auf die stage zugreifen willst und nicht mit events oder vererbungen deine subclassen kommunizieren lässt, widerstrebt mir in anbetracht deines vorhabens..

puh, solche sätze so spät nachts, ich sollte schlafen gehen
__________________
* Flash-JunkieMusiker & Grafiker

# Marvin Blase
# Speaker, Author, Silly Billy.
# @beautifycode

Geändert von figure8 (07-08-2009 um 00:48 Uhr)
figure8 ist offline   Mit Zitat antworten
Alt 07-08-2009, 08:53   #5 (permalink)
in and out
 
Benutzerbild von Nikolai
 
Registriert seit: Jun 2001
Ort: hamburg
Beiträge: 142
Zitat:
Zitat von figure8 Beitrag anzeigen
...puh, solche sätze so spät nachts, ich sollte schlafen gehen
muuah

Aber korrekt. Sauberer wäre es mit Events und Listenern zu arbeiten.
__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 07-08-2009, 11:00   #6 (permalink)
Neuer User
 
Benutzerbild von Irrwahn
 
Registriert seit: Jan 2008
Beiträge: 9
Thumbs up

Eine Lösung mit nem ENTER_FRAME-event + Listener habe ich schon. Baue dieses Projekt aber auch um Actionscript 3 einigermaßen sauber zu lernen, weshalb ich immer versuche den performantesten Weg zu finden.
Mache gerade eine Umschulung zum Fachinformatiker, wo ich hauptsächlich JAVA lerne. Ich versuche dann immer die neuen Erkenntnisse in AS3 umzusetzen.

Ist übrigens ein lustiges Spiel, das Ihr da gebaut habt Nikolai.
Irrwahn ist offline   Mit Zitat antworten
Alt 07-08-2009, 12:09   #7 (permalink)
Odin zum Gruße!
 
Benutzerbild von Oxigan
 
Registriert seit: Nov 2006
Ort: Ösiland
Beiträge: 327
Ein - in meinen Augen - sinnvollerer Ansatz die Referrenz weiterzugeben wäre folgender: Mach dir einfach eine statische klasse und bennene sie z.B. TopLevel.as
PHP-Code:
/**
 * -- Flash Framework --
 * @startRev -- 0.1
 * @currRev -- 0.2
 * @changeDate -- 10.06.2009
 * @author -- Michi S. - www.pixelart.at
 * @desc -- Reference class
 */

package ms
{
    
//Imports
    
import flash.display.DisplayObject;
    
import flash.display.MovieClip;
    
import flash.display.Stage;
    
    
    public class 
TopLevel extends MovieClip 
    
{
        
        public static var 
stage:Stage;
        public static var 
root:DisplayObject;
            
        public function 
TopLevel() 
        {
            
TopLevel.stage this.stage;
            
TopLevel.root this;
        }
    }

so könnte die z.B. aussehen, deine main klasse passt du folglich so an:
PHP-Code:
package
{
    
//Imports
    
import ms.TopLevel;
    
    public class 
main extends TopLevel
    
{
        
//Vars
        //----
        
        //Constructor
        
public function main()
        {
            
trace '** main **' );
        }
    }

so - und jetzt kannst du von JEDER Subklasse von main (nachdem du import ms.TopLevel; gemacht hast ) mit
PHP-Code:
TopLevel.root 
oder
PHP-Code:
TopLevel.stage 
zugreifen.
Das sollte also kein Problem sein das in deinem bestehenden Projekt einzufügen da du ja nur die Main class abänderst ( mit extends TopLevel ) - thats it.

- viel Spaß - Gruß Michi

Geändert von Oxigan (07-08-2009 um 12:16 Uhr)
Oxigan ist offline   Mit Zitat antworten
Alt 07-08-2009, 13:01   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Einen Handler für Event.ADDED_TO_STAGE registrieren und in diesem die Funktion ausführen. Den Handler dann auch bitte entfernen.

EDIT: ActionScript ist nicht ohne Grund event-driven. Auch wenn Oxigans Lösung funktional sein mag so ist sie eher eine Grundschullösung da
  • Keine lose Kopplung - jede Klasse muss so die Klasse TopLevel kennen, wenn sie in das System integriert werden soll.
  • Die Referenzen als globale Variblen misbraucht werden. So was mach man auch in Java nicht.
  • Es nicht performanter ist, da die Events so oder so gefeuert werden und man so die Referenz auf die stage erhält.

Geändert von Omega Psi (07-08-2009 um 13:33 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 10-08-2009, 09:19   #9 (permalink)
Neuer User
 
Benutzerbild von Irrwahn
 
Registriert seit: Jan 2008
Beiträge: 9
Ok, ok,
werde mich ab Mitte der Woche mit euren Vorschlägen befassen.
Schätze, dass ich mal mehr Flex machen sollte.

Erstmel vielen Dank für eure Anmerkungen,

Irrwahn
Irrwahn ist offline   Mit Zitat antworten
Alt 10-08-2009, 09:54   #10 (permalink)
in and out
 
Benutzerbild von Nikolai
 
Registriert seit: Jun 2001
Ort: hamburg
Beiträge: 142
Probier mal FDT oder Flashdevelop aus.
Flex ist in dem Fall eher unangebracht. Außer du meinst den Builder
__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
as3, aufruf, klasse, stage

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele