# Problem : Variablen werden vererbt



## baroque (29. Mai 2009)

Hi all, 

ich habe ein Problem : Ich progge z.Z. an einem RPG, dort habe ich eine Klasse "Charakter" die diverse Variablen (Str, Agi, etc) enthält. Abgeleitet von dieser ist die Klasse "Monster", die ihre eigenen Werte für Str, Agi etc braucht. Leider starten meine Monster egal wie ich es drehe und wende immer mit den Startattributen des Charakters, selbst wenn ich sie dort als private deklariere. :bahnhof:

Hier mal die relevanten Stellen im Code :

Charakter.class :

```
public class Charakter
{


	private int level;
	private int HP_Max;
	private int MP_Max;
	private int STAM_Max;
	private int HP;
	private int MP;
	private int STAM;
	private int exp;
	private int exp_tnl;
	private int str;
	private int agi;
	private int intel;
	private int aspd;
	private int aspd_delay;
	private int extraDamage;
	private int lastAttackDamage;
	private int exp_old;




	Random rnd = new Random();



	public Charakter (int lv)
	{


		level = lv;
		exp = 0;
		str = 15;
		agi = 15;
		intel = 15;
		HP_Max = (5 + level) * (1 + str / 5);
		MP_Max = (1 + level / 2) * (1 + intel / 3);
		STAM_Max = (2 + level) * (1 + str / 10 + agi / 20);
		HP = HP_Max;
		MP = MP_Max;
		STAM = STAM_Max;
		extraDamage = 0;
		aspd = 50 + agi;
		
	}
.
.
.
```

Monster.class : 


```
public class Monster extends Charakter
{
	private int level;
	private int HP_Max;
	private int MP_Max;
	private int STAM_Max;
	private int HP;
	private int MP;
	private int STAM;
	private int exp;
	private int exp_tnl;
	private int str;
	private int agi;
	private int intel;
	private int aspd;
	private int aspd_delay;
	private int extraDamage;
	private int lastAttackDamage;
	public int strbonus;
	private int agibonus;
	private int intelbonus;
	private int extraDamage2;



	Random rnd = new Random();

	private int exp_value;
	private String mobName;
	

	public Monster (int lv, int type)
	{
		super(lv);
		level = lv;
		exp_value = level / 2 + rnd.nextInt(level) + level ;
		this.str = 10000; /// Versuch 1, funzt nicht
		int agi = 140; /// Versuch 2, funzt nicht
		int intel = 1;
		
		
		if(type == 0)
		{
			mobName = "Ogre";
			str = (level + rnd.nextInt(level)) / 2 + 1;
			intel = rnd.nextInt(level) + 1;
			agi = rnd.nextInt(level) + rnd.nextInt(level) + 1;
			extraDamage2 += level;
		}
		else if (type == 1)
		{
			mobName = "Spider";
			str = level / 2 + 1;
			intel = level;
			agi = level + rnd.nextInt(level);
		}

		else if (type == 2)
		{
			mobName = "Dark Magus";
			str = rnd.nextInt(level) + 1;
			intel = 2 * level;
			agi = level;
		}
	}
```

Habe auch schon versucht, die Werte des Monsters durch eine Methode zu überschreiben - hilft nicht. Ob es über einen Konstruktor funktionieren würde weiss ich nicht, würde es aber nur sehr ungern so lösen..vielleicht fällt euch ja was ein, danke schonmal!


----------



## Gelöschtes Mitglied 5909 (29. Mai 2009)

Ich glaub du hast den Sinn von vererbung nicht verstanden. Du solltest die werte von der Basisklasse verwenden, sonst existiert alles 2 mal. Habe noch kein Monster gesehen, dass 2 Level und 2 Gesundheiten gleichzeitig hat.
Solltest du sie doch 2 mal (!) brauchen musst du mit super arbeiten um die attribute etc der Basisklasse verwenden zu können.


----------



## baroque (29. Mai 2009)

