Aufrufen von MovieClip(root) von einem dynamischen MovieClip-Instanz erzeugt Fehlermeldung 1034
NINJA-EDIT:
Für einige Grund, der gleiche code funktioniert jetzt ohne problem. Ich weiß nicht, was passiert ist oder warum, aber ich habe nicht mehr dieses problem
Hier der original post:
Setzen Sie einfach, ich habe ein MovieClip, setzen Sie mit addChild() auf der Bühne, und als ich versuchte, rufen Sie dieses Stück code:
MovieClip(root).someFunction();
Es wirft den Fehler " error #1034: Typumwandlung fehlgeschlagen: kann nicht konvertiert werden flash.display::Stage@4034f71 zu flash.display.MovieClip.
Ich kann wirklich nicht herausfinden, warum dieses Stück code wird nicht funktionieren. Das Objekt selbst funktioniert einwandfrei, ich kann Funktionen aufrufen, die in ihm (Zeile code wird tatsächlich, innerhalb einer Funktion). Es ist genau das Stück code, der problematisch ist
Kann mir jemand sagen, wo ich schief gelaufen?
BEARBEITEN:
Zur besseren Veranschaulichung der situation, hier ist mein Stück code:
in einem MovieClip, ich habe diese Funktion:
function bombReset():void
{
bBombIsDropped = false;
tCarpetBombTween.gotoAndStop(0);
this.visible = false;
MovieClip(root).carpetBombAttack(iPosition);
}
Und auf Scene1(root, die äußersten Eltern) ich habe diese Funktion:
function carpetBombAttack(position:int):void
{
damagePlant(15,vTileOccupant[(position-1)]);
}
Ist, wenn ich eine MovieClip-Instanz über die Methode addChild und rufen bombReset in es in Flash einen Fehler auslösen
Wenn ich manuell ziehen Sie den MovieClip auf der Bühne, wenn ich rufe bombReset, es funktioniert gut,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Fehler bedeutet, dass der compiler nicht weiß, wie ein
MovieClip
und einStage
werden können, die gleiche Sache. Auch bin ich mir nicht sicher, aber ich glaube der compiler jammernsomeFunction
nicht vorhandenen auf der Bühne, auch wenn Sie gegossen diestage
(aka root) korrekt.Der richtige Weg, um dieses Problem zu lösen ist, indem eine document-Klasse zu Ihrem Projekt und machen
someFunction
eine öffentliche Methode (Klasse, Funktion).Den lag-mans-Lösung (die ich manchmal benutze, wenn ich bin faul), ist die folgende
Funktioniert das, da Sie Typ-casting
this.stage
in einer Weise, die macht der compiler denke, dass es einObject
statt einerStage
.Object
s kann eine beliebige Anzahl von undokumentierten Eigenschaften und Funktionen, damit Sie zum aufrufen der Elemente auf derObject
ob Sie sind Teil der definition einer Klasse ist oder nicht (und auch solche, die nicht existieren - das ist, wo können Sie Holen Sie sich in Schwierigkeiten).Die Vererbung für
Stage
istStage -> DisplayObjectContainer -> InteractiveObject -> ...
währendMovieClip
istMovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> ...
(ich würde einen direkten link zu den docs, aber die Seiten halten Absturz auf mich).Während Sie teilen gemeinsame Basisklassen, die
Stage
undMovieClip
Klassen sind nicht eigentlich Verwandte, so versuchen zu wirken, als die anderen Fehler.Als du tust das
MovieClip(root)
Typumwandlung und nicht dieroot as MovieClip
cast, das ist, warum Sie immer die Fehler, die Sie bekommen.Entweder wirken direkt auf das Objekt, das die
someFunction()
definiert wurde, verwenden Sie die definierte Lösung von Jackson, oder, wenn Sie absolut wissen es, Sie können auchroot["someFunction"]()
MovieClip(root)
wirft einen Fehler, wennroot
ist nicht einMovieClip
, währendroot as MovieClip
wird nur geben Sienull
. Es ist eine bevorzugte Methode des Gießens. DieMovieClip(root)
Stil des Gießens wird hauptsächlich von primitiven cast von einem Typ zu einem anderen. E. g.:Number( "2" )
root
werden können, diestage
, es ist nicht unbedingt immer diestage
: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/... - welche Klasse ist diesomeFunction()
definierte Funktion?addChild()
ist, dass dieroot
Eigenschaft ist wohl anders. Können Sie die trace out kann in beiden Fällen, und sagen Sie mir, wenn Sie das gleiche Objekt?stage
stattroot
, wie es ist immer konsistent. das, oder halten Sie einen Verweis irgendwo auf den movieclip, der diecarpetBombAttack()
Funktion