Mehrere Gegnertypen mittels extends und Funktionspointer
Übersicht

![]() |
LastmaydayBetreff: Mehrere Gegnertypen mittels extends und Funktionspointer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
hier ein kleines Beispiel wie man mehrere Gegnertypen mittels 'extends' und Funktionspointer realisiert. Vorteile meiner Methode: Jeder Gegnertyp besitzt seine eigene Type. Neue Gegnertypen sind ohne großes Programmieren im Spiel verfügbar. Kein Doppeltes Programmieren gleicher Funktionen. Und hier der Ausführbare Code: BlitzMax: [AUSKLAPPEN] SuperStrict Type Tcreatehook: In dieser Type werden alle Gegnertypen in einer liste gespeichert. Die Funktion Tcreatehook.register(<name>:string,<functionspointer>:int()) nimmt einen neuen Gegnertyp mit Namen und der create Funktion in die liste auf. Ein einfacher Aufruf von Tcreatehook.create(<name>:string) erstellt einen Gegner. Man kann auch auf ints zurückgreifen oder eine array verwenden um die Geschwindigkeit zu erhöhen. Type Tworkflowhook: In dieser Type werden alle aktive Gegner gespeichert und Routineaufgaben wie die Bewegungsberechnung und Render Methode aufgerufen und abgearbeitet. Die Funktion Tworkflowhook.register(<object>:object) nimmt ein neuen Gegner in die Arbeitsroutine auf. Die Methode unregister() entfernt den Gegner wieder. Die Funktion Tworkflowhook.allwork() arbeitet alle Gegner durch und ruft deren Methode 'work()' auf. Die Funktion Tworkflowhook.allrender() arbeitet alle Gegner durch und ruft deren Methode 'render()' auf. Type Trootenemy: Diese Type ist der Standartgegner und stellt die Standard Funktionen und Methoden bereit. Näheres steht im Code kommentiert zur Verfügung. Type Tenemy2 extends Trootenemy: Mit dieser Type kommen wir zum eigentlichen ziel, einem neuen Gegnertyp. Wichtig ist zu wissen das man hier keine Globals von Trootenemy überschreiben kann. Näheres steht im Code kommentiert zur Verfügung. Diese Type muss mindestens aus diesem Code bestehen: BlitzMax: [AUSKLAPPEN] Type Tenemy3 Extends Trootenemy Fragen und Kritik sind erwünscht! Mfg Lastmayday |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es wäre evtl. interessant, auf eine Erweiterung von Klassen zu verzichten. Das ließe sich bewerkstelligen, indem du eine Art TEnemyKind-Klasse verwendest, die als Feld von TEnemy verwandt wird. Die TEnemyKind-Klasse enthält als Funktionspointer alle Funktionen zu den Inividuen, die als Parameter übergeben werden.
Ich spiele momentan mit einem solchen System rum, weil es einfach über externe Dateien erweiterbar ist (Funktionen mit Private). Generell ist eine Abtrennung von Gegnerart und Gegnerindividuum interessant. Dann existiert das Bild beispielsweise nur einmal statt #Gegner-mal. Außerdem will ich hoffen, dass image:Int nur zu Testzwecken mit Print gedacht ist und ansonsten durch image:TImage ersetzt wird. ZEVS |
||
![]() |
Lastmayday |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
meine Idee dahinter war jeden neuen Gegnertyp in einer extra Type abzukapseln und Standard Funktionen aus der root Type zu verwenden. Die Funktionen die man modifizieren muss bleiben dann separat und vermischen sich mit den anderen Typen. Eine Art Funktionssammlung in einer Kindtype ist auch eine gute Idee, nur geht dort auch die Übersicht verloren. (evt. mal ein Beispiel?) Bei minimalen Änderungen kann man diese einfach bei der create Funktion als Parameter übergeben. Es geht primär darum wenn Gegnertypen unterschiedliche Bewegungsabläufe haben (Nahkämpfer / Fernkämpfer). Wie ich geschrieben habe besteht das Problem das man Globals aus der root Type nicht überschreiben kann und somit ein globales Image flachfällt. Deswegen muss man ein Field image:Timage haben. Das man da natürlich kein loadimage() in der create Funktion verwenden sollte muss doch jedem klar sein. Und das im Code image:int steht ist Absicht und soll veranschaulichen wo man das Bildchen speichern kann (wegen den Globals). MfG Lastmayday |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Globale images würde ich allerdings auch bevorzugen.
Ich dimensioniere meine Bilder immer auf 512x512 und halte dann gleich mehrere "grafiken" auf einem Bild. So würde ich es auch - je nach komplexität der animationen - auch mit einem solchen system machen. Dazu gibts dann evtl eine globale im Gegner-extend und in der Root-klasse ein Globales bild. Bescondere bilder können ja nach geschmack auchnoch im extend geladen werden. Die globale im Gegegner extend gibt zb an, das man Frame 5-10 für diesen Gegner verwenden muss. Das ist allerdings nicht so einfach zu beschreiben, da n beispiel für einzufuchsen ist mir grade zuviel - vielleicht wurde ich ja auch so verstanden ![]() Ansonsten, schön mal wieder ein paar Codes geteilt zu bekommen - selbst wenn mans nicht verwenden kann, man kann immernoch was lernen und/oder ideen aufgreifen. Danke =) |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beispiel soll sofort kommen:
BlitzMax: [AUSKLAPPEN] Type TCharacterKind Sodass man ohne extra Type einen neuen Charakter hinzufügen kann (extra Datei): BlitzMax: [AUSKLAPPEN] Private Damit existiert nach außen hin nur eine globale Variable, die referenzierten Funktionen extieren nur innerhalb der Datei. Man hat leichten Zugriff auf alle Arten unter TCharacterKind.list. So lässt sich das Problem durch heftige Benutzung von Funktionspointern lösen. Ich finde es nicht wesentlich unübersichtlicher, BlitzMax: [AUSKLAPPEN] character.kind.draw character anstatt BlitzMax: [AUSKLAPPEN] character.draw zu schreiben, ansonsten kann man ja auch einfach TCharacter um die Methode erweitern, die auf TCharacterKind.draw verweist (wie bei Save und Load). ZEVS |
||
![]() |
Lastmayday |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PhillipK: Dir ist schon klar das in Bmax Timage mit = verlinkt werden und nicht kopiert? Das Field Image verbraucht also nur ein int.
@ZEVS: Also im Prinzip machen wir exakt das gleiche, nur das meines anders geschrieben ist. =) Ich hab jetzt mit meinem System gearbeitet und gesehen das es sich auch für andere Sachen gut einsetzten lässt. Leider muss man die hook types verdoppeln und umbenennen was mich nervt. Ich werde in den kommenden tagen versuchen das System umzuarbeiten. Ich denke aber nicht das es funktioniert, da Bmax einfach für so etwas nicht ausgelegt ist. Aber ich hab da schon eine Idee . . . Ein Punkt fällt mir noch ein: da ich mein Projekt opensurce machen will und die Leute die Möglichkeit haben sollen eigene Gegner zu erstellen und zu teilen, reicht es die extend type zu kopieren und einzufügen. Dieser Gegner sollte dann funktionieren ohne den restlichen Code anzufassen. (und das funktioniert ja bei deinem Code auch ![]() MfG Lastmayday |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group