{lang: 'de'}
Flashhilfe.de - Flash Community

addChild, removeChild mit AS3... [Flash 9]

 


AntwortenRegistrieren Seite1  

Koyocreative#1
Benutzerbild von Koyocreative
Beiträge: 12
Registriert: Jun 2005

14.01.2010, 12:52

Hallo zusammen,

habe folgendes Problem:

Ich habe 3 Buttons auf einer Ebene die auf verschiedene Container verlinken.
Und wenn ich zb auf Button 1 klicke ladet der auch die "ppt4.swf", doch wenn ich dann auf Button 2 klicke entlädt sich dieser Container nicht sondern ladet mir einen weiteren hinzu. Habe schon removeChildAt probiert aber irgendwie will es nicht so klappen...

hier mein Script das auf der Timeline der Buttons liegt:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
button1_1.addEventListener(MouseEvent.CLICK, clickFunction1_1);

function clickFunction1_1(evt:MouseEvent):void {
gotoAndPlay("1_1", "Embossing");
}

button1_2.addEventListener(MouseEvent.CLICK, clickFunction1_2);

function clickFunction1_2(evt:MouseEvent):void {
gotoAndPlay("1_2", "Embossing");
}

button1_3.addEventListener(MouseEvent.CLICK, clickFunction1_3);

function clickFunction1_3(evt:MouseEvent):void {
gotoAndPlay("1_3", "Embossing");
}


und mein Script was auf der Timeline hier bei "1_1" liegt:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import flash.display.*;
import flash.net.URLRequest;
import flash.events.Event;

var container1:Sprite = new Sprite();
addChild(container1);
container1.y = 137;
container1.x = 214;
var swfLdr:Loader = new Loader();
var swfURL:String = "ppt4.swf"
var swfURLReq:URLRequest = new URLRequest(swfURL);
swfLdr.load(swfURLReq);
swfLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
function swfLoaded(event:Event):void
{
    container1.addChild(swfLdr.content);
}
stop();


und mein Script was auf der Timeline hier bei "1_2" liegt:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import flash.display.*;
import flash.net.URLRequest;
import flash.events.Event;

var container1_1:Sprite = new Sprite();
addChild(container1_1);
container1_1.y = 137;
container1_1.x = 214;
var jpg1_1Ldr:Loader = new Loader();
var jpg1_1URL:String = "images/ppt4.jpg"
var jpg1_1URLReq:URLRequest = new URLRequest(jpg1_1URL);
jpg1_1Ldr.load(jpg1_1URLReq);
jpg1_1Ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, jpg1_1Loaded);
function jpg1_1Loaded(event:Event):void
{
    container1_1.addChild(jpg1_1Ldr.content);
}
stop();


wie kann ich das schreiben das mir flash erst die anderen sachen entleert?
Hoffe habe mein Problem einigermaßen erklären können.

vielen Dank im voraus
lg
Michi1986#2
Benutzerbild von Michi1986
Beiträge: 113
Registriert: Sep 2009

14.01.2010, 14:37

Hi Koyocreative,

das Zauberwort ist hier removeMovieClip.

zum Bleistift
ActionScript:
1container1_1.removeMovieClip();


MfG,

Michi
springer#3
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

14.01.2010, 14:48

hi,

@michi1986: removeMovieClip ist as2, hier gehts aber um as3.... ;-)

removeChild ist schon richtig...

die einzige möglichkeit die ich jetzt grad sehe ist folgende:

ActionScript:
1
2
var container1_1:Sprite = new Sprite();
container1_1.name = "einNameDeinerWahl";


in den anderen szenen musst dann prüfen ob das child in der displaylist hängt:

ActionScript:
1
2
3
if( this.getChildByName( "einNameDeinerWahl" ).parent != null ){
    removeChild( this.getChildByName("einNameDeinerWahl") );
}


so müsstes du es mit allen "containern" machen, die du in den szenen addest. und in allen szenen prüfen ob die dinger zur stage geaddet sind...
ohne gewähr, da ich nicht genau weiss wie es sich bei szenen verhält... am besten immer ohne szenen arbeiten, sondern mit bildbezeichungen..
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
micB#4
Benutzerbild von micB
Beiträge: 186
Registriert: Jun 2009

14.01.2010, 14:57

eigentlich reicht es doch, wenn du 1 container verwendest, in den du die einzelnen swfs lädst...?
denn du also auch immer auf der bühne hast (und nicht in der funktion erstellst)
dann kannst du abfragen,ob in diesem container schon etwas enthalten ist und gegebenenfalls entladen
ActionScript:
1
2
3
4
5
6
7
8
function swfLoaded(event:Event):void
{
if (container1.numChildren > 0)
{
    container1.removeChildAt(0)    // ist ein mc im container, wird er entladen
}
    container1.addChild(swfLdr.content);
}
drflash#5
Benutzerbild von drflash
Beiträge: 10
Registriert: Dec 2009

14.01.2010, 15:23

Gibt 2 einfache Möglichkeiten:

1. dem container einfach den jeweiligen movieclip zu weisen:

ActionScript:
1containermc = mymc;



2. oder aber z.b. sowas hier:

