Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-02-2008, 17:47   #1 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
Methode der Main-Klasse aufrufen von eingebetteter Klasse

Hallo, ich habe ein Problem und komme einfach nicht drauf, deshalb habe ich jetzt mal eine Musterklasse geschrieben, in der ich es so mache, wie ich denke, dass es genmacht werden muss (tut's aber nicht):

PHP-Code:
package {
    
import Trigger;
    
import flash.display.*;
    
import flash.events.*;
    
    public class 
Main extends MovieClip {
        
        public function 
Main(){
            
            function 
traceIt(){ // die Funktion, die später angesprochen werden soll von der Klasse trigger
                
trace("la");
            }
            
            var 
myTrigger = new Trigger();
            
stage.addChild(myTrigger);
            
myTrigger.init();
        }
        
    }

PHP-Code:
package {
    
    
import flash.display.*;
    
import flash.events.*;
    
    public class 
Trigger extends MovieClip {
        public function 
Trigger (){
            
        }
        public function 
init(){
            
stage.addEventListener(MouseEvent.CLICKclickHandler);
        }
        
        public function 
clickHandler(event:MouseEvent){
            
super.traceIt(); // Bei Klick soll die funktion »traceIt()« in der Main-Klasse angesprochen werden
        
}
    }

Das ganze geht leider nicht, was genau mache ich falsch? Im Moment gibt er mir bei Klick die Nachricht »ReferenceError: Error #1070: Methode traceIt nicht in flash.display.MovieClip gefunden at Trigger/clickHandler()« aus....
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 06-02-2008, 18:13   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Da ist einiges durcheinander.
ActionScript:
  1. package {
  2.  
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.events.MouseEvent;
  6.  
  7.     public class App extends Sprite {
  8.  
  9.         protected var trigger:Trigger;
  10.  
  11.         public function App() {
  12.             super();
  13.             this.inititialize();
  14.         }
  15.  
  16.         protected function initialize():void {
  17.             this.trigger = new Trigger();
  18.             this.trigger.addEventListener(MouseEvent.CLICK, eventListener, false, 0, true);
  19.         }
  20.  
  21.         protected function eventListener(event:Event):void {
  22.             if (event.type = Mouseevent.CLICK) {
  23.                 trace(event.target);
  24.             }
  25.         }
  26.     }
  27. }
ActionScript:
  1. package {
  2.  
  3.     import flash.display.Sprite;
  4.  
  5.     public class Trigger extends Sprite {
  6.  
  7.         public function Trigger() {
  8.             super();
  9.             this.initialize();
  10.         }
  11.  
  12.         protected function initialize():void {
  13.             /* Do something. */
  14.         }
  15.     }
  16. }
So sieht das etwas anders aus. Schaue dir nochmal das Event-System an und Vererbung an. Da sind bei dir nämlich die Fehler.

Geändert von Omega Psi (06-02-2008 um 18:14 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 06-02-2008, 18:23   #3 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
ayayay, ja dann schau ich mir das nochmal an, leider denke ich beim Anschauen meißt an anderes

Danke erstmal, ich werde es später testen

Rasso
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 07-02-2008, 19:48   #4 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
ähm,

ich glaube, ich habe mich nicht verständlich genug gemacht...

Mir geht es darum, aus der unterklasse eine Funktion in der Hauptklasse aufzurufen. Wie geht das?

Das mit dem Event-Ding war nur als Beispiel gedacht...
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:12   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Ich sagte ja, du solltest dich nochmal mit der Vererbung und dem Eventsystem befassen. Ein Beispiel für Vererbung:
ActionScript:
  1. package {
  2.   public class SuperClass {
  3.     public function SuperClass() {
  4.       super();
  5.       trace("SuperClass#initialize");
  6.       this.initialize();
  7.     }
  8.     protected function initialize():void {
  9.       trace("SuperClass#initialize");
  10.     }
  11.     public function doSomething():void {
  12.       trace("SuperClass#doSomething");
  13.     }
  14.   }
  15. }
ActionScript:
  1. package {
  2.   public class SubClass extends SuperClass {
  3.     public function SubClass() {
  4.       super();
  5.       trace("Sub#initialize");
  6.       this.initialize()
  7.     }
  8.     protected function initialize():void {
  9.       trace("SubClass#initialize");
  10.     }
  11.     public function doSomething():void {
  12.       trace("SubClass#doSomething");
  13.       super.doSomething();
  14.       trace("\tdoSomethingMore");
  15.     }
  16.   }
  17. }
Das Beispiel sollte die Beziehung zwischen Super- und Kindklasse gut illustrieren.
Omega Psi ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:14   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
So nebenbei: schaue dir nochmal die ganzen Fachwörter an.

Wenn du von eingebetteter Klasse sprichst, könnte man meinen du sprichst von einer gekapselten Klasse. Vererbung ist was anderes.

Geändert von Omega Psi (07-02-2008 um 20:15 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:27   #7 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
So, hier habe ich jetzt die Lösung gefunden:

http://greenethumb.com/article/23/un...t-class-in-as3

Man muss also angeblich das root als type der Hauptklasse casten

danke und vielleicht hilfts ja jemandem.
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:34   #8 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
Entschuldige, habe deine Beiträge nicht bemerkt...

Mein Problem ist, dass ich garnicht weiss, wo ich in der riesigen Flash-Hilfe überhaupt anfangen soll zu lesen, ausserdem weiss nicht, was Vererbung auf Englisch heisst

Das Geheimnis bei Deinem Beispiel scheint also irgendwie dieses ominöse »super()« im Konstrukor zu sein und dass die SubClass die MainClass extendet, oder?

Tut mir leid, ich habe dazu in der Hilfe wirklich noch nichts gefunden...
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:44   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Deutsch/Englisch, Englisch/Deutsch: http://dict.leo.org/, http://www.dict.cc/

Wenn du in der Hilfe nichts über super gefunden hast, hast du sie nicht benutzt oder falsch. super(); im Konstruktor ruft den Konstruktor der Superklasse auf. super.<Functionsname>() ruft die Funktion der Superklasse auf, wenn die Methode public oder protected deklariert ist.

Und hier findest du die Dokumentation auf deutsch: Link
Omega Psi ist offline   Mit Zitat antworten
Alt 07-02-2008, 20:54   #10 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
Wie dem auch sei... Hier ein funktionierendes Beispiel:
Angehängte Dateien
Dateityp: zip DocumentRoot.zip (6,8 KB, 9x aufgerufen)
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Alt 07-02-2008, 21:01   #11 (permalink)
-
 
Registriert seit: Jul 2003
Beiträge: 714
root ist keine schöne Lösung

Lösung 1:

Anstatt stage.addChild() verwende this.addChild(), wenn du die Klasse Main als Dokumenten Klassen verwendest
Code:
package {
	import flash.display.*;
	import flash.events.*;

	public class Main extends MovieClip {
		public function Main() {
			super();
			var myTrigger:Trigger = new Trigger();
			this.addChild(myTrigger);
			myTrigger.init();
		}
		public function traceIt():void {
			trace("la");
		}
	}
}
Code:
package {

	import flash.display.*;
	import flash.events.*;

	public class Trigger extends MovieClip {
		public function Trigger() {
			super();
		}
		public function init():void {
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		public function clickHandler(event:MouseEvent):void {
			var parentClip:MovieClip = MovieClip(this.parent);
			parentClip.traceIt();
		}
	}
}

Lösung 2, aber nicht sehr schön:

Wenn du unbedingt stage.addChild verwenden willst , dann ist die Instanz der Klasse Main ein Kind (Child) von stage.
Und das ist in diesem Fall das erste Kind.
Code:
package {
	import flash.display.*;
	import flash.events.*;

	public class Main extends MovieClip {
		public function Main() {
			super();
			var myTrigger:Trigger = new Trigger();
			stage.addChild(myTrigger);
			myTrigger.init();
		}
		public function traceIt():void {
			trace("la");
		}
	}
}
Code:
package {
	import flash.display.*;
	import flash.events.*;

	public class Trigger extends MovieClip {
		public function Trigger() {
			super();
		}
		public function init():void {
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		public function clickHandler(event:MouseEvent):void {
			var parentClip:MovieClip = MovieClip(this.parent.getChildAt(0));
			parentClip.traceIt();
		}
	}
}

Lösung 3:

Du übergibt eine Referenz.
Code:
package {
	import flash.display.*;
	import flash.events.*;

	public class Main extends MovieClip {
		public function Main() {
			super();
			var myTrigger:Trigger = new Trigger();
			myTrigger.target = this;
			// stage oder this
			stage.addChild(myTrigger);
			myTrigger.init();
		}
		public function traceIt():void {
			trace("la");
		}
	}
}
Code:
package {

	import flash.display.*;
	import flash.events.*;

	public class Trigger extends MovieClip {
		public var target:MovieClip;
		public function Trigger() {
			super();
		}
		public function init():void {
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		public function clickHandler(event:MouseEvent):void {
			this.target.traceIt();
		}
	}
}
messingfeld ist offline   Mit Zitat antworten
Alt 08-02-2008, 12:40   #12 (permalink)
...
 
Benutzerbild von nonverbla
 
Registriert seit: May 2003
Ort: berlin
Beiträge: 414
Lightbulb

Oh mann, genial, das funktioniert super! Danke für die tollen Beispiele, messingfeld!

Ich werde mich wohl an Methode 3 halten, weil dann kann ich ja auch zwischen verschiedenen Unterklassen kommunizieren, einfach indem man die Ziele Methoden bei der Instanzierung in der Main-Klasse übergibt, ne?

Das einzige, was ich noch nicht kapiere, ist, warum ihr immer im Konstruktor dieses »super()« angebt. Nach der Hilfe ruft dieses den Konstruktor der Übergeordneten Klasse auf. Warum genau macht ihr das? Wenn ich es weglasse, funktioniert es nämlich trotzdem...
__________________
-> Showcase | Nonverblog <-
nonverbla ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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 11:59 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele