PDA

Volledige versie bekijken : variabelen in AS3


B-Mantis
%Europe/Berlin %546 %2007, 14:06
Hey,

Ik ben nu een tijdje bezig met AS3, maar er is een ding waar ik niet uit kan komen:

ik heb mijn programma opgebouwd uit 2 .as bestanden, waarvan de een de document class is, en de andere de 'blauwdruk' van een movieclip.

Alles werkt perfect, mijn document class object maakt een aantal movieclips, en ik wil dat die movieclips reageren op een veranderende var in de stage.

maar ik krijg het niet voor elkaar om de movieclips daadwerkelijk een variabele uit de stage te laten verkrijgen.
value1 = root.value //werkt niet
value1 = stage.value //werkt niet

als ik in de root zelf value trace, traced hij hem goed. Als ik de stage de variable naar de movieclip laat schrijven, werkt het ook en heeft de movieclip de juiste waarde. Maar ik wil dat de movieclip die waarde ZELF uit de stage oproept.

Ik hoop dat ik een beetje duidelijk ben over mijn probleem,

alvast bedankt!

EDIT:

ik heb wat vooruitgang geboekt maar het probleem nog niet opgelost:
ik heb mijn movieclip een variable meegegeven als hij gemaakt wordt.
mc.myparent = this;

nu heb ik in mijn movieclip de volgende code gezet:
ps: TestBox is de naam van mijn document class.

trace(myparent); // geeft: [object TestBox]
trace(root); // geeft: [object TestBox]
trace(parent); // geeft: [object TestBox]
trace(root == myparent); // geeft: true

nu het vreemde gedeelte:
trace(myparent.var) //geeft de waarde van var.
trace(root.var) //geeft een error! !?
trace(parent.var) //geeft een error! !?

nog steeds is mijn probleem niet opgelost want ik wil niet met het hele parent-systeem werken.

TheDutch
%Europe/Berlin %717 %2007, 18:13
Laat al je code eens zien en ook graag de error berichten :).

B-Mantis
%Europe/Berlin %733 %2007, 18:36
mijn code is een beetje groot en ik wil het jullie niet aandoen er helemaal doorheen te moeten kijken. Daarbij is mijn vraag meer algemeen. Ik ben even bezig geweest en ben tot de conclusie gekomen dat ik gewoon niet weet hoe ik naar bepaalde MovieClips kan 'linken'.
Ik zal de basis van mijn programma uitleggen:

Mijn document class is 'TestBox', dat is het bestand 'TestBox.as'
Deze movieclip maakt 30 nieuwe movieclips, volgens de methode:

var newpoint: MovieClip = new point(x,y,new Array(0,0,550,300));
addChild(newpoint);
allpoints.push(newpoint);
//en zet nog een extra waarde:
newpoint.myparent = this;
Dit is het resultaat (http://www.pivotgames.com/TestBox.swf)

op dit moment is de point dus een child van de root. Heb ik dat goed?

als ik echter in het object point probeer the refereren naar root.valuex of parent.valuex geeft hij de volgende foutmelding:

1119: Access of possibly undefined property valuex through a reference with static type flash.display:DisplayObject.

ik heb in zowel point.as als TestBox.as import flash.display.*; staan
ook heb ik valuex gedefinieerd.

echter als ik in point zeg:
myparent.valuex
dan krijg ik vrolijk de juiste waarde door.

misschien heb ik mijn TextBox.as bestand statisch gemaakt terwijl hij dynamisch moet zijn? Hoe doe ik dat? :P bedankt!

TheDutch
%Europe/Berlin %741 %2007, 18:47
op dit moment is de point dus een child van de root. Heb ik dat goed?
Dat is correct :)

Probeer eens parent["valuex"] of nog beter, te casten (wat veel gebruikt moet worden bij AS 3):

* TestBox(parent).valuex
* (parent as TestBox).valuex

De property "parent" weet namelijk niet van welke subclass van DisplayObject hij afstamt. Daarom kan het zijn dat de compiler de property "valuex" niet herkent in de DisplayObject class. Wanneer je de compiler via casting verteld dat het om de subclass TestBox van DisplayObject gaat dan zal hij hoogstwaarschijnlijk wel de property "valuex" herkennen :).

