Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 31-07-2009, 17:12   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2009
Beiträge: 61
Anonyme Funktion mit Dynamischem Inhalt

Hallo Leute.

Situation ist folgende:
Ich habe mehrere Buttons, die jeweils den gleichen Sprite erscheinen lassen (natürlich in anderen Konfigurationen). Es soll aber immer nur einer dieser Sprites zu sehen sein. Dafür möchte ich eine ReleaseOutside-Funktionalität einbauen. Wie ich das mache ist klar.
Allerdings möchte ich nicht für jedes Sprite eine eigene funktion scheiben müssen. Statt dessen habe ich mir gedacht eine anonyme Funktion zu scheiben, die dynamisch für das aktuelle Sprite definiert wird.

Damit es Deutlicher wird ein Beispiel:
Code:
myBtn.addEventListener(MouseEvent.CLICK, openSpriteHandler);

function openSpriteHandler(evt:Event){

  var sp:Sprite = new Sprite();
   //...irgendein Code

  stage.addEventListener(MouseEvent.MOUSE_UP,
		function(event:MouseEvent){
			if (event.target == sp|| cal.contains(event.target)){
				// Maus ist innerhalb des Sprites
			}else{
				// Maus ist ausserhalb des Sprites
				sp.visible = false;
                                // Code zum löschen des Sprites
			}
			stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
		});

  sp.visible = true;
}

function mouseUp(evt:Event){
    // Dieser Code spielt keine Rolle
}
Ich möchte also in der Definition der anonymen funktion Variableninhalte der umgebenden Funktion zugreifen. Ist sowas wohl möglich?
Bisher bekomm ich Compilerfehler, weil er die variable sp nicht kennt.

Vielen Dank im Vorraus.

Geändert von Selius (31-07-2009 um 17:13 Uhr)
Selius ist offline   Mit Zitat antworten
Alt 31-07-2009, 18:41   #2 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Das Problem ist, daß die Funktion im Listener deklariert wird. Ich bin mir aber nicht sicher, wo genau sie dann gültig ist... aber event.target ist dann immer die Stage, es wird also schon deshalb nicht so funktionieren, wie Du es planst.
__________________
EDV = Ende Der Vernunft

Geändert von hmpf (31-07-2009 um 18:44 Uhr)
hmpf ist offline   Mit Zitat antworten
Alt 01-08-2009, 08:28   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2009
Beiträge: 61
Das ist ne ganz normale deklaration einer anonymen Funktion.
Statt, das ich ne Funktion per Namen an den Listener übergebe. Deklariere ich die Funktion direkt. Das mach sinn, weil ich die Funktion nur in diesem Zusammenhang brauche.
Selius ist offline   Mit Zitat antworten
Alt 01-08-2009, 09:19   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ich würde halt gerne wissen, wie du dynamisch eine Funktion erstellst.

Ich verstehe deinen Ansatz halt nicht...
Omega Psi ist offline   Mit Zitat antworten
Alt 01-08-2009, 10:37   #5 (permalink)
Neuer User
 
Registriert seit: Jul 2009
Beiträge: 61
So, nach einiger testerei an einfachen Beispielen habe ich festgestellt, das es doch funktioniert

Bei der Definition einer Anonymen funktion kann ich auf die Variablen der umgebenden Funktion zurück greifen.

Code:
btn.addEventListener(MouseEvent.CLICK, openSpriteHandler);

function openSpriteHandler(evt:Event){

  var sp:Sprite = new Sprite();
  sp.addChild(new ShowMe());
   //...irgendein Code

  stage.addEventListener(MouseEvent.MOUSE_UP,
		function(event:MouseEvent){
			trace(event.target);
			if (event.target == sp){
				// Maus ist innerhalb des Sprites
			}else{
				// Maus ist ausserhalb des Sprites
				sp.visible = false;
				sp.parent.removeChild(sp);
                                // Code zum löschen des Sprites
			}
			stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
		});

  sp.visible = true;
  this.addChild(sp);
}

function mouseUp(evt:Event){
    // Dieser Code spielt keine Rolle
}
Aber dieses Beispiel zeigt auch, dass es eine schlechte Programmierpraxis ist das stage-objekt mit anonymen eventListenerFunktionen zu versehen, weil man keine Möglichkeit hat diese wieder zu entfernen.
Also muss ich mir doch noch einen anderen Weg einfallen lassen.
Selius ist offline   Mit Zitat antworten
Alt 01-08-2009, 11:37   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
ActionScript:
  1. btn.addEventListener(MouseEvent.CLICK, openSpriteHandler);
  2.  
  3. function openSpriteHandler(evt:Event){
  4.  
  5.   var sp:Sprite = new Sprite();
  6.   sp.addChild(new ShowMe());
  7.    //...irgendein Code
  8.  
  9.   stage.addEventListener(MouseEvent.MOUSE_UP,
  10.         function(event:MouseEvent){
  11.             trace(event.target);
  12.             if (event.target == sp){
  13.                 // Maus ist innerhalb des Sprites
  14.             }else{
  15.                 // Maus ist ausserhalb des Sprites
  16.                 sp.visible = false;
  17.                 sp.parent.removeChild(sp);
  18.                                 // Code zum löschen des Sprites
  19.             }
  20.             stage.removeEventListener(MouseEvent.MOUSE_UP, arguments.callee);
  21.         });
  22.  
  23.   sp.visible = true;
  24.   this.addChild(sp);
  25. }
?
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
anonyme, funktion, releaseoutside

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 16:07 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele