Hej alle - kan nogen hjælpe mig med nedenstående klasse i Actionscript 3?
Det overordnede problem er, at eventlisteren altid refererer til sidst oprettede terning (Denne ligger i mit library). Dvs. at selv om jeg klikker terning 1, slår terning 2 et slag - medens hensigten er, at de INDIVIDUELLE terninger slår slag, så den refererer ikke til "this".
I "gamle dage" med AS2 ville jeg nok ha' skrevet noget á la dette: var terning = this.attachMovieClip("terningobjekt", "terningobjekt_mc",......); terning.onRelease = function() { trace("Du har trykket på terning "+this); }
I dag ser den sådan ud - men hvad gør jeg forkert?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Det overvejede jeg også - og lavede denne konstellation:
// Medlemsvariabler public var objektTerning_mc1:MovieClip; public var objektTerning_mc2:MovieClip; private var aktueltslag:int;
public function Terning():void { // Konstruktør for (var i=1; i<3; i++) { this["objektTerning_mc"+i] = new TerningObjekt(); this["objektTerning_mc"+i].x = 150*i; this["objektTerning_mc"+i].y = 200; this["objektTerning_mc"+i].buttonMode = true; addChild(this["objektTerning_mc"+i]); this["objektTerning_mc"+i].addEventListener(MouseEvent.CLICK, kastterning); } }
Koden herover virker - men det ligger mig meget på sinde, ikke kun at få det til at virke, men også forstå de mest hensigtsmæssige måder at programmere på. Det uhensigtsmæssige i ovenstående kode er, at de anvendte movieclips erklæres individuelt. Hvis jeg vil lave 20 terninger - eller f.eks. regnvejr, er det dødens pølse at erklære disse movieclips individuelt.
public var objektTerning_mc1:MovieClip; public var objektTerning_mc2:MovieClip;
Men forstår godt problematikken, og har ikke nogen løsning, det bliver nok lidt svært at refererer til et object hvis det ikke har et uniqt instanse navn.
Fjern gerne mit svar, og se om der kommer noget mere brugbart, jeg er heller ikke super rå til as.
Det øverst er helt korrekt. Du laver IKKE tre terninger med samme instancenavn - der findes ikke rigtig noget, der hedder instancenavne i AS3. Du laver blot 3 terninger, som midlertidigt bliver gemt i samme variabel.
Ofte ville man jo nok gemme dem i et array undervejs, så man kan hente dem frem igen:
public class Terning extends MovieClip { // Medlemsvariabler public var terninger:Array;
public function Terning():void { // Konstruktør var terning:TerningObjekt; terninger = new Array(); for (var i:Number = 1; i < 3; i++) { terning = new TerningObjekt(); terning.name = "terning"+i; terning.x = 150*i; terning.y = 200; terning.buttonMode = true; addChild(terning); terning.addEventListener(MouseEvent.CLICK, kastterning); terninger.push(terning); } }
private function kastterning(me:MouseEvent):void { trace("Du har klikket terning "+me.source); } } }
Det er utestet, men jeg håber du forstår hensigten :)
Synes godt om
Slettet bruger
16. november 2007 - 13:16#5
Hej igen - og tak for jeres svar.
Jeg har erstattet linien "terninger.push(terning)" med "terninger.push(terning.name). Her skrives instancenavnene korrekt og de kan fint refereres til med f.eks. terninger[0].y = 300; Så vidt, så godt.
trace-linien giver - med me.source - dog følgende fejl: "1119: Access of possibly undefined property source through a reference with static type flash.events:MouseEvent".
Hvis blot der traces på "me", vises dette: "[MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=6 localY=-22 stageX=156 stageY=178 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]".
Tilsyneladende kan jeg ikke referere til "source", men til de attributter der er tilknyttet selve EVENT'en - f.eks. me.stageX og som returnerer X-musecursorposition... så selvom event-tildelingen fungerer korrekt, får metoden "kastterning" ikke at vide, hvilket movieclip der kaldte den.
Men lige i samme ombæring et lille bonusspørgsmål, med forlov... Når man i Flash 8 anvender attachMovie, angiver man også en level, mc'et skal indsættes på. Hvis et movieclip indsættes på samme niveau som et andet, forsvinder det gamle. Hvorfor sker dette egentlig? Jeg kan jo sagtens på f.eks. root-level manuelt trække adskillige movieclips fra mit library ind på scenen...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.