PDA

Volledige versie bekijken : addChild met evt.target.name


Argama91
%Europe/Berlin %603 %2010, 14:28
Dag,
Ik heb een probleem met een addChild en het zit zo:

_____________

this.mcmuziekdrager_1.addEventListener(MouseEvent. MOUSE_DOWN, onStartDrag);

function onStartDrag(evt:MouseEvent):void {

var nieuweMC = new evt.target.name + "a"();
addChild(nieuweMC);
}

_____________

Ik zou dus willen dat de movieclip aangemaakt door de addChild gelijk is aan de naam 'mcmuziekdrager_1' +a = mcmuziekdrager_1a omdat ik deze zo heb geexporteerd voor AS in mijn bibliotheek.

Ik weet niet goed of dit de juiste denk wijze is.
Als iemand het probleem ziet.. :)

Alvast bedankt.

jaspermuts
%Europe/Berlin %614 %2010, 14:45
Ik denk dat het niet de goede denkwijze is, volgens mij haal je een instantienaam en een classnaam door elkaar.
Dat wat je in je library hebt staan en ge-exporteerd voor AS met een bepaalde naam, die naam is de class naam (daarbij kun je 'new <classnaam>()' doen ), namen als this.<naam> is de instantienaam.
Heb je nu in je library allerlei mc's staan die ge-exporteerd zijn naar '<andereclassnaam>a' (lijkt me beetje stug/vreemd):

var nieuweMC:MovieClip = new (getDefinitionByName(evt.target.name + 'a') as Class)()'
Wil je een nieuwe mc als this.mcmuziekdrager_1a vandezelfde class opslaan:

this[evt.target.name + 'a'] = new JeClassNaam();
Als je met externe classes werkt moet je (normaal gesproken) wel zorgen dat je this.mcmuziekdrager_1a ergens hebt gedeclareerd.

Argama91
%Europe/Berlin %624 %2010, 14:59
Enorm bedankt voor uw snelle reactie, nu werkt het.
Mijn fout was dat ik niet wist dat je in de code moest zetten dat het om een class ging
" as Class)" ik dacht dat het niet uitmaakte binnen AS3.

Dit lost mijn probleem op en ik dank u nogmaals voor uw hulp. :)

jaspermuts
%Europe/Berlin %917 %2010, 22:00
Zo zit het niet helemaal, 'variabele as <classnaam>' of '<classnaam>(variabele)' is 'casten', daarbij vertel je expliciet welke class de variabele moet zijn.
de definitie van getDefinitionByName is de volgende
public function getDefinitionByName(name:String):ObjectDe functie returnt dus altijd een object, maar 'new <object>()' is geen geldige syntax, dus vertel je flash eerst, nee het is geen object, maar een class.

Een beter voorbeeld is misschien de volgende, zie de implementatie van de function addChild:

public function addChild(child:DisplayObject):DisplayObject
En zie de volgende code, waarvan je misschien verwacht dat het zou werken.

var mc:MovieClip = addChild(new MovieClip());
Dat geeft een error: 1118: Implicit coercion of a value with static type flash.display:DisplayObject to a possibly unrelated type flash.display:MovieClip.addChild returnt een DisplayObject, niet een MovieClip. MovieClip is wel DisplayObject (het is er een subclass van), maar een DisplayObject is niet per definitie een MovieClip. Je kunt door te casten wel zeggen: hee! return dit eens als een MovieClip:

var mc:MovieClip = addChild(new MovieClip()) as MovieClip;
// of
var mc:MovieClip = MovieClip(addChild(new MovieClip()));
En dat geeft geen error :)

e.l.dam
%Europe/Berlin %094 %2010, 02:16
En Jasper is geen u hoor. Is wel netjes, maar u gaat wat ver. Dan voelt die jongen zich ook zo oud ;)

jaspermuts
%Europe/Berlin %401 %2010, 09:38
En Jasper is geen u hoor. Is wel netjes, maar u gaat wat ver. Dan voelt die jongen zich ook zo oud ;)
Nee, dan voelt ie zich gerespecteerd. En dat is wel nodig natuurlijk ;)
Maar goed, nee, vousvoyeren hoeft niet!

Argama91
%Europe/Berlin %493 %2010, 11:50
Aha!
Dank je ;) voor deze verduidelijking, ik ben nog niet helemaal thuis in AS.
Bij deze heb ik weer iets bijgeleerd :).

