Unzwar wäre meine Frage, wie ich es realisieren könnte dynmaisch zu zeichnen. Wenn ich z. B. zur laufzeit, neu instanizierte Monster(Objekte), die im paint Ereignis nicht vordefiniert sind zeichnen möchte? Wie könnte ich diese dynmaisch in das paint Ereignis einbinden?
Recht einfach, du nimmst einen Timer und eine Liste und ein paar Events. Der Timer lößt die "Invalidate-Methode" alle 200 Millisekunden aus um das neu-zeichnen zu realisieren. Dann brauchst du eine Liste, ein Event, und etwas Gehirnschmalz :D
Ein paar Erklärungen zum Code kommen weiter unten.
// Der Timer. Timer t1 = new Timer(); t1.Interval = 200; t1.Tick+=new EventHandler(t1_Tick);aufgerufen wird t1.Start();
// Die Classe public class Monster{ public MonsterTyp Typ {get; set;} public GUID InternalId {get; set;} public Point Position {get; set;} ... public Monster(MonsterTyp Typ, Point Position){ this.Typ = Typ; this.Position = Position; this.InternalId = GUID.NewId(); } }
// Die Monstertypen public enum int MonsterTyp { MonsterKlein_A = 1, MonsterKlein_B = 2, MonsterGroß_A = 3 }
// Die Eigenschaften der Monster (Symbol/Image, Größe, Geschwindigkeit ...) // Idealerweise eine Polymorphe Classe verwenden aber der einfachheit halber hab ich // ein Array verwendet. ... MonsterTypenDefaults[1][0] = "MonsterKlein_A_Image.gif"; MonsterTypenDefaults[2][0] = "MonsterKlein_B_Image.gif"; MonsterTypenDefaults[3][0] = "MonsterGroß_A_Image.gif"; ...
// Die Liste List<Monster> MonsterListe = new List<Monster>();
foreach(Monster m in MonsterListe){ g.DrawImage( Image.FromFile(MonsterTypenDefaults[m.Typ][0]), m.Position.X, m.Position.Y ); } }
So und nun brauchst du nurnoch eine Logik wie man Monster der MonsterListe hinzufügen kann. Das würde ich über eine Event "NewMonsterSpawnEvent" lösen, könnte aber auch eine Methode sein.
public void SpawnNewMonster(){ MonsterListe.Add(new Monster(MonsterTyp.MonsterKlein_B, new Point(10,10))); }
Viel Spaß beim Experimentieren :D
Ein paar Erklärungen zum Code:
Im wesentliche enthällt die Liste "MonsterListe" eine dynamische Auflistung alle Monster auf deinem Spielfeld. Wenn ein Monster stirbt musst du es aus der Auflistung entfernen. Wenn ein neues Monster spawnen soll (spawnen = erscheinen/entstehen), musst du es hinzufügen. Als zweites gibt es die Monster-Klasse die ein Monster repräsentiert, ihm eine eindeutige ID gibt um das Monster später gezielt steuern oder löschen zu können. Im OnPoint-Event wird die "MonsterListe" interiert und entsprächend ihrer aktuellen Positionsangaben die Monster auf dem Spielfeld gezeichnet.
Dieser Code ist nur ein sehr einfaches Beispiel wie man soetwas lösen kann.
Verbesserungsmöglichkeiten wären als erstes nicht die Monster-Typen anhand eines Enums zu unterscheiden, sondern eine Basisklasse "Creatur" zu erschaffen von der nun die verschiedenen Monstertypen abgeleitet werden. Jedes Creatur hat einige Basisfunktionen wie Bewegen, Sterben, und einige Basisaktionen (Angreifen, Werfen, Zaubern wäre beispielsweise solche Basisaktionen). Abgeleitet von diesen Basis-Funktionen hat jeder Monstertyp aber noch zusätzliche Eigenschaften und Funktionen. So könnte jeder Monstertyp eine andere Liste an Zaubern zur Verfügung haben welche es einsetzten kann.
Jaja das kenne ich, manchmal sieht man das Wald vor lauter Bäumen nicht mehr und man übersieht das offensichtliche. Bei mir ist das dann immer eine Zeichen dafür, das ich dringend Urlaub brauche :D