getChildByName und .name für mcs [Flash 9]
| Beiträge: 26 Registriert: Jan 2008
| 28.08.2011, 12:29
Hallo,
ich habe nur eine kleine Verständnisfrage. Ich schlage mich monetan mit einer sehr stark verschachtelen flash-website herum. Dabei muss ich häufig aus einem mc heraus, in einem dazu paralell liegenden mc, auf einer tieferen Ebene, Änderungen vornehmen.
Dabei ist mir zunächst aufgefallen, dass sich manche MovieClips nicht über ".name" umbenennen lassen. Dies ist vornehmlich bei mcs die container für externe swf-Dateien sind und die
ihren externen Inhalt im Stile von var mc:MovieClip = (MovieClip)(loader.content); erhalten der Fall. mc.name = "hallomc"; gibt hier lediglich einen Fehler aus.
Ferner habe ich mit viel herumprobieren festgestellt, dass sich getChildByName nicht "reihenweise" verwenden lässt. Also z.B. ActionScript:1 | var target = parent.getChildByName("instance2").getChildByName("container002");
|
gibt lediglich einen Fehler aus.
Wenn ich stattdessen aber z.B. ActionScript:1 2 3 4 5 | var target1 = parent.getChildByName("instance2");
var target = target1.getChildByName("container002");
for (var i:uint = 0; i < target.numChildren; i++){
trace ('t|t ' +i+'.t name:' + target.getChildAt(i).name + 't type:' + typeof (target.getChildAt(i))+ 't' + target.getChildAt(i)); }
|
schreibe funktioniert es.
Kann mir irgendjemand erklären weshalb das so ist (oder mir ein gutes Tutorial zum Thema getChild... in As3 nennen)?
Danke,
Alex | Geändert von DerWaldgeist am 28.08.11 um 12:32 Uhr | |
| | Beiträge: 791 Registriert: Apr 2004
| 28.08.2011, 17:25
Das Method-Chaining der ArtActionScript:1 | var target = parent.getChildByName("instance2").getChildByName("container002")
|
funktioniert nicht, da getChildbyName ein DisplayObject zurückgibt, und keinen DisplayObjectContainer. Ein Typecas kann da schon helfenActionScript:1 | var target:DisplayObject = DisplayObjectContainer(parent.getChildByName("instance2")).getChildByName("container002");
|
Generell würde ich dir auch raten, Variablen und Konstanten zu typisieren.Architectures - Refactoring - Prototyping - Coding - Training | | | Beiträge: 26 Registriert: Jan 2008
Themenautor/in
| 28.08.2011, 18:30
ok, das hilft mir auf jeden Fall schon weiter ...
Danke,
Alex | | | Beiträge: 26 Registriert: Jan 2008
Themenautor/in
| 11.09.2011, 15:18
Hallo,
ich habe leider nun wieder ziemliche Probleme mit dem Ansprechen verschachtelter Mcs. Ich komme da einfach nicht weiter und hoffe es kann mir jemand helfen.
Mein Projekt ist grob gesagt folgendermaßen aufgebaut:
Es gibt eine Haupt-swf (nennen wir sie main.swf) in welcher ein container (container_mc) liegt. In diesen container_mc wird zweimal eine andere swf-Datei (active.swf) eingeladen (um damit einen 360Grad-View zu realisieren).
Neben diesen beiden Instanzen von active.swf (instance20 und instance22) in container_mc existiert in der main.swf ein sound_mc (für die Verwaltung aller Sounds) und ein titel_mc.
Insgesamt also 3 mcs in main.swf, wobei der erste mc selbst wieder 2 childs hat.
Die Anordnung sieht etwa folgendermaßen aus:
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // wir befinden uns in der Datei main.swf
var loader02:Loader = new Loader();
loader02.load(new URLRequest("active.swf"));
loader02.contentLoaderInfo.addEventListener(Event.COMPLETE, fcompleteLoad);
var loader:Loader = new Loader();
loader.load(new URLRequest("active.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fcompleteLoad);
var container_mc:MovieClip = new MovieClip();
function fcompleteLoad(event:Event):void{
var mc1:MovieClip = (MovieClip)(loader.content);
var mc2:MovieClip = (MovieClip)(loader02.content);
container_mc.addChild(mc1);
container_mc.addChild(mc2);
mc1.parent.setChildIndex(mc1, mc1.parent.numChildren-1);
mc2.parent.setChildIndex(mc2, mc2.parent.numChildren-2);
mc1.x = 0;
mc2.x = image1.width; // mcs nebeneinander legen
addChild(container_mc);
sound_mc.parent.setChildIndex(sound_mc, sound_mc.parent.numChildren-1);
titel_mc.parent.setChildIndex(titel_mc, titel_mc.parent.numChildren-2);
container_mc.parent.setChildIndex(container_mc, container_mc.parent.numChildren-3);
};
|
Nun möchte ich beim Click auf einen Button in der Datei active.swf (also aus instance20 bzw. instance22 -- d.h. mc1 bzw. mc2 heraus) den alpha-Wert von titel_mc auf 0 setzen.
Der mc titel_mc soll beim Click auf den Button also nicht mehr zu sehen sein.
ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // wir befinden uns in der Datei active.swf
button_mc.addEventListener(MouseEvent.CLICK, f_ck_button_mc);
function f_ck_button_mc(event:MouseEvent):void{
var getmainmc:DisplayObject = DisplayObjectContainer(parent.parent.getChildByName("titel_mc"));
// getmainmc.alpha = 0; // liefert einen Fehler da DisplayObject kein alpha kennt
// var mcgetmainmc = getmainmc as MovieClip; // Fehler
// var mcgetmainmc = getmainmc.content as MovieClip; // Fehler
/**
Wie kann ich den titel_mc in der main.swf nur auf alpha = 0; setzen ???
**/
};
|
Vielen Dank für die Hilfe.
Alex | Geändert von DerWaldgeist am 11.09.11 um 15:22 Uhr | |
| | Beiträge: 791 Registriert: Apr 2004
| 11.09.2011, 18:27
Ich hab das erste Script mal so exemplarisch aufgeräumt. Der Typecast funktioniert in Java, ob das auch so in ActionScript funktioniert, weiss ich nicht. Du du solltest auch auf tiefes greifen in View Hierarchien vermeiden. Zum einen macht das Refactorings schwer, zum anderen tippt man immer zu viel.ActionScript:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function fcompleteLoad(event:Event):void{
const mc1:MovieClip = loader.content as MovieClip;
const mc2:MovieClip = loader02.content as MovieClip;
if (!mc1 || !mc2) return;
var index:int = container_mc.numChildren - 1;
for each(var mc:MovieClip in [mc1, mc2]) {
// wenn container_mc keine Kinder hat,
// dann reicht auch addChild von [mc2, mc1].
container_mc.addChildAt(mc, index);
}
mc1.x = 0;
mc2.x = image1.width; // mcs nebeneinander legen
addChild(container_mc);
const container:MovieClip = container_mc.parent;
index = container.numChildren - 1;
for each(mc in [container_mc, sound_mc, titel_mc]) {
container.setChildIndex(mc, index);
}
};
|
Zu deiner zweiten Frage ... implementiere ein Interface, das der geladenen MovieClip implementiert. Dann kannst du darauf casten und so mit dem Inhalt interagieren.ActionScript:1 2 3 4 5 6 7 8 | package fs
{
public interface IMyMovieClip
{
function get titleMCAlpha():Number;
function set titleMCAlpha(value:Number):void;
}
}
|
Architectures - Refactoring - Prototyping - Coding - Training | Geändert von omega psi am 11.09.11 um 18:30 Uhr | |
| | Beiträge: 26 Registriert: Jan 2008
Themenautor/in
| 12.09.2011, 18:17
Hallo,
danke für die Hilfe.
www.flashhilfe.de/forum/actionscript-3-0/zugriff-auf...
Alex
Angehängte Dateien:
| Geändert von DerWaldgeist am 14.09.11 um 18:09 Uhr | |
|
| Ähnliche Beiträge zum Thema | |
|
Flashhilfe.de Flash Platform Tipps & Tutorials Flash Platform Andere Programmiersprachen Jobangebote Diskussionen
Flashhilfe News 
Regeln & Bedingungen
|