Argama91
%Europe/Berlin %905 %2010, 21:43
Dag,
Ik heb het nog steeds niet helemaal vast :[V] .
Hij geeft terug een error.
MCraak is een MovieClip op de stage.
MChit is een MovieClip in geladen via een addChild.


function activeer():void {

if (MCraak.hitTestObject(getDefinitionByName(MChit)as Class)) {
trace("raak");
}
}

Error: 1067: Implicit coercion of a value of type Class to an unrelated type String.

Mvg, Argama

Argama91
%Europe/Berlin %826 %2010, 19:50
Ik heb het ook geprobeerd met as MovieClip maar ook dit heeft geen effect.

jaspermuts
%Europe/Berlin %049 %2010, 01:11
MChit is een classnaam (een 'value of type Class') en getDefinitionByName verwacht een String (an unrelated type String).
ik weet niet waarom je getDefinitionByName gebruikt bij een hitTest, dat is niet nodig en ook niet mogelijk.
Is dit niet gewoon wat je wil?

function activeer():void {

if (MCraak.hitTestObject(MChit)) {
trace("raak");
}
}

Is MChit een MovieClip of een class?
Heb je ergens var MCHit : MovieClip = .... staan, dan is het een MovieClip,
Heb je bij de instance name in het properties panel 'MCHit' ingevuld, dan is het een MovieClip,
Heb je de MovieClip ge-exporteerd voor AS en bij de class naam 'MCHit' ingevuld, dan is het een class.

Argama91
%Europe/Berlin %773 %2010, 18:34
Dag,
Die code was mijn eerste poging maar deze werkte niet.
MCraak is een MovieClip op de stage met instance naam MCraak.
MChit is er eentje die via een addChild word in geladen.
Ik weet niet hoe ik kan aangeven in AS3 dat MChit een Class is.

Dank alvast voor bovenstaande reacties :)

jaspermuts
%Europe/Berlin %565 %2010, 13:34
Je hoeft niets aan te geven, het zit wel goed, maar ik moest even zeker weten of mijn vermoedens juist waren. Als de code uit mijn vorige reactie niet werkt moet je dat even aangeven en ook wat er wel/niet gebeurt en wat je niet/wel verwacht.
Trouwens, hoe je een class kunt toewijzen leg ik in post #2 uit.

Argama91
%Europe/Berlin %722 %2010, 17:20
Dag,
wel ik verwacht is dat wanneer de MovieClip ingeladen via een addChild geraakt word door een MovieClip die al op de stage staat er een trace gedaan word. Ik heb nu niets aangegeven zoals je zei maar dan krijg ik volgende error: 1067: Implicit coercion of a value of type Class to an unrelated type flash.display:DisplayObject.

De MovieClip ingeladen via de addChild staat in de bibliotheek voor AS3 geëxporteerd als MChit. De MovieClip op de stage MCraak heeft de instantie naam: MCraak.

Wederom bedankt voor uw reactie :).

jaspermuts
%Europe/Berlin %960 %2010, 23:02
Het klopt niet helemaal wat je zegt want je hebt nu dus wél aangegeven dat MChit een class is (geëxporteerd voor AS). Je moet de hittest niet met de classnaam doen maar met de instantie-/varnaam, dus als je var nieuweMC: MChit = new MChit() hebt, dan gebruik je 'nieuweMC' in de hittest. Besef teglijk wel dat een var die je binnen een functie declareert daar buiten niet beschikbaar is.

Argama91
%Europe/Berlin %710 %2010, 17:02
Dag,
geen error meer maar nu geeft hij steeds test in de output.

"...
test
test
test
test
test
..."

Nu moet ik er wel bij zeggen dat de addChild (MChit) staat bij het uitvoeren van die functie nog niet op de stage staat. Maar dit kan ik niet wijzigen mits MCraak van .y positie wijzigt op ritme van een timer en telkens deze timer gaat wil ik dat activeer() word uitgevoerd.

jaspermuts
%Europe/Berlin %826 %2010, 19:50
In de code die je op het forum plaatst staat nergens 'test', dus dat is niet te verklaren zonder meer informatie

Argama91
%Europe/Berlin %840 %2010, 20:09
Arg, sorry, ik had de trace("hit"); vervangen met trace("test");. Sorry voor dit.
Maar het probleem blijft gelijk.