Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[AS3]Probleem met overerving en static members

Pagina: 1
Acties:

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik ben bezig met een spelletje te maken.

Hierin heb ik allerlei figuren die ik dynamisch in AS aanmaak. Om niet heel veel if constructies en zo te maken, heb ik besloten om voor elk figuur een apparte class aan te maken en dan een basis class Figuur die de basiseigenschappen bevat:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package figuren
{
    import flash.display.MovieClip
    public class Figuur extends MovieClip
    {
        //public static const NAME:String = "undefined";
        //public static const DESCRIPTION:String = "undefined";
        
        public function getName()
        {
            return NAME;
        }
        public function getDescription()
        {
            return DESCRIPTION;
        }
    }
}   


De aparte figuren extenden dus deze class.

Hier is een voorbeeld van een figuur:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
package figuren
{
    import flash.display.MovieClip;
    import figuren.Figuur;
    public class Hond extends Figuur
    {
        public static const NAME:String = "hond";
        public static const DESCRIPTION:String = "Woef! Woef! Een hond.";
    }
}   


Wat ik hiermee wil bereiken is dat als er op zo'n figuur geklikt wordt bijvoorbeeld, dat ik dan kan doen.

Flash ActionScript:
1
2
3
4
function figuur_click(e:MouseEvent)
{
trace(e.target.getName());
}


Het probleem is nu dat hij de NAME en DESCRIPTION van de basisclass neemt, ipv de aparte figuren. Ik krijg dus undefined.

Heeft iemand een idee hoe ik dit kan oplossen zonder dat ik elk figuur weer moet gaan aanpassen?

[ Voor 5% gewijzigd door compufreak88 op 25-03-2008 14:31 ]


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Misschien een stomme vraag, maar moet het niet return this.NAME zijn?

TabCinema : NiftySplit


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 17-11 10:19
Volgens mij is dit de betere manier van aanpakken:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package figuren
{
    import flash.display.MovieClip
    public class Figuur extends MovieClip
    {
        public var NAME:String = "undefined";
        public var DESCRIPTION:String = "undefined";

                public function Figuur(NAME:String, DESCRIPTION:String) {
                    this.NAME = NAME;
                    this.DESCRIPTION= DESCRIPTION;
                }
        
        public function getName()
        {
            return NAME;
        }
        public function getDescription()
        {
            return DESCRIPTION;
        }
    }
}   


Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
package figuren
{
    import flash.display.MovieClip;
    import figuren.Figuur;
    public class Hond extends Figuur
    {
         public function Hond() {
                    super("WOEF", "HOND");
                }
    }
}   


Ben zelf geen AS3 dev, dus er kan wel is ergens een foutje instaan :)

[ Voor 89% gewijzigd door DaRKie op 25-03-2008 15:44 ]


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Heel erg bedankt. De oplossing van daRKie werkt goed.

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 26-05 15:01

XangadiX

trepanatie is zóó kinderachtig

volgens mij hoeft in package frituren figuren van Darkie movieclip ook niet te importeren want dat wordt al gedaan in het package figuur

Stoer; Marduq


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Bij nader inzien werkt deze oplossing nog niet helemaal zoals de bedoeling was. Want op het moment dat ik de name nodig heb, heb ik geen object, maar alleen de class zelf.

Ik heb nu geprobeerd een combinatie van beide methoden toe te passen.

Dit is de parrent op het moment:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package figuren
{
    import flash.display.MovieClip
    public class Figuur extends MovieClip
    {
        public static var mName:String = "un defined";
        public static var mDescription:String = "undef ined";
        
        public function Figuur(Name:String, Description:String)
        {
            super();
            mName = Name;
            mDescription = Description;
            
        }
        
        public function getName()
        {
            return mName;
        }
        public function getDescription()
        {
            return mDescription;
        }
    }
}   


En een child:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package figuren
{
    import figuren.Figuur;
    public class Hond extends Figuur
    {
        public static var mName:String = "honden"
        public static var mDescription:String = "Woef! Woef! Een hond"
        
        public function Hond()
        {
            super(mName, mDescription);
        }
    }
}   


Als ik nu gewoon een simpel voorbeeld neem:

Flash ActionScript:
1
2
3
var f:Figuur = new Poes();
trace(Poes.mName);
trace(f.getName());


Dan krijg ik elke keer poezen terug.

Maar nu heb ik dus een mouse_over event handler eraan toegevoegd, en als dan doe:

Flash ActionScript:
1
2
3
4
function figuur_over(e:MouseEvent)
{
    trace(e.target.getDescription());
}


Dan krijg ik elke keer hetzelfde terug, ook al ga ik over verschillende figuren heen..

Ik heb het idee dat die static waarde gewoon overschreven wordt. Dat gaat dus niet echt werken.

Heeft er iemand een idee hoe ik dit toch nog werkend krijg? Anders zal ik het helemaal anders moeten aanpakken, maar dat komt er op neer dat ik elke keer allemaal if statements moet gaan schrijven.

Verwijderd

compufreak88 schreef op woensdag 26 maart 2008 @ 10:49:
Dan krijg ik elke keer hetzelfde terug, ook al ga ik over verschillende figuren heen..

Ik heb het idee dat die static waarde gewoon overschreven wordt. Dat gaat dus niet echt werken.

Heeft er iemand een idee hoe ik dit toch nog werkend krijg? Anders zal ik het helemaal anders moeten aanpakken, maar dat komt er op neer dat ik elke keer allemaal if statements moet gaan schrijven.
Ach, het was weer ff geleden dat ik op tweakers w&g was en ik kon dit wel gebruiken voor een workshop. Here we go :

Figure class ... eigenlijk een bijna abstract.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.demo.inheritance
{
    import flash.display.Sprite;
    
    public class Figure extends Sprite
    {
        
        protected var _name:String = "FigureName";
        protected var _description:String = "Description";
        
        public function Figure(name:String, description:String)
        {
            super();
            _name = name;
            _description = description;
        }
        
        /**
         *  draw();
         * 
         *  draws the figures shape in this sprite.
         */
         public function draw():void
         {
            throw new Error("Draw not implemented on this figure");
         }
        
        
        /**
         *  getName();
         * 
         * returns a String - the name of the figure
         */
        public function getName():String
        {
            return _name;   
        }
        
        /**
         *  getDescription();
         * 
         * @returns a String describing the figure
         */
        public function getDescription():String
        {
            return _description;    
        }

    }
}


Hier's je hond
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.demo.inheritance
{
    public class Dog extends Figure
    {
        public static var DEFAULT_NAME:String = "Dog";
        public static var DEFAULT_DESCRIPTION:String = "A dog typically goes woof.";    
        
        public function Dog()
        {
            super(Dog.DEFAULT_NAME, Dog.DEFAULT_DESCRIPTION);
        }
        
        override public function draw():void
        {
            //trace("We will draw a dog here");
            graphics.clear();
            graphics.beginFill(0xFFFFFF,1);
            graphics.drawRect(-50,-50,100,100);
            graphics.endFill();
        }
        
        /**
         *  bark();
         * 
         * make this doggy bark !
         * 
         */
        public function bark():void
        {
            trace(_name + " goes all sparky on ya!");
        }
    }
}


Hier's je kat.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.demo.inheritance
{
    import flash.display.Graphics;
    
    public class Cat extends Figure
    {
        public static var DEFAULT_NAME:String = "Cat";
        public static var DEFAULT_DESCRIPTION:String = "A cat is an animal that likes to purr"; 
        
        public function Cat()
        {
            super(Cat.DEFAULT_NAME, Cat.DEFAULT_DESCRIPTION);
        }
        
        override public function draw():void
        {
            //trace("We will draw a cat here - for now a circle");
            graphics.clear();
            graphics.beginFill(0xFFFFFF,1);
            graphics.drawCircle(0,0,50);
            graphics.endFill();
        }
        
        /**
         *  purr();
         * 
         * make this pussy purr.
         */
        public function purr():void
        {
            trace(_name + " purrrrrrrrrzzz");
        }
        
    }
}


En dit is een voorbeeld voor je application / document class
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package {
    import com.demo.inheritance.Cat;
    import com.demo.inheritance.Dog;
    import com.demo.inheritance.Figure;
    
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class InheritanceDemo extends MovieClip
    {
        protected var myCat:Cat;
        protected var myDog:Dog;
        
        public function InheritanceDemo()
        {
            init();
        }
        
        protected function init():void
        {
            myCat = new Cat();
            trace(myCat.getName(), myCat.getDescription());
            //Trace output = Cat A cat is an animal that likes to purr
            myCat.purr();
            //Trace output = Cat purrrrrrrrrzzz
            myCat.draw();
            
            myDog = new Dog();
            trace(myDog.getName(), myDog.getDescription());
            //Trace output = Dog A dog typically goes woof.
            myDog.bark();
            //Trace output = Dog goes all sparky on ya!
            myDog.draw();
            
            myCat.addEventListener(MouseEvent.CLICK, onFigureClick);
            myDog.addEventListener(MouseEvent.CLICK, onFigureClick);
            
            myDog.y = 150;
            
            addChild(myCat);
            addChild(myDog);
        }
        
        protected function onFigureClick(event:MouseEvent):void
        {
            if(event.target is Figure){
                var figure:Figure = event.target as Figure;
                trace("Click on : ", figure.getName());
            }   
        }       
    }
}


Overigens heb ik je benaming en huidige class layout maar even overgenomen, maar eigenlijk zou je het voor grotere projects wat meer moeten abstracten naar onderliggende classes...figure is wel super abstract, maar een hond en een kat hebben natuurlijk meer gemeen op een lager niveau dan door enkel een "figure" word beschreven.

Enjoy!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Hoi, bedankt voor de uitleg. Ik snap wel hoe inheritance werkt. Het probleem was dat ik de discription en van een instance en van de class moest kunnen krijgen.

Ik heb een array met de classes van alle figuren erin. Dus nog niets geïnstantieerd. Daaruit haal ik dan een willekeurig figuur, haal de informatie op, en geef hem dan aan een functie die verschillende instanties van dat figuur maakt.

