Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-06-2008, 07:55   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
Custom Event

Code in der main-function:

PHP-Code:
clip:MovieClip = new MovieClip();
addChild(clip);
    
var 
pictLdr:Loader = new Loader();
var 
pictURLReq:URLRequest = new URLRequest("../../Grafiken/admin.png");
pictLdr.load(pictURLReq);    
this.dispatchEvent(new imageLoadedEvent(0))
pictLdr.contentLoaderInfo.addEventListener(imageLoadedEvent.COMPLETEimgLoaded); 

function 
imgLoaded(evt:imageLoadedEvent):void
{    
    
trace("Es funktioniert!");
    
clip.addChild(pictLdr.content); 

Code in der imageLoadedEvent - Klasse (imageLoadedEvent.as):

PHP-Code:
package{
    
import flash.events.*;
    
    public class 
imgLoadedEvent extends Event {

          public static const 
COMPLETE:String "complete";
          
          public var 
i:int;
          
          public function 
imgLoadedEventi:int ) {
               
superCOMPLETE );
               
this.i;    
           }
      }    


Folgende Output-Meldung:
Code:
TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@15855da9 to imgLoadedEvent
Dabei liegts daran, dass Flash als Parameter-Type in der Handler-Funktion mein
PHP-Code:
evt:imgLoadedEvent 
, nicht akzeptiert, er verlangt das Standard-Event:
PHP-Code:
evt:Event 
Dann gitbs zwar keine Fehlermeldung, dann kann ich aber auch nicht auf meinen custom-Paramter zugreifen. Was hab ich da nicht bedacht?

Geändert von Torrriate (25-06-2008 um 08:11 Uhr)
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 12:01   #2 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
Jemand ne idee?

?
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 12:24   #3 (permalink)
Neuer User
 
Registriert seit: Aug 2002
Beiträge: 607
Zitat:
Zitat von Torrriate Beitrag anzeigen
?
, bitte ein bisschen Zeit mitbringen, oder dafür bezahlen.

Was soll dir das bringen?
Zitat:
Zitat von Torrriate Beitrag anzeigen
PHP-Code:
this.dispatchEvent(new imageLoadedEvent(0)) 
1.) Das Laden von externen Daten verläuft asynchron!

2.) Werden von den Flash - "Built-In" - Klasse eigene Events geschmissen die man nicht überschreiben kann.

3.) Ist es unschön wenn du "eigene" Events mit der gleichen Stringkonstante erstellst, das gibt nur Probleme. Wie du selbst siehst.

Registriere also für den Loader das Event Event.COMPLETE. Innerhalb der Listener Funktion kannst du dann einen eigenen Events schmeißen.
bizz ist offline   Mit Zitat antworten
Alt 25-06-2008, 13:19   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
..ich wollte damit

keinesfalls stressen. Hab mir nur gedacht, dass das Problem hier vielleicht undurchsichtig ist.

Zur Frage:
Ich dispatche zu dem Zeitpunkt des Aufrufes das Event, mit eben jenem Parameter den ich übergeben will.
Das ganze Brimborium deshalb, weil wie ich gelesen hab, die einzige Möglichkeit einer Parameterübergabe and einen Event-Handler sei es eine eigene Event-Klasse zu extenden.
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 13:22   #5 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
...zu 3.) kann ich nicht ein eigenes Event in der main-function dispatchen?
Muss das über die Listener-Funktion passieren?

Geändert von Torrriate (25-06-2008 um 13:26 Uhr)
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 13:28   #6 (permalink)
Neuer User
 
Registriert seit: Aug 2002
Beiträge: 607
Zitat:
Zitat von Torrriate Beitrag anzeigen
Das ganze Brimborium deshalb, weil wie ich gelesen hab, die einzige Möglichkeit einer Parameterübergabe and einen Event-Handler sei es eine eigene Event-Klasse zu extenden.
Das ist ja kein Problem, bloß was hat das mit deiner Fehlermeldung zu tun?

Der Fehler wird verursacht weil du ein Listener für das "complete" Event registrierst:
Zitat:
Zitat von Torrriate Beitrag anzeigen
PHP-Code:
pictLdr.contentLoaderInfo.addEventListener(imageLoadedEvent.COMPLETEimgLoaded); 
Von Flash aus wird darauf hin ein Event vom Typ flash.events.Event geschmissen, wenn das asynchrone Laden der Datei fertig ist.
Die Listener Funktion erwartet aber einen anderen Typ.
bizz ist offline   Mit Zitat antworten
Alt 25-06-2008, 13:56   #7 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
...ja ich habs kapiert.

Danke erstmal!
Das Problem ist, der ganze Code in der main function sieht so aus:
PHP-Code:
var loader:URLLoader = new URLLoader();
var 
pictLdr:Object = new Array();
var 
request:URLRequest = new URLRequest("../txt's/items.txt");
var 
clipArray:Object = new Array();
var 
i:int =0;

var 
itemsArray:Object = new Array();

