Flashhilfe.de - Flash Community

getChildByName und .name für mcs [Flash 9]

 


AntwortenRegistrieren Seite1  

DerWaldgeist#1
Benutzerbild von DerWaldgeist
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:
1var 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
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#2
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

28.08.2011, 17:25

Das Method-Chaining der Art
ActionScript:
1var target = parent.getChildByName("instance2").getChildByName("container002")
funktioniert nicht, da getChildbyName ein DisplayObject zurückgibt, und keinen DisplayObjectContainer. Ein Typecas kann da schon helfen
ActionScript:
1var 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
DerWaldgeist#3
Benutzerbild von DerWaldgeist
Beiträge: 26
Registriert: Jan 2008

Themenautor/in

28.08.2011, 18:30

ok, das hilft mir auf jeden Fall schon weiter ...

Danke,
Alex
DerWaldgeist#4
Benutzerbild von DerWaldgeist
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
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#5
Benutzerbild von omega psi
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
DerWaldgeist#6
Benutzerbild von DerWaldgeist
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:
Komprimierte Datei interface.rar11.95 KB
Geändert von DerWaldgeist am 14.09.11 um 18:09 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de