B-Mantis
%Europe/Berlin %747 %2007, 18:56
dat gaat niet werken. addChild returnt een DisplayObject.
En daarbij kan dit het probleem niet zijn, aangezien mc.myparent het ENIGE is wat wel werkt :P
Wat ik me nu afvraag is; hoe kan ik een willekeurige MovieClip uit mijn stage een variable van die stage laten oproepen.
Oftewel:
hoe vertaal ik AS2:
this.var_a = _root.var_b;
naar AS3?

B-Mantis
%Europe/Berlin %749 %2007, 18:59
Super!!
trace(root["keypressed"]); //geeft mijn waarde

ik had
trace(root[keypressed]);
geprobeerd :S

bedankt he!


* TestBox(parent).valuex
* (parent as TestBox).valuex
werken beiden ook, maar ik zie er geen logica in.. Hoe kan
TestBox(parent) een waarde hebben voor mijn mc? is het een ingeprogrammeerde functie?

TheDutch
%Europe/Berlin %751 %2007, 19:02
Probeer het casten ook even want scope[""] is eigenlijk bad practice in dit geval :).

TheDutch
%Europe/Berlin %759 %2007, 19:13
* TestBox(parent).valuex
* (parent as TestBox).valuex
werken beiden ook, maar ik zie er geen logica in.. Hoe kan
TestBox(parent) een waarde hebben voor mijn mc? is het een ingeprogrammeerde functie?
Wanneer je een class zonder het keyword "new" om een element heen wrapped, dan probeert ActionScript het element te type casten naar die type class. Met het keyword "as" kan je ditzelfde bereiken en dat is overigens nieuw sinds AS 3. Type casten is soms nodig om de compiler precies te vertellen om welke class het gaat wanneer het data type niet als zodanig is aangegeven maar als bijvoorbeeld een ancestor class of helemaal geen type. Een ander doel kan zijn om de compiler voor de gek te houden door een element zichzelf voor te laten doen als iets anders dan het werkelijk is. Je moet er maar eens op Googlen er is een hoop over te vinden :).

B-Mantis
%Europe/Berlin %759 %2007, 19:13
ik probeer ik dit geval naar de root te linken. Maar ik zal je tips onthouden. nog een vraagje extra: Ik AS2 gebruikte ik heel vaak get("movieclip"+i) om bijv. movieclip1 tm movieclip10 te kunnen bewerken. Hoe kan ik dit in AS3?

TheDutch
%Europe/Berlin %761 %2007, 19:15
Net zoals in AS 2 kan je in AS 3 dit doen:

// Het keyword "this" is hier de scope die naar het huidige object verwijst.
// Het kan net zo goed dit zijn: root.object1.object2["movieclip"+i].
this["movieclip"+1];

B-Mantis
%Europe/Berlin %767 %2007, 19:25
super! nogmaals bedankt! dit wordt allemaal in mijn persoonlijke 'belangrijke zaken' bestandje opgeslagen =D

TheDutch
%Europe/Berlin %779 %2007, 19:43
Top! :D
Graag gedaan.

r0cker20
%Europe/Berlin %400 %2007, 10:37
Is is volgens mij het zelfde probleem als waar ik mee worstel.

voorbeeld:

public var targetx:Number;

mymovieclip.targetx = 40;


Dit pikt as3 helaas niet

error:
ReferenceError: Error #1056: Cannot create property targetX on Ball.
at com.vdelden::Utils/onEnterFrame()

TheDutch
%Europe/Berlin %331 %2007, 08:57
Laat al je code even zien, hier kunnen we weinig mee :).

Gokje: Wanneer Ball een subclass is van MovieClip moet je er wel voor zorgen dat deze ook "dynamic" is net als de MovieClip class.

r0cker20
%Europe/Berlin %713 %2007, 18:07
Laat al je code even zien, hier kunnen we weinig mee :).

Gokje: Wanneer Ball een subclass is van MovieClip moet je er wel voor zorgen dat deze ook "dynamic" is net als de MovieClip class.

Ik heb die targetx in de Ball class gedefineerd als variable waardoor ik hem niet eens dynamisch hoef te maken.. Dom dat ik hier niet gelijk aan dacht maar toch bedankt Dutch!