ActionScript:
1
2
3
4
5
6
7
8
9
10
function deleteAll(target:MovieClip)
{
   for(var i:int=0; i<target.numChildren; i++)
   {
      target.removeChildAt(i);
   }
}


deleteAll(container);
Geändert von drflash am 14.01.10 um 15:24 Uhr
Koyocreative#6
Benutzerbild von Koyocreative
Beiträge: 12
Registriert: Jun 2005

Themenautor/in

14.01.2010, 15:40

vielen Dank schonmal für die Antworten.

@Springer

erstmal super vorschlag, allerdings wenn ich das einbauen bekomme ich folgenden fehler:

TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.

Habe nun das mal so probiert:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
button1_1.addEventListener(MouseEvent.CLICK, clickFunction1_1);

function clickFunction1_1(evt:MouseEvent):void {
gotoAndPlay("1_1", "Embossing");
if( this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
if( this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
if( this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
//removeChild(container1);
//removeChild(this);
}

button1_2.addEventListener(MouseEvent.CLICK, clickFunction1_2);

function clickFunction1_2(evt:MouseEvent):void {
gotoAndPlay("1_2", "Embossing");
if( this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
if( this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
if( this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
}

button1_3.addEventListener(MouseEvent.CLICK, clickFunction1_3);

function clickFunction1_3(evt:MouseEvent):void {
gotoAndPlay("1_3", "Embossing");
if( this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
if( this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
if( this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
}


allerdings entleert Flash mir dann je nachdem 1-2 Container nicht (bis die Fehlermeldung kommt. "TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich."

Thx für weitere vorschläge
springer#7
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

14.01.2010, 15:44

häng vorne dran noch was, hatte ich nicht berücksichtigt: der container kann ja auch gar nicht in der displaylist hängen...

ActionScript:
1
2
3
if( this.getChildByName("container_1") != null && this.getChildByName( "container_1" ).parent != null ){
    ....
}


und da es ja immer derselbe test ist, würd ich das ganze auslagern:

ActionScript:
1
2
3
4
5
6
7
if( childOnStage( "container_1" ) ){

}

function childOnStage(name:String):Boolean{
  return this.getChildByName(name) != null && this.getChildByName( name).parent != null ? true : false;
}
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Koyocreative#8
Benutzerbild von Koyocreative
Beiträge: 12
Registriert: Jun 2005

Themenautor/in

14.01.2010, 15:59

Hey top :-) das funktionert.

was meinst du mit auslagern? also den zweiten script von dir habe ich nicht verstanden.

sieht nun so 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
button1_1.addEventListener(MouseEvent.CLICK, clickFunction1_1);

function clickFunction1_1(evt:MouseEvent):void {
gotoAndPlay("1_1", "Embossing");
if( this.getChildByName("container_1") != null &&
this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
if( this.getChildByName("container_1_1") != null &&
this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
if( this.getChildByName("container_1_2") != null &&
this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
}

button1_2.addEventListener(MouseEvent.CLICK, clickFunction1_2);

function clickFunction1_2(evt:MouseEvent):void {
gotoAndPlay("1_2", "Embossing");
if( this.getChildByName("container_1") != null &&
this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
if( this.getChildByName("container_1_1") != null &&
this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
if( this.getChildByName("container_1_2") != null &&
this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
}

button1_3.addEventListener(MouseEvent.CLICK, clickFunction1_3);

function clickFunction1_3(evt:MouseEvent):void {
gotoAndPlay("1_3", "Embossing");
if( this.getChildByName("container_1") != null &&
this.getChildByName( "container_1" ).parent != null ){
    removeChild( this.getChildByName("container_1") );
}
if( this.getChildByName("container_1_1") != null &&
this.getChildByName( "container_1_1" ).parent != null ){
    removeChild( this.getChildByName("container_1_1") );
}
if( this.getChildByName("container_1_2") != null &&
this.getChildByName( "container_1_2" ).parent != null ){
    removeChild( this.getChildByName("container_1_2") );
}
}


Vielen Dank :-)
springer#9
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

15.01.2010, 10:40

mit auslagern meine ich so, alles was du immer wieder schreibst, kann man in der regel zusammenfassen:

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
33
34
button1_1.addEventListener(MouseEvent.CLICK, clickFunction1_1);

function clickFunction1_1(evt:MouseEvent):void {
   gotoAndPlay("1_1", "Embossing");
   this.checkContainers();
}

button1_2.addEventListener(MouseEvent.CLICK, clickFunction1_2);

function clickFunction1_2(evt:MouseEvent):void {
   gotoAndPlay("1_2", "Embossing");
   this.checkContainers();
}

button1_3.addEventListener(MouseEvent.CLICK, clickFunction1_3);

function clickFunction1_3(evt:MouseEvent):void {
   gotoAndPlay("1_3", "Embossing");
   this.checkContainers();
}

var container:Array = new Array("container_1","container_1_1","container_1_2");

function childOnStage( name:String ):Boolean{
  return this.getChildByName( name ) != null && this.getChildByName( name).parent != null ? true : false;
}

function checkContainers():void{
   for( var i:uint = 0; i < this.container.length; i++){
      if( childOnStage( this.container[i] ) ){
         removeChild( this.getChildByName( this.container[i] ) );
      }
   }   
}
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...

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   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2022 Sebastian Wichmann - Flashhilfe.de