1. Grundgerüst:
Type:Objekttyp = {integer X,Y,Typ,Energie..., Bildnummer ODER Methode zum Malen};
SpielerTyp = {X,Y,Energie,...};
Variablen:integer Zeit ;
Objekt = Array[0..MAXMON] of Objekttyp;
EigeneFigur = SpielerTyp;
Hintergrundfeld = Array[0..Maxx, 0..Maxy] of integer;
Procedure BaueGrafikauf;
{
BaueHintergrundAuf;
FOR (integer i = 1 ... MAXMON) IF (Objekt[i].Typ != 0) Objekt[i].Malen;
MaleEigeneSpielfigur;
}
Procedure BewegeObjekte;
{
FOR (integer i = 1 ... MAXMON) IF (Objekt[i].Typ != 0) Objekt[i].Bewegen;
}Hauptprogramm:
{
initialisiereVariablen;
LadeGrafiken;
LadeSzenario;
BaueGrafikauf;
Zeit = 0;
...
Wiederhole{FrageEingabegerätAb; (Maus/Tastatur etc)SpeicherFreigeben;
BewegeEigeneFigur;
BewegeObjekte;
Überprüfe Kollisionen mit Gegnern;
Bauegrafikauf;
WarteAufZeitschritt;
Zeit++;
...
} bis (verloren) oder (gewonnen) oder (beendet).
...
}
2. Grafik:
Heutzutage kann man ja alles von DirektX etc. machen lassen. Für meine alten Spiele habe ich folgendes Grafiksystem benutzt:
Bildschirmaufbau: Im Hauptspeicher, Beim Rücklauf des Elektronenstrahls des Monitors wird der neue Inhalt in den Grafikspeicher verschoben.
Grafikmodus: 256 Farben Modus mit Palette. Einteilung der Palette: Bit 0 - 4: Farbinformation, Bit 5-7: Helligkeit.
Spriteoperationen: Normales Setzen, Spritedarstellung
mit veränderter Helligkeit/Farbinformation (Phosphoreffekte, Schatten,
etc.)
Diese Operationen lassen sich in Assembler mittels logischer
Bitoperationen sehr schnell programmieren.
Weitere Dinge zu berücksichtigen: Clipping der Sprites am Rand, Scrolling
(Bei der Grafik wurde ich unterstützt von Arno Fehm)
Dieses alte Grafiksystem hatte den Vorteil, selbst auf langsamen Rechnern extrem schnelle Spritedarstellungen zuzulassen.
2.1. Hintergrundgrafik:
Die Hintergrundgrafikinformation steht in Arrays, der Hintergrund ist (z.B. beim Adventure) in Felder der Größe 20*20 eingeteilt. Im Array steht lediglich eine Bildnummer (kein Zeiger), anhand der an diese Position aus einer Liste ein entsprechendes Sprite gewählt wird. Jedes Sprite hat ausserdem noch eine "Verschiebung", so dass die echte Position am Bildschirm nicht exakt in dieses Raster passen muss. Um komplexe Szenerien darzustellen, verwendet das Adventure drei Grafikebenen, einen Vordergrund (Baumkronen etc), und zwei Hintergrundebenen. Die Grafikobjekte haben auch beliebige Größen, beispielsweise wird ein Schiff durch ein Bild dargestellt, obwohl es weit größer als ein Grafikfeld ist. Um weitere Tricks zuzulassen sollte die Grafik nach Möglichkeit von Hinten nach vorne (oben nach unten) aufgebaut werden.
2.2. Objektgrafik:
Jedes Objekt besitzt eine Statusvariable, die die Bildnummer angibt. Die Grafikprozedur passt zunächst automatisch Farbe und Helligkeit an besondere Zustände (z.B. Versteinerung) an, danach wird eventuell ein weiterer Effekt (z.B. Flammen) auf das Sprite gezeichnet. Schattenwurf von fliegenden Objekten wird durch eine reine Bitoperation der hinteren drei Farbbits erreicht.
3. Verwaltung der Monster/Objekttypen:
Der Übersichtlichkeit halber empfielt es sich, eine kleine Datenbank anzulegen, aus der die Informationen aller Objekte und Monster im Spiel geladen werden. Diese enthält (z.B. bei Kampf der Bimpfe) Stärkewerte, Bildnummern, etc. und wird am Anfang geladen. Abhängig von der Größe des Spiels empfielt es sich, die Objekte in einer Reihung, einer Liste, oder einer anderen Datenstruktur zu speichern. Dies kann jedoch beim Abspeichern von Spielständen eventuell kompliziert werden.
4. Szenarios:
Für die Szenarios verwende ich stets einen kleinen Editior, der dann an neue Anforderungen auch immer wieder angepasst wird.
5. KI?
In Kampf der Bimpfe und Battlesnakes benutzt der Computergegner
eine einfache KI, die wie ein einfacher Automat funktioniert. Um das Spiel
weniger berechenbar zu machen, werden jedoch auch Zufallsentscheidungen
verwendet.