function 
itemsArrayLoaded(e:Event):void{
    var 
loader:URLLoader URLLoader(e.target);
    
loader.data=loader.data.split("\r\n").join("");
    
itemsArray=loader.data.split(";");

     
clipArray[itemsArray[0]] = new MenuItem();
    
addChild(clipArray[itemsArray[0]]);
    
pictLdr[itemsArray[0]] = new Loader();
    var 
pictURL:String "../../Grafiken/admin.png"
    
var pictURLReq:URLRequest = new URLRequest(pictURL);
    
pictLdr[itemsArray[0]].load(pictURLReq);
    
dispatchEvent(new imgLoadedEvent(i));
    
pictLdr[itemsArray[0]].contentLoaderInfo.addEventListener(imgLoadedEvent.COMPLETEimgLoaded);
}

function 
imgLoaded(evt:imgLoadedEvent):void
{    
    
trace("Es funktioniert!");
    
clipArray[itemsArray[evt.i]].addChild(pictLdr[itemsArray[evt.i]].content); 
}

loader.addEventListener(Event.COMPLETEitemsArrayLoaded);

try{
    
loader.load(request);
}
catch(
error:Error){
    
trace("Can't load requested file.");    

Nun würd ich gern in der imgLoaded-Function das itemsArray verwenden. Das wird aber über die itemsArrayLoaded-Function vorher befüllt. Wie du gesagt hast passiert das aber asynchron. Deswegen würd ich gern die imgLoaded-Function über die itemsArrayLoaded-Function triggern und ihr meinen custom Paramter (evt.i) dabei übergeben (dieser soll dann nach Ausbau des Codes dynamisch über ne for-schleife inkrementieren). Darum gehts.
Ne unschöne Lösung, die mir dazu einfällt ist, auf den custom Parameter und auf somit auf das cutom-Event zu verzichten und auf das itemsArray, ein paar frames später zuzugreifen, sobald es geladen ist, oder die imgLoaded-function redundant in der (späteren for-schleife) innerhalb der itemsArrayLoaded-function aufzurufen.

Geändert von Torrriate (25-06-2008 um 13:57 Uhr)
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 14:03   #8 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
...wobei

das Triggern, muss dann sowieso redundant passieren...
Ich dachte nur, dass es schöner wär die imgLoaded function ausserhalb der itemsArrayLoaded function zu deklarieren.
Torrriate ist offline   Mit Zitat antworten
Alt 25-06-2008, 14:12   #9 (permalink)
Neuer User
 
Registriert seit: Aug 2002
Beiträge: 607
Zitat:
Zitat von Torrriate Beitrag anzeigen
das Triggern, muss dann sowieso redundant passieren...
Du versucht aber zwei Events, die du schmeißt, irgendwie zu verbinden.
Zitat:
Zitat von Torrriate Beitrag anzeigen
PHP-Code:
dispatchEvent(new imgLoadedEvent(i));
pictLdr[itemsArray[0]].contentLoaderInfo.addEventListener(imgLoadedEvent.COMPLETEimgLoaded); 
Das haut aber nicht hin, die sind unabhängig von einander.

Du muss schon für das Laden von externen Daten einen Listener definieren, der ein Argument vom Typ flash.events.Event annimmt.

Sonst schau dir mal die MovieClip Klasse an, die ist dynamisch so das du weitere Eigenschaften (dein i) hinzufügen kannst. Die Klasse könntest du dann als Parent deines Loaders verwenden.
bizz ist offline   Mit Zitat antworten
Alt 03-07-2008, 10:34   #10 (permalink)
flashwahn
 
Benutzerbild von denverwahn
 
Registriert seit: May 2008
Beiträge: 22
RE:Custom Event

[PHP]package{
import flash.events.*;

public class imgLoadedEvent extends Event {

public static const COMPLETE:String = "complete";

public var i:int;

public function imgLoadedEvent( i:int ) {
super( COMPLETE );
this.i = i;
}
}
}
Folgende Output-Meldung:
Code:
TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@15855da9 to imgLoadedEvent
Dabei liegts daran, dass Flash als Parameter-Type in der Handler-Funktion mein
PHP-Code:
evt:imgLoadedEvent 
, nicht akzeptiert, er verlangt das Standard-Event:
PHP-Code:
evt:Event 
Dann gitbs zwar keine Fehlermeldung, dann kann ich aber auch nicht auf meinen custom-Paramter zugreifen. Was hab ich da nicht bedacht?[/QUOTE]


Du bekommst den Fehler, weil in deiner 'imgLoadedEvent' etwas entscheidendes fehlt:

public function imgLoadedEvent(type:String, i:int ) {
super( type );
this.i = i;
}

override public function clone():Event {
return new imgLoadedEvent(type,i);
}

und hier: eine ganz hilfreiche seite
http://curiousmindsmedia.wordpress.c...vent-tutorial/

Geändert von denverwahn (03-07-2008 um 10:51 Uhr)
denverwahn ist offline   Mit Zitat antworten
Alt 03-07-2008, 20:28   #11 (permalink)
Neuer User
 
Registriert seit: Nov 2004
Beiträge: 148
.hm, sehr interessant

thank you very much!
Torrriate 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 16:22 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele