Flashhilfe.de - Flash Community

Klassen Scope und Vererbung Verständnisproblem [Flash 10]

 


AntwortenRegistrieren Seite1  

Heavy#1
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

26.09.2010, 11:23

Also ich bin in bißchen verwirrt und hoffe irgendwer kann mir mal nen bißchen erleuchten...

ich versuch gerade anhand eines kleinen Spiels oop besser zu verstehen und deshalb muss ich
mal paar Sachen erfragen - ich hab folgende Struktur, für meine Einheiten gewählt:

Einheitentyp zb. Panzer oder Bauer --> extends Unit (Basisklasse der Einheiten) --> extends
IsoObj

Dabei enthält Einheitentyp , Einheitenspezifische Eigenschaften, zB die Animationen die aus
der Biblio kommen (verknüpfte mcs mit Einzeilbildern) . Unit enthält alle gemeinsamgenutzte
Eigenschaften, zB selectEvent, isActive, xy steuerung und später A*star Search.

zum derzeitigen Problem,
wenn ich jetzt die Einheit auswähle, würde ich gern die select Animation ausführen, die eine
Methode der Panzer oder Bauer Klasse ist. oder wenn die einheit hitpoints = 0 --> dann deathAni.

da ich aber von Unit nicht auf die Methoden von Panzer nach oben zugreifen kann, bin ich jetzt
ein wenig verwirrt welchen anderen oop Weg man in Wirklichkeit nimmt um so etwas anzusprechen.
Im Moment gebe ich per super(this) - das erstellte Objekt selbst an die Unit - Klasse weiter und
kann dann in Unit auf die Methoden des Oberobjekts zugreifen.... Aber irgendwie fühle ich dass
das eher sauBär als sauber ist....
derFloh#2
Benutzerbild von derFloh
Beiträge: 992
Wohnort: ..::LAGE::..
Registriert: Apr 2006

26.09.2010, 12:05

Hey,

ist schwer zu sagen, da gibts bestimmt viele wege.
vielleicht löst man das übern eventDispatcher?!
also wenn du eine methode in deiner Unit-Klasse aufrufst, feuerst du dort ein event.
wenn du eine instanz von Panzer oder so erstellst, kannst du ja dort einen eventlistener hinzufügen, wo du auf das event reagierst. so muss wenigstens die superklasse nix von der instanz wissen.
mag sein, dass es bessere wege gibt, aber das ist das erste was mir gerad zu einfällt. :)

gruß
 flo
www.heimatdesign.com
Florin Sans - Buy on myFonts / Fontspring
Heavy#3
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

26.09.2010, 17:07

ok dann werd ich das mal konkretisieren.
ich hab mal die klassen auf ein verständliches Maß zusammengestutzt:

Main Klasse
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
27
28
29
30
31
32
package
{
     public class Main extends Sprite
     {
        public function Main():void
        {
           var world : IsoWorld = new IsoMap();
              addChild(world);
           
           var soldat_01 : Soldat = new Soldat(50);
              soldat_01.name = "Soldat 1";
              soldat_01.addEventListener(PlayerEvent.PLAYER_SELECTED, UnitSelected, false, 0, true);
              
           var soldat_02 : Soldat = new Soldat(50);
              soldat_02.name = "Soldat 2";
              soldat_02.addEventListener(PlayerEvent.PLAYER_SELECTED, UnitSelected, false, 0, true);
           
           world.addObjectToWorld(soldat_01);
           world.addObjectToWorld(soldat_02);
        }
     
        private function UnitSelected(evt:PlayerEvent):void
        {
           if (_selectedPlayer) _selectedPlayer.deactivated();
           
           var selectedUnit : Unit = evt.currentTarget as Unit;
              selectedUnit.activated();
           
           _selectedPlayer = selectedUnit;
        }
     }
}


