[AS3] check if movieclip exists

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • edwinistrator
  • Registratie: December 2000
  • Laatst online: 23-03-2022
Ik heb een movieClip aangemaakt met de volgende code:
Flash ActionScript:
1
2
3
var thumbContainer:MovieClip = new MovieClip();
thumbContainer.name = "thumbContainer";
stage.addChild (thumbContainer);



Als het venster groter/kleiner wordt wil ik alles weer netjes op zijn plek zetten. Dus heb ik een stage Eventlistener. Nu wil ik kijken of een mc bestaat om deze dan ook netjes op zijn plek te zetten. Ik heb verschillende manieren geprobeerd maar krijg steeds een error als deze niet bestaat.

1120: Access of undefined property thumbContainer.

Flash ActionScript:
1
2
3
if (this.getChildByName("thumbContainer") != null) {
    trace("bestaat")
}

Flash ActionScript:
1
2
3
if ("thumbContainer" in this) {
    trace("bestaat")
}

Flash ActionScript:
1
2
3
function hasClipInIt (mc: MovieClip):Boolean {
    return mc != null && contains(mc);
}

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Is het niet makkelijker om met een "for each stageobject in mc"-achtig iets door de wél aanwezige objecten heen te fietsen dan ze allemaal te gaan proben? Ik ben niet into actionscript maar zoiets moet toch haast wel kunnen.

Edit: for..in en for each..in
Volgens mij krijg je dan (in je movieclip) iets als "for(var obj in this) { ... }" of (als mc een parameter van een functie is) iets als "for(var obj in mc) { ... }"

[ Voor 49% gewijzigd door RobIII op 17-02-2010 19:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • edwinistrator
  • Registratie: December 2000
  • Laatst online: 23-03-2022
"for each stageobject in mc" zou in dit geval wel een oplossing kunnen zijn maar ik kom het probleem vaker tegen. En nu wil ik natuurlijk ook weten hoe het moet. Als ik met actionscript een mc maak zou je die toch gewoon aan moeten kunnen spreken? :)

Nu werkt de check wel, als mc exists maar nou kan ik de mc niet aanspreken, dus geen x of alpha aanpassen... :|

code:
1
2
3
4
5
6
7
8
9
10
var thumbContainer:MovieClip = new MovieClip();
thumbContainer.name = "test";
thumbContainer.x = 10;
stage.addChild (thumbContainer);
if (this.getChildByName("test") == null) {
    trace ("test exists"); //Works!
    this.getChildByName("test").x = 10; //Works not!
    stage.test.x = 10; //Works not!
    this.test.x = 100; //Works not!
}

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Huh? Op regel 5 is de conditie: Wanneer getChildByName() NULL geeft ( == null). Als dat zo zou zijn dan klopt regel 6 natuurlijk niet; dan is het trace ("test doesn't exist"). En aangezien 'ie daar dan komt volgens jou dan werkt regel 5 niet. En dat verklaart dan ook waarom 7-9 niet werken dan.

Je zou je conditie dus moeten schrijven als:
JavaScript:
1
2
3
if (this.getChildByName("test") != null) {
...
}

[ Voor 17% gewijzigd door RobIII op 18-02-2010 00:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Alfredo
  • Registratie: Maart 2007
  • Laatst online: 31-07 19:40
Je voegt je MC rechtstreeks toe aan je stage, maar probeert hem nadien op te roepen met "this". En this verwijst niet naar je stage, maar naar je tijdslijn. Je hebt dus:
code:
1
2
3
stage --------> this
   |
   -----------> thumbContainer

thumbContainer is geen child van this, waardoor je hem via this.getChildByName ook niet kan oproepen.

code:
1
2
3
4
5
6
var thumbContainer:MovieClip = new MovieClip();
thumbContainer.name = "thumbContainer";
addChild (thumbContainer);
if (getChildByName("thumbContainer") != null) {
    trace("bestaat")
}

geeft
code:
1
stage --------> this ---------> thumbContainer

en zou dus je trace wel moeten uitvoeren.

[ Voor 3% gewijzigd door Alfredo op 18-02-2010 00:40 ]


  • edwinistrator
  • Registratie: December 2000
  • Laatst online: 23-03-2022
helder, works like a charm

ik zat er behoorlijk naast.

  • edwinistrator
  • Registratie: December 2000
  • Laatst online: 23-03-2022
probleem in het verlengde daar van.. hoe kan ik een nested movieclip aanspreken?
Heb me helemaal suf gegoogled maar en volgens mij ben ik ook niet de enige (beginner) met dit probleem. Ik heb nu dit maar dat mag niet / kan niet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function makeMc () {
    var container:MovieClip = new MovieClip();
    container.name = "container";
    var mc = new MovieClip();
    mc.name = "mc";
    container.addChild (mc);
    addChild (container);
    testIt ();
}
function testIt () {
    //trace(container) // mag niet
    trace(getChildByName("container")) // werkt [object]
    trace(getChildByName("container").getChildAt(0)) 
}

makeMc()

  • Alfredo
  • Registratie: Maart 2007
  • Laatst online: 31-07 19:40
Je bent wederom in de foute richting aan het denken. Dit heeft niets met nesting te maken, maar met de scope van je variabelen. Container wordt gedeclareerd in makeMc en is daarom ook enkel in makeMc beschikbaar.

Of je declareert container globaal (instantie aanmaken mag wel binnen een functie, kan echter ook globaal gebeuren). Of je geeft hem mee als parameter.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var container:MovieClip;

function makeMc () {
    container = new MovieClip();
    container.name = "container";
    var mc = new MovieClip();
    mc.name = "mc";
    container.addChild (mc);
    addChild (container);
    
    var container2:MovieClip = new MovieClip();
    container2.name = "container2";
    
    testIt (container2);
}
function testIt (con2:MovieClip) {
    trace("Container globaal: " + container.name);
    //trace(mc); mc is globaal niet gekend
    trace("Mc via container: " + container.getChildAt(0).name);
    trace("Container2 lokaal als parameter: " + con2.name);
}

makeMc();


Dit is een basisprincipe in zowat alle programmeertalen. Het zou geen kwaad kunnen die basis eens op te frissen. :)

Acties:
  • 0 Henk 'm!

  • edwinistrator
  • Registratie: December 2000
  • Laatst online: 23-03-2022
thanks voor de duidelijkheid.
Ik moet inderdaad het grote AS3 boek er bij pakken want ik was toch wel weer even zoet om uit te zoeken hoe ik van uit een movieclip een functie op de timeline moet aanspreken :s

MovieClip(parent).doemijnfunctie();
Pagina: 1