Ik heb het nu maar anders op gelost door de functies getName en getDescription maar apart in elke subclass te overriden, zodat hij _name van de subclass pakt, ipv de _name van de superclass. In AS3 worden static variabelen niet overgeërfd. Dus als je dan de methodes aanroept die in de superclass worden gedefinieerd, dan geeft hij de informatie van de superclass terug, ipv degene die in de subclass staan.

Wat vervolgens ook nog een probleem is, is dat als je de gevens static in de superclass op slaat, hij de informatie steeds overschrijft. Je krijgt dus elke keer de informatie terug van de laatst geinstantieerde class terug.

Maar zoals ik het nu heb, werkt het, al is het zo dat ik voor elk figuur alles steeds moet aanpassen.

Verwijderd

compufreak88 schreef op donderdag 27 maart 2008 @ 09:50:
Hoi, bedankt voor de uitleg. Ik snap wel hoe inheritance werkt. Het probleem was dat ik de discription en van een instance en van de class moest kunnen krijgen.

Ik heb een array met de classes van alle figuren erin. Dus nog niets geïnstantieerd. Daaruit haal ik dan een willekeurig figuur, haal de informatie op, en geef hem dan aan een functie die verschillende instanties van dat figuur maakt.

Ik heb het nu maar anders op gelost door de functies getName en getDescription maar apart in elke subclass te overriden, zodat hij _name van de subclass pakt, ipv de _name van de superclass. In AS3 worden static variabelen niet overgeërfd. Dus als je dan de methodes aanroept die in de superclass worden gedefinieerd, dan geeft hij de informatie van de superclass terug, ipv degene die in de subclass staan.

Wat vervolgens ook nog een probleem is, is dat als je de gevens static in de superclass op slaat, hij de informatie steeds overschrijft. Je krijgt dus elke keer de informatie terug van de laatst geinstantieerde class terug.

Maar zoals ik het nu heb, werkt het, al is het zo dat ik voor elk figuur alles steeds moet aanpassen.
Sorry, ik denk dat je nogmaals even door mijn gegeven oplossing moet kijken; dit werkt nl naar behoren, en is in alle redeliijkheid een betere oplossing dan methods overschrijven.

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Mijn excuses, ik had er net even iets te snel over heen gelezen.

Ik heb te weinig tijd om het te testen, maar wat krijg je als je doet:

Flash ActionScript:
1
2
3
4
var f:figure = Cat;
trace(f._name);
f = Dog;
trace(f._name);

Verwijderd

compufreak88 schreef op donderdag 27 maart 2008 @ 10:21:
Mijn excuses, ik had er net even iets te snel over heen gelezen.

Ik heb te weinig tijd om het te testen, maar wat krijg je als je doet:

Flash ActionScript:
1
2
3
4
var f:figure = Cat;
trace(f._name);
f = Dog;
trace(f._name);
Dat stukje code gaat zowiezo niet werken.
Flash ActionScript:
1
2
var f:Figure = Cat; //Gaat niet werken omdat Cat van type Class is, geen instantie van Cat die een subclass van figure is.
trace(f._name) // Gaat dus al helemaal niet werken omdat f nu null is.


Het lijkt me beter dat je uitlegt wat je probeert te doen / voor elkaar te krijgen. In ieder geval ga ik je niet helpen als ik je een volledige oplossing sourcecode geeft + antwoorden en je dan niet zelf de tijd ervoor neemt, beetje belachelijk, snap je zelf ook wel.

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Sorry dat het lijkt of ik er geen tijd voor neem, maar ik ben bezig met een schoolopdracht, waar ik vorderingen mee wilde maken.

Ik heb een scène waarin ik willekeurig afbeeldingen wil laten komen. Maar om niet elke keer met if-statements alles te moeten controlleren, heb ik aparte classes gemaakt voor elk figuur, en dan de informatie in de classes gezet.

Ik heb dus een hoofdfunctie die alles in gang zet. Die haalt oa een willekeurig figuur op (class van de figuur), moet dan een geluid afspelen, afhankelijk van de opgehaalde figuur, en geeft die class dan door aan een functie die dan een bepaalde hoeveelheid instanties van die class in een movieclip zet.

In de hoofdfunctie heb ik dus nog geen instantie van de class, alleen maar de class zelf.

Als je dan een event op zo'n figuur afhandelt, heb je wel te maken met een instantie. Het is dus nodig om enerzijds de informatie op te halen uit de class zelf, en anderzijds de informatie uit een instantie van de class.

Nu werkt AS3 wel een beetje mee, door dat je vanuit de instantie van de class rechtstreeks bij de statische variabelen kan. Zodoende heb ik dus die functies gemaakt die de informatie teruggeeft.

Het probleem wat ik eerst dus had, dat ik steeds dezelfde waarde terugkreeg, heeft te maken met het feit dat je maar 1 statische superclass hebt. Er kan dus maar informatie van 1 class in opgeslagen worden.

Ik heb dit probleem nu opgelost dus door in elke class de functies te overriden, zodat hij die informatie gewoon uit de eigen class ophaalt, ipv uit de superclass.
Pagina: 1