2012-04-13 9 views
0

[HINWEIS: Recht von der Fledermaus, ich weiß schon die populäre Theorie über „keinen Code auf Movieclips,“ so mit, dass Sie nicht antworten (oder downvote, weil es). Jedes Projekt ist anders. Ich brauche nur die Antwort.]Funktion Zugriff auf MovieClip- von Dokumentenklasse

ich ein Projekt in Adobe Flash CS5.5 haben, Adobe AIR 3 und Actionscript 3.

ich eine Funktion auf der Hauptzeitleiste des zu Anruf benötigen Projekt, dass die Dokumentklasse mit von innerhalb der Dokumentklasse verknüpft ist. Zum Beispiel nennen wir diese Funktion "Ring()".

Wie rufe ich diese Funktion, "Ring()" aus meiner Dokumentenklasse?

+0

Erhalten Sie nicht einen addframescript-Fehler, wenn Sie versuchen, Code auf der Timeline zu schreiben, sowie eine Dokumentenklasse verknüpft haben? – loxxy

+0

Nein. Ich habe es seit Dezember, als ich mit meinem Projekt angefangen habe, ohne jede Anspannung durchgezogen. Ich verwende eine Kombination aus Timeline-Code, Dokumentklassencode und benutzerdefinierten Klassen. – CodeMouse92

Antwort

1

Nun, da Sie scheinen einige oldskool Ninja-Techniken verwenden, würde ich vorschlagen, dass Sie sollten es einfach und unkompliziert halten.

Sagen Sie bitte auf der Hauptzeitleiste einige Funktionen haben:

package { 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 
    import flash.utils.getQualifiedClassName; 
    import flash.utils.describeType; 

    public class Test extends MovieClip 
    { 
     public function Test() 
     { 
      stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
     } 
     private function onMouseDown(event:MouseEvent):void 
     { 
      trace(getQualifiedClassName(this)+".onMouseDown()"); 
      try { 
       var ring1:Function = this["Ring1"] as Function; 
       var ring2:Function = this["Ring2"] as Function; 
      } catch (error:Error) {   
       // ignore 
      } 
      if (ring1 != null) { 
       trace("\t", "Ring1", "=", ring1); 
       trace("\t", ring1()); 
      } else { 
       trace("\t", "Ring1() function not found in "+this+"!"); 
      }   
      if (ring2 != null) { 
       trace("\t", "Ring2", "=", ring2); 
       trace("\t", ring2()); 
      } else { 
       trace("\t", "Ring2() function not found in "+this+"!"); 
      } 

      // for your interest: 
      var doc:XML = describeType(this); 
      var ring1Node:XML = doc.descendants("method").(@name == "Ring1")[0]; 
      var ring2Node:XML = doc.descendants("variable").(@name == "Ring2")[0]; 
      trace("declaration of Ring1:", ring1Node.toXMLString()); 
      trace("declaration of Ring2:", ring2Node.toXMLString()); 
      // so, you may probably make use of reflection 
      // unless you need to reference dynamic members on the main timeline 
     } 
    } 
} 

Kommentare oben im Code Siehe:

function Ring1():String 
{ 
    return "Ring1() called!"; 
} 
var Ring2:Function = function() : String 
{ 
    return "Ring2() called!"; 
}; 

Das Szenario für eine Dokumentenklasse der genannten Timeline so sein würde.

+0

Ich fand eine andere Methode alleine, aber da dies näher an dem ist, wonach ich gefragt habe, akzeptiere ich es, um das von der Liste der unbeantworteten Fragen zu entfernen. Entschuldige die Verspätung und danke dir. – CodeMouse92

2

Setzen Sie die Funktion, die Sie aufrufen möchten, in Ihre Dokumentklasse und senden Sie ein benutzerdefiniertes Ereignis (oder ein Ereignis, wenn der Code lesbar ist) aus der Zeitleiste des Objekts und warten Sie auf dieses Ereignis in Ihrer Dokumentklasse.

So ist der Code Zusammenbruch würde wie folgt aussehen:

Auf einigem Bild der Zeitleiste in Ihrem Dokument (sollte auf jeden Objekt arbeiten):

var customEvent:Event = new Event(Event.COMPLETE); 
this.dispatchEvent(customEvent); 

In Dokumentenklasse:

public function DocumentClass() 
{ 
    // get the reference to the object 
    lolcats.objectThatDispatchesEvent.addEventListener(Event.COMPLETE, _customHandler); 
} 

protected function _customHandler(event:Event):void 
{ 
    // FUNCTION NAMES SHOULD START WITH LOWERCASE! ^_^ 
    Ring(); 
} 

http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html

Grundsätzlich registrieren Sie beliebige Zeichenfolge, die Ihre Veranstaltung definiert, Event.COMPLETE-"complete" auswertet, können Sie einfach registrieren, was Sie wollen, wie:

var custEvent = new Event("anyCustomString"); 
this.dispatchEvent(custEvent); 

// catch it with 
addEventListener("anyCustomString", _handler); 
+0

Okay, nicht ganz sicher, ob ich dir folge. Wie kann der Ereignis-Listener auf customEvent achten? – CodeMouse92

+0

Ich aktualisierte meine Antwort, um das besser zu erklären, tut mir leid, ich habe nicht mehr "Brauch" als mein Beispiel benutzt. – joncys

+3

Was inspiriert deine Namensgebung von Mitgliedern ..? – Marty

Verwandte Themen