Soldier Klasse:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
package
{
     public class Soldat extends Unit
     {
        private var startAni : MovieClip;
        
        public function Soldat(size):void
        {
           super(size, this);
           this.addEventListener(Event.ADDED_TO_STAGE, initSoldier);
        }
        
        public function initSoldier(evt:Event):void
        {
           this.initBase();
        
        public function initBase():void
        {
           this.startAni.gotoAndPlay(2);
        }
        
        public function attack(clip : MovieClip):void
        {
           var _clip : MovieClip = clip;
              _clip.gotoAndPlay(2);
        }
        public function death(clip : MovieClip):void
        {
           var _clip : MovieClip = clip;
              _clip.gotoAndPlay(2);
        }
        
        private function onMove():void
        {
           //here goes the move ani
      }   
        
     }
  }


Unit Klasse:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package
{
     public class Unit extends IsoObject
     {
        private var animationObject : Object;
        
        public function Unit(size : Number, oberObject : Object):void
        {
           this.animationObject = oberObject;
           super(size);
           init();
        }
        
        public function init():void
        {
           addEventListener(MouseEvent.MOUSE_UP, selectThisUnit, false, 0, true);
        }
        
        private function selectThisUnit(evt:MouseEvent):void
        {
           dispatchEvent(new PlayerEvent(PlayerEvent.PLAYER_SELECTED));
        }
        
        public function activated():void
        {
           selector.gotoAndStop(2);
           this.animationObject.initBase();
           
           stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPress);
           stage.addEventListener(KeyboardEvent.KEY_UP, keyRelease);
           
        }
        
        public function deactivated():void
        {
           stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyPress);
           stage.removeEventListener(KeyboardEvent.KEY_UP, keyRelease);
        }
     }
}


wie würde man jetzt im besten Fall die Animationen des Soldier an die Unit Klasse weitergeben,
ohne direkt das oberObjekt zu nutzen, so dass jede von Unit abgeleitete Einheit verschiedene
Animationen enthalten kann damit Unit diese zu verschiedenen Zeitpunkten benutzen könnte..
zB. sollte der keyPress möglichst "onMove();" ausführen können und wenn Unit´s mouseEvent
zB. überprüft ob die Mouse über einem anderen "feindlichen" Unit ist dann attack(); ...

oder macht man das nicht... ?
springer#4
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

26.09.2010, 17:13

hi,
ich nehm mal an dass hitpoints in Unit definiert ist?

dann kannst du es auch mit überschreiben von methoden machen:

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
27
28
29
30
31
32
package
{
     public class Unit
     {
        private var _hitpoints:int = 100;
        
        public function Unit()
        {
        }
        
        public function get hitpoints():int
        {
           return this._hitpoints;
        }
 
        public function set hitpoints(value:int):void
        {
           if( this._hitpoints == value ) return;
           this._hitpoints = value;
           this.checkLife();
        }
        
        private function checkLife():void{
           if( this._hitpoints == 0 ) this.die();
        }
        
        protected function die():void{
           // nix hier
      }
 
     }
}


ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
{
     import flash.display.MovieClip;
 
     public class Panzer extends Unit
     {
        private var deathAnimation : MovieClip;
        
        public function Panzer()
        {
           super();
        }
        
        override protected function die():void{
           this.deathAnimation.play();
        }
     }
}
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Heavy#5
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

26.09.2010, 17:22

also das mit den Hitpoints ist ja dann ein spezialisierter Anwendungsfall und
wenn ich das richtig verstehe, müsste ich aber dann alle Animations Methoden,
doppelt schreiben ?

einmal als leere Funktion der Unit klasse, und als override aus der Einheiten klasse ?
springer#6
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

26.09.2010, 17:24

du hattest grad noch gepostet. hatte das noch nicht gesehen.

im prinzip kannst du dir die übergabe des "oberobjekts" sparen, wenn du für initBase eine protected function definierst und in "Panzer" dann überschreibst... also vom prinzip her gleich wie mit "die()" in meinem beispiel...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
springer#7
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

26.09.2010, 17:39

ja, so in etwa... die funktion initBase hast du ja aber zb sowieso schon, mehr schreiben musst du also nicht, eher weniger, da du die ganze übergabe der oberinstanz nicht machen musst.


ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package
{
     public class Unit
     {
        
        public function Unit()
        {
        }
        
        public function activate():void{
           this.initBase();
        }
 
        protected function initBase():void{
              // hier nichts weiter
      }
        
     }
}


ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
{
     import flash.display.MovieClip;
 
     public class Panzer extends Unit
     {
        private var deathAnimation : MovieClip;
        
        public function Panzer()
        {
           super();
        }
        
        override protected function initBase():void{
           // hier dann deine jetziger code
      }
     }
}




Unit ist für mich "nur" eine abstrakte klasse, da sie nicht direkt instanziert wird (vermutlich). daher würde ich es so machen. 

aber geht natürlich auch über eine referenz, ist aber dann wieder etwas weg von OOP...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Heavy#8
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

