Avatar billede Slettet bruger
16. november 2007 - 10:53 Der er 7 kommentarer

Dynamisk oprettelse i Actionscript 3

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?

package {
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
   
    public class Terning extends MovieClip {
        // Medlemsvariabler
        public var objektTerning_mc:MovieClip;

        public function Terning():void {
            // Konstruktør
            for (var i=1; i<3; i++) {
                objektTerning_mc = new TerningObjekt();
                objektTerning_mc.name = "terning"+i;
                objektTerning_mc.x = 150*i;
                objektTerning_mc.y = 200;
                objektTerning_mc.buttonMode = true;
                addChild(objektTerning_mc);
                objektTerning.addEventListener(MouseEvent.CLICK, kastterning);
            }
        }
       
        public function kastterning(Event:MouseEvent) {
            trace("Du har klikket terning "+this);
        }
    }
}
Avatar billede jokkejensen Novice
16. november 2007 - 11:03 #1
Du opretter også 3 terninger med samme instans navn.. det er nok det der får det hele til at drille lidt.

tag variablen i og lig til dit instance navn..

Her er noget af mit gammel kode:

        _root["RadioLabel"+i].color = 0xFFFFFF;       
        _root["RadioLabel"+i].multiline = true;
        _root["RadioLabel"+i].html = true;
        _root["RadioLabel"+i].text = RadioLabel;

/JJ
Avatar billede Slettet bruger
16. november 2007 - 11:19 #2
Hej Jokkejensen

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.
Avatar billede jokkejensen Novice
16. november 2007 - 11:34 #3
Du behøver ikke:

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.

/JJ
Avatar billede barklund Nybegynder
16. november 2007 - 12:15 #4
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:

package {
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
 
    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 :)
Avatar billede 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.
Avatar billede barklund Nybegynder
16. november 2007 - 13:45 #6
me.target hedder den vist :)
Avatar billede Slettet bruger
19. november 2007 - 00:30 #7
Ahr, men sk**egodt. Send svar, så får du point.

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...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester