| 

.NET C# Java Javascript Exception

1
zweite Frage zu: GDI+, VB .NET 2D Spiel mit Sprites

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?

Gruß
Spice

Edit - Floyd:
  • Link zum Link gemacht
08.10.2010
spicejam 801 1 6
1 Antwort
1
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();

void t1_Tick(object sender, EventArgs e){
this.Invalidate();
}

// 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>();

// OnPaint-Event
void OnPaint(Object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;

g.DrawImage(background, 0, 0);
g.DrawImage(mensch, playerPosition.x, playerPosition.y);

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.
08.10.2010
Floyd 11,0k 3 9
Floyd 11,0k 3 9
Danke. Wäre überhaupt nicht auf die Idee gekommen dies über eine Liste zu lösen. Und Erklärung ist ja mal ein Hammer! Vielen vielen dank!
spicejam 08.10.2010
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
Floyd 08.10.2010

Stelle deine .net-Frage jetzt!