Naja, das ist ja nicht ganz mein Problem - ich würde liebend gerne die Variablen der Basisklasse verwenden, wenn diese nicht aus irgendeinem mir nicht schlüssigen Grund auch tatsächlich dieselben Inhalte annehmen würden..die Neudefinitionen stehen da eher so als verzweifelter Versuch das Ganze durch Überschreiben doch so hinzukriegen wie ich mir das vorstelle. Mir wurde die OOP mit dem Beispiel Fahrrad erklärt, wo z.B. ein Mountainbike eine Subklasse von Fahrrad ist und einfach nur um einige Methoden erweitert wurde. Das heisst aber nicht dass alle Mountainbikes die da draussen so rumdüsen automatisch mit 12 km/h fahren nur weil es das Ursprungsobjekt Fahrrad tut, genau das passiert hier aber - wie ich es drehe und Wende ist der Wert für str vom Monster gleich mit dem vom Charakter. =/

Edit : Problem gefunden, tatsächlich hat das Löschen der ganzen Neudefinitionen geholfen nachdem ich eine bestimmte Update-Abfrage leicht geändert habe.  Danke!


----------



## leibimatZe (30. Mai 2009)

Ich würde vlt nicht die Monster vom Charakter ableiten, schreib dir doch eine eigene Superklasse, welche allgemein Einheiten im Spiel beschreibt und leite dann den Charakter und die Monster davon ab, die Monster brauchen im Spiel normalerweise nciht die selben Sachen wie die Monster, beispiel die Erfahrungspunkteberechnung.

Ich sitz zur Zeit auch an nem RPG und hab eine Klasse die allgemeine Definition wie leben, stärke level etc enthält und davon sind dan Monster und der charakter abgeleitet.

Grüße


----------



## Spacerat (30. Mai 2009)

Da muss ich meinem Vorredner zustimmen. Ich hätte "Character" zur Superklasse gemacht und dann zunächst die Klassen "NonPlayer" und "Player" welche von "Character erben. Schliesslich eine Klasse "Monster", die letztendlich von "NonPlayer" erbt.


----------



## baroque (30. Mai 2009)

Ja, das ist mir im Nachhinein auch aufgefallen und beim nächsten RPG werde ich es auch so machen - bei diesem Versuch (ist inzwischen um einiges umfangreicher geworden  ) allerdings ist das ganze schon zu sehr miteinander verstrickt um es noch zu ändern.  Macht nix, hab' draus gelernt. *g*


----------



## leibimatZe (30. Mai 2009)

Beim nächsten  ich hab meins uach scho tausendmal komplett umgeworfen weil ich halt einfach erstmal alles halten will aber so dass ich es gut und einfach erweitern kann..
Erstmal Gedanken machen mit Zettel und Stift hilt da viel, hab mir alle attribute und die typen aufgeschrieben dann konnt ich schön überlegen wie die superklasse aussieht etc... da nimmst dir einiges an arbeit ab, so gehst gezielter ran an diesache und es wir einfacher zu implementieren 
wie weit bistn grad und wie baustn das allgemein so auf ? is ne interessens frage nur weil ich ja auch an sowas sitz.
grüße


----------



## baroque (31. Mai 2009)

Schon, wenn das Projekt hier wirklich mein Zielprojekt wäre würde ich das wahrscheinlich auch so machen - aber erstmal ist es nicht mehr als ein Spielplatz, im Endeffekt quasi ein Lernprojekt. Ich lerne eher durch Trial&Error als durch Tutorials, von daher ist es okay für mich irgendwann neu anfangen zu müssen.. viel weiter bin ich noch nicht, sitze immer noch an der Kampfengine - habe aber ein paar entscheidende Verbesserungen vorgenommen, die Kämpfe finden nicht mehr automatisch statt sondern der Spieler hat die Kontrolle. Als nächstes kommt ein Skillsystem, ein paar frei verteilbare Attributspunkte pro Level und eventuell Charakterklassen.


----------