26.09.2010, 17:40

ah ja , und so macht man das dann bei oop immer ?
also in der Klasse von der vererbt wird , die funktionen alle vordefinieren
und dann überschreibt die erbende Klasse das mit ihrer eigenen Methode... ?

was ist dann mit der parameter übergabe ?

zB die funktion
ActionScript:
1
2
3
4
5
public function attack(clip : MovieClip):void
      {
           var _clip : MovieClip = clip;
              _clip.gotoAndPlay(2);
        }

sollte je nach Richtung in die man angreift einen anderen Clip empfangen um
den Angriff in die jeweilige Richtung durchzuführen, damit ich nicht für jede Richtung
eine eigene Funktion brauche..

 müsste ich dann auch die protected in Unit mit Parametern vordefinieren ?
springer#9
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

26.09.2010, 17:47

ist nicht die generelle vorgehensweise, ich würde das so machen. alles was mehrere  "konkrete" klassen (Panzer, Bauer,...) können sollen, würde ich in der abstrakten klasse soweit als möglich definieren..

die funktion steht in panzer?

also zb.
ActionScript:
1panzerInstanz.attack( bauerInstanz );
?
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Heavy#10
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

26.09.2010, 17:59

Nee. die panzer klasse würde in meinem Modell nur die Animationen bereit stellen,
welche für die verschiedenen methoden - angriff, tod, bewegung etc. - notwendig wären.

Da alle Unit klassen Überprüfungen machen müssen, an welcher Stelle der Map sie sich
befinden und überprüfen ob das next tile Walkable ist, und dann der a*star den weg zum möglichen Ziel berechnet, hatte ich gedacht sie müsste dann auch überprüfen ob sich auf dem Zielfeld oder auf dem nächsten Feld eine Unit vom Typ "Feind" befindet um diese dann anzugreifen.


das einzige worüber ich noch nachdenke ist, die Unit klasse nochmal zu unterteilen,
um dann von Unit eine See und Land bzw. Arbeits und Kampf Klasse abzuleiten und dann
von dieser die Animationsklasse weiter zu verarbeiten..
Geändert von Heavy am 27.09.10 um 13:11 Uhr
Heavy#11
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

27.09.2010, 13:08

Also ich muss sagen, diese override protected, find ich inzwischen ziemlich gut.
auch wenn ich immernoch denke, dass es bißchen mehr zu schreiben ist, bleibt
schon schön übersichtlich.

aber die frage ist einerseits immer noch das mit den parametern, und andererseits

wie verhält sich das mit Verebungen die von Vererbungen vererben... ?
springer#12
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

27.09.2010, 14:38

hmm, also vererbungen von vererbungen funktionieren genau gleich wie "einfache" vererbungen...
mal so salopp gesagt ;-)

wegen deinem anderen problem, bezüglich welche Unit wo lang laufen/fahren darf und auch wer wen angreift, würde ich eine ManagerKlasse machen die das verwaltet. im prinzip muss ja die Unit nicht wissen wo sie sich befindet, sondern nur was sie kann, in dem fall zb. laufen/sterben/angreifen. ob die aktion dann auch ausgeführt werden darf, solltest du nicht in der klasse Unit bestimmen. Eine Managerklasse, die alle Units verwaltet und weiss wo sich die befinden und wo sie lang gehen dürfen...

so wie ich deinen anderen post verfolgt habe, hatte dir badskill ja schon zu einer solchen ähnlichen klasse geraten....
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Heavy#13
Benutzerbild von Heavy
Beiträge: 247
Wohnort: Berlin
Registriert: Apr 2003

Themenautor/in

27.09.2010, 19:00

ja genau, das hatte er.

Die Frage ist aber dann immer, wie das ganze implementieren, und wie weit passt das mit
dem Konstrukt welches schon da ist zusammen ohne alles komplett umzu stricken.
Im moment ist´s in meinen Augen noch ganz übersichtlich, eine IsoKlasse die meine Map
enthält und auch die Objekte verwaltet eine Unit klasse die Einheitenverwaltung übernimmt
und eine Main in der alles zusammengeführt wird.

wenn ich das aber richtig verstehe ist es besser die kleinen Verwaltungsaufgaben auf noch mehr
kleine Utility klassen zu verteilen, die dann vielliecht mit returns sachen zwischen den klassen hin
und her transportieren ?

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2022 Sebastian Wichmann - Flashhilfe.de