####################################################################### ##################### GetmanSoft presents ############################ ####################################################################### SpriteEnginePro V2.20 << FREEWARE >> Autor: J”rg Getschurek INHALT: 1. Kurz�bersicht 2. Systemanforderungen 3. Anleitung 4. Kommandozeilenparameter 5. Dateiformat 6. Beigef�gte Dateien a. Programm b. Demo 1 (Weltraumanimation) c. Demo 2 (Slide-Show) d. GameLibrary ( BC++3.1) f�r VGA-Mode 13H 7. Tips 8. Probleme beim Laden von Windowsbitmaps 9. Aufbau einer Farbpalette 10. Allgemeines zur Spieleprogrammierung 11. Žltere Versionen der SpriteEnginePro 12. Sonstiges Anhang: Liste der beigef�gten C++Funktionen ------------------------------------------------------------------------ 1. Kurz�bersicht: - Es k”nnen bis zu 4000!! Windows-Bitmaps in einer Grafikresource gespeichert werden. - Sortierung nach Bildnamen (Optional). - Da jedes Bild �ber seinen Bitmap-Namen (ohne Erweiterung .BMP) an- gesprochen wird, braucht die Sprungadresse beim Erneuten generieren der Resource nicht identisch zu sein. (vgl. DoomWad-Files) - Unterst�tzung von Super-VGA mit 8 Bit Farbtiefe [HiRes]: Die Grafikanzeige paát sich automatisch der Dimensionierung des Bildes an. Z.B. bei einer Bildgr”áe von X=700 und Y=500, wird die Aufl”sung 800*600 gew„hlt. Folg. Aufl”sungen werden unterst�tzt: Standard-VGA 320*200 256 Farben Super-VGA 640*480 256 Farben Super-VGA 800*600 256 Farben Super-VGA 1024*768 256 Farben - Mehrfachoperationen durch Bildmarkierung ( Gilt f�r : Export, Drucken und Paletten-Nr. „ndern). - Export ins Windows-Bitmapformat. - Die Kopfdaten der Resource k”nnen komplett ausgedruckt werden. (f�r 4000 Bilder sind ca. 60 DIN-A4 Seiten n”tig!) - Suchfunktion �ber Bildname. - Optionale Erstellung einer Log-Datei in der Informationen �ber nicht eingelesene Bitmaps enthalten ist (z.B. falsche Farbtiefe). - Automatische Generierung einer C-Headerdatei mit den Spritenamen. - Direkt zum Einstieg in die Spieleprogrammierung ist eine Klassen- bibliothek f�r Borland C++ 3.1 beigef�gt. Da keine C++Spezifischen Merkmale, wie Vererbung usw. verwendet wird, k”nnen die Funktionen auch leicht nach C portiert werden. - Und wo ist das Malprogramm ? Als Spiele-Entwickler sollte man auf Professionelle Programmpakete, wie Corel Draw/PhotoPaint zur�ckgreifen, da diese Programme einen Wust an Grafikfunktionen/Tricks zur Verf�gung stellen die jede Eigen- entwicklung im Keime ersticken l„át. Zum Konvertieren benutze ich �brigens PaintShopPro 3.11 : Schnell und Preiswert! Und nicht vergessen eine Globale Farbpalette zu definieren! - F�r die N„chsten Versionen ist geplant: - Direktes bearbeiten von Paletten - Bilder im Grafikmodus vor-und zur�ckbl„ttern - Integriertes Malprogramm - Name der C-Headerdatei identisch mit dem Namen der Resource (Z.B. Resource: DEMO.SEP / C-Header: DEMO.H) Sonst noch Vorschl„ge? Kontakt siehe Punkt 12. 2. Systemanforderungen: Prozessor : 386>> RAM : ca. 220 KByte Grafik : VGA / Super-VGA (VESA) Maus : MS-Kompatibel Dieses Programm l„uft auch im DOS-Fenster unter Windows 95. Im Dos-Modus, oder mit „lteren DOS-Versionen unbedingt ein Software-Cache (z.B. SMARTDRIVE) benutzen. Programmiersprache : Beliebig (C++ Library beigef�gt) 3. Anleitung Mit 'F2 - Neu' werden alle Bitmap-Dateien aus dem aktuellen Verzeichnis in eine Resourcen-Datei geschrieben. Die Bitmaps m�ssen dem vorgeschriebenen Format entsprechen: Bildbreite <=1024 Pixel Bildh”he <= 768 Pixel Farbtiefe 8 Bit (256 Farben) Unkomprimiert (RGB encoded) Die Datei-Erweiterung f�r die Resource kann frei gew„hlt werden. (Empfehlung: *.SEP um die Verkn�pfung mit dem Programm zu verdeutlichen) Wenn eine Bitmapdatei ge„ndert wird, muá die Resource mit dieser Funktion neu erstellt werden. Hierbei ist es belanglos, dass die Offset-Adressen der Bilder ge„ndert werden, da ein Bild �ber dessen Name (vgl. SEPRO.H) angesprochen wird. Mit 'F3 - Laden' wird eine bereits erstellte Resource geladen. Mit 'F4 - Suchen' wird ein bis zu achtstellig einzugebener Name mit allen Namen der Resource verglichen. Wenn eine šbereinstimmung erfolgt, wird das gefundene Bild fokussiert. Mit 'F5 - Palette' wird im ersten Schritt die Paletten-Nr. des fokussierten und aller markierten Bilder ge„ndert (m”gl. Werte: 0-9). Im zweiten Schritt kann die Farbpalette aus der fokussierten originalen Bitmap-Datei in die Resource �bernommen werden. Damit werden alle Bilder mit der gleichen Paletten-Nr. mit dieser Farbpalette angezeigt. -> Gilt auch f�r Markierte Bilder! Mit 'F6 - Drucken' werden durch Eingabe von 'B' die Infos des fokussierten Bildes ausgedruckt. Durch Eingabe von 'R' werden alle relevanten Informationen der Resource gedruckt (f�r 4000 Bilder sind ca.60 DINA4-Seiten n”tig!). -> Gilt auch f�r Markierte Bilder! Mit 'F7 - Export' wird das fokussierte Bild als einzelne Bitmap-Datei ge- speichert. Eine eventuell bereits vorhandene Datei wird �berschrieben. -> Gilt auch f�r Markierte Bilder! Mit 'F8 - C-Header' wird eine C-Konforme Headerdatei (SEPRO.H) mit dem Datentyp, der Deklaration und eine numerische Aufz„hlung der Sprites erstellt. Mit 'RETURN - Anzeigen' wird das fokussierte Bild im Grafikmodus angezeigt. Die Auswahl des Grafikmodus paát sich automatisch der Dimensionierung des anzuzeigenden Bildes an. Mit '[X] Log-Datei' werden Bitmap-Dateien, die nicht gelesen werden konnten, in eine Log-Datei mit den entsprechenden Fehlern gelistet (SEPRO.LOG). Mit '[X] HiRes' werden Super-VGA-Bilder bis zu einer Gr”áe von X=1024 und Y=768 eingelesen und angezeigt. Mit '[ ] HiRes' werden nur Bilder f�r VGA-Mode 320*200 eingelesen. Mit '[X] Sort.-Name' werden die eingelesenen Bilder �ber deren Namen sortiert. 4. Kommandozeilenparameter Optional kann eine Grafik-Resource geladen werden. SEPRO.EXE [Datei.xxx] 5. Dateiformat ######################### Globaler Header ############################## Bytes Typ Offset Beschreibung ------------------------------------------------------------------------ 19 String 0 Dateikennung "SpriteEnginePro210" 1 BYTE 19 F�r Standard-VGA 320*200 = 0 F�r Super-VGA bis 1024*768 = 1 2 WORD 20 Anzahl Bilder in der Resource 64.000 Struktur 22 Globaler Bildheader ( 2 WORD Lfd. Nr. des Bildes ) ( 10 String Bildname (Dateiname als Windows-BMP) ) ( Ohne Datei-Erweiterung BMP! ) ( 4 DWORD Absolute Sprungadresse zum Bild ) ( Summe=16 Bytes multipliziert mit 4.000 Bilder = 64.000 Bytes ) 7.680 Byte-Folge 10 Rot,Gr�n,Blau-Farbpaletten ( 768 Byte-Folge 64.022 1. Farbpalette ) ( 768 Byte-Folge 64.790 2. Farbpalette ) ( 768 Byte-Folge 65.558 3. Farbpalette ) ( 768 Byte-Folge 66.326 4. Farbpalette ) ( 768 Byte-Folge 67.094 5. Farbpalette ) ( 768 Byte-Folge 67.862 6. Farbpalette ) ( 768 Byte-Folge 68.630 7. Farbpalette ) ( 768 Byte-Folge 69.398 8. Farbpalette ) ( 768 Byte-Folge 70.166 9. Farbpalette ) ( 768 Byte-Folge 70.934 10. Farbpalette ) ############################## Bilder ################################## Bytes Typ Offset Beschreibung ------------------------------------------------------------------------ 26 Struktur 71.702 Bildheader ( 10 String Bildname / Dateiname als Windows-BMP ) ( Ohne Datei-Erweiterung BMP! ) ( 2 WORD Paletten-Nr. ) Ú-( 4 DWORD Anzahl der Bildpixel ) ³ ( 2 WORD Bildbreite ) ³ ( 2 WORD Bildh”he ) ³ ( 2 WORD Horizontale Bildmitte ) ³ ( 2 WORD Vertikale Bildmitte ) ³ ( 2 WORD F�llbytes f�r den Bitmapexport ) ³ À-------> Byte-Folge 71.728 Farbwerte des Bildes 26 Struktur Sprungadresse Bildheader ( 10 String Bildname / Dateiname als Windows-BMP ) ( Ohne Datei-Erweiterung BMP! ) ( 2 WORD Paletten-Nr. ) Ú-( 4 DWORD Anzahl der Bildpixel ) ³ ( 2 WORD Bildbreite ) ³ ( 2 WORD Bildh”he ) ³ ( 2 WORD Horizontale Bildmitte ) ³ ( 2 WORD Vertikale Bildmitte ) ³ ( 2 WORD F�llbytes f�r den Bitmapexport ) ³ À--> Byte-Folge Sprungadresse+26 Farbwerte des Bildes usw. 6. Beigef�gte Dateien a. Programm 1. SEPRO.EXE : SpriteEnginePro Vx.xx 2. SEPRO.TXT : Dieses Dokument b. Demo 1 (Weltraumanimation) 1. DEMO1.EXE : Das Erste Demoprogramm 2. DEMO1.CPP : Der Quellcode 3. DEMO1.H : Der Header mit den Spritenamen (ex. SEPRO.H) 4. DEMO1.SEP : Die Grafik-Resource c. Demo 2 (Slide-Show) 1. DEMO2.EXE : Das Zweite Demoprogramm 2. DEMO2.CPP : Der Quellcode 3. DEMO2.H : Der Header mit den Spritenamen (ex. SEPRO.H) 4. DEMO2.SEP : Die Grafik-Resource d. GameLibrary (BC++ 3.1) f�r Standard-VGA 320*200 256 Farben Alle CCP Dateien m�ssen in einem Projekt zusammengefaát werden! In den Header-Dateien steht die Klassendefinition und in den dazugeh”rigen CPP-Dateien die Elementfunktionen. Wenn die Include-Dateien in das gleiche Verzeichnis der CPP-Dateien kopiert werden, muss die Einbindung mit #include "xxxx.h" erfolgen. 1. PAGE.H : Bildschirmseiten PAGE.CPP 2. BMP.H : Verwalten von Sprites und Farbpaletten BMP.CPP 3. DRAW.H : Zeichnen von Linien usw. DRAW.CPP 4. MOUSE.H : Mausfunktionen MOUSE.CPP 5. DEFIN.H : Datentypen und Konstanten 6. PGEXTERN.H : Externe definition der Seiten 7. Tips Vorschl„ge bei der Vergabe von BMP-Dateinamen: S_xxxxxx - Bewegliche Sprites (Monster, Raumschiffe etc.) F_xxxxxx - Einzelner Font-Buchstabe T_xxxxxx - Text B_xxxxxx - Ein Hintergrundbild X_xxxxxx - Texture Folgende Schritte m�ssen durchgef�hrt werden, um eine Animation durchzuf�hren : 1. Bildschirmseite SWAP l”schen mit PAGE.Fill(..), oder PAGE.PicToSwap(). Mit PAGE.PicToSwap() k”nnte auch ein Hintergrundbild in die Seite SWAP kopiert werden. 2. Die Sprites werden dann mit BITMAP.Put(..), oder BITMAP.Zoom(..) in die Seite SWAP kopiert. Je nachdem in welcher reihenfolge die Sprites kopiert werden, wird bestimmt, ob ein Sprite im Vorder-, oder Hintergrund erscheint. Die Sprites m�ssen vorher mit BITMAP.LoadSprite(..) in den Speicher geladen werden. 3. Die Seite SWAP wird mit PAGE.ToVram(..) ins VideoRAM kopiert. Somit ist ein Refresh-Zyklus beendet und es wird mit Punkt 1. fortgefahren. 8. Probleme beim Laden von Windowsbitmaps Wenn ein Windowsbitmap nicht geladen, bzw. falsch angezeigt wird, sollte diese Datei mit einem Bildbetrachter, wie PaintShopPro, oder GraphicsWorkshop, 'nachgearbeitet' werden. Das heiát, die Dimensionierung an die eigentliche Bildgr”áe anpassen und das Bitmap als Windowsbitmap RGB-Encoded mit 8 BIT Farbtiefe abspeichern. (Keine RLE-Codierung) 9. Aufbau einer Farbpalette Eine Palette = 768 Byte pro farbe: 3 Byte, xx Farbwerte von 0-63 Rot Gr�n Blau Farbe0 = xx xx xx Farbe1 = xx xx xx [...] Farbe255 = xx xx xx 10. Allgemeines zur Spieleprogrammierung Damit ein (Shareware)-Spiel auch eine gewisse Verbreitung erlangt, sollte darauf geachtet werden, dass die Grafiken leicht zu patchen sind. Bei der Konzeption der SpriteEnginePro (und der GameLib) wurde darauf geachtet, dass dies m”glich ist. Da die Sprites intern nur �ber deren BMP-Namen (o. Extension) angesprochen werden (s. SEPRO.H / BMP.CPP), kann bei der Weitergabe dieses Programms zusammen mit dem Spiel jeder die Grafiken leicht „ndern. Folgende Schritte m�ssen vom Spieler durchgef�hrt werden, um ein Spiel zu patchen: a. SEPRO.EXE starten. b. Grafik-Resource laden. c. "Alle" Bilder als BMP exportieren!!! d. Die BMP-Dateien mit einem beliebigen Malprogramm „ndern ( Auf die Farbpalette und die RGB-Codierung achten!!). e. Eine Neue Grafikresource mit den BMP-Dateien im aktuellen Verzeichnis erstellen. Unter folg. Bedingungen: - Die Bitmap-Namen d�rfen nicht ge„ndert werden - Es darf beim Einlesen der Bitmaps keine Datei fehlen - Der Name der Grafikresource darf nicht ge„ndert werden ( nat�rlich kann per Kommandozeile eine zus. Grafikresource geladen werden s. Doom -file...) - Die Bitmaps muessen sortiert nach Namen eingelesen werden 11. Žltere Versionen der SpriteEnginePro Mit den Versionen <=1.3 m�ssen die Bilder ins BMP-Format konvertiert werden: a. Bild laden b. Bild markieren (kopieren) c. Bitmapformat w„hlen [B] d. Bild einf�gen e. Bild als BMP speichern Danach kann man mit einem Grafikbetrachter unter Windows die einzelnen Bilder aus der Resource kopieren und einzeln als BMP-Datei abspeichern. 12. Sonstiges Es darf nur das Originalarchiv ( SEPRO220.ZIP ) weitergegeben werden. Der beigef�gte Quellcode darf kpl., oder in Ausz�gen verwendet werden. Das Cockpit aus Demo1 ist ein gepatchtes TIE-Defender-Cockpit. Die Monster aus Demo2 sind aus dem Alien-Patch f�r Doom. Die GameLib wird zusammen mit der SpriteEngine permanent aktualisiert. Mailbox Netz Point-Adresse ------------ -------- ------------------------------ SOLO FidoNet Joerg Getschurek 2:2410/229.23 (demn„chst 2:2410/1001.23) SpriteEnginePro und GameSpeed sind erh„ltlich bei obiger BBS oder bei: Diverse GamesNet Falls Probleme oder Fragen mit SpriteEnginePro auftauchen sollten: Mitteilung an mich an die o.g. Fido-Adresse. oder direkt beim Autor: J”rg Getschurek Hausotterstr.22b 13409 Berlin Tel.: 030/496 68 04 (Voice/Data/Fax) GATANTIEVEREINBARUNG: PROGRAMM, ANLEITUNG, UND QUELLCODE WERDEN IHNEN šBERLASSEN "WIE BESEHEN", DAS HEISST, DER AUTOR šBERNIMMT KEINE HAFTUNG FšR DIE EIGNUNG DES PROGRAMMS, DER ANLEITUNG, ODER DES QUELLCODES ZU IRGENDEINEM BESONDEREN ZWECK. INSBESONDERE HAFTET ER NICHT FšR SCHŽDEN, ODER FOLGESCHŽDEN, DIR DIREKT, INDIREKT, ABSICHTLICH, ODER UNABSICHTLICH DURCH DEN EINSATZ DES PROGRAMMS, DER ANLEITUNG, ODER DES QUELLCODES ENTSTEHEN. Berlin, den 21.12.1995 -------------------------------------------------------------------------- Anhang: Liste der beigef�gten C++Funktionen Die Elementfunktionen lassen sich auch leicht in normale C-Funktionen konvertieren, da keine ++Techniken, wie Vererbung, Polymorphie usw., benutzt werden. Wenn eine neue Resource erstellt wird, muá mit der Taste F8 eine Header-Datei mit den Spritenamen erstellt werden!! Unter diesem Namen (Typ WORD) wird das Sprite innerhalb des Quellcodes identifiziert. Spritetyp: (DEFIN.H) ============ struct SPRITE { DWORD offset; //Absolute Sprungadresse zum Spriteheader //der Resourcen-Datei int x; //Bildbreite int y; //Bildh”he BYTE far *color;//Far-Pointer auf das Sprite }; Ein Hintergrundbild sollte nicht als Sprite definiert werden, sondern mit LoadSpriteToPage(...) direkt in die 2. Seite geschrieben werden. Konstanten: (DEFIN.H) =========== GAME=0x13; //Spielemodus 320*200 256 Farben TEXT=0x03; //Textmodus 80*25 Argumente f�r 'page' SWAP=0; //In dieser Seite wird immer das aktuelle Bild aufgebaut PIC=1; //Seite, um ein Hintergrundbild zu speichern VRAM=2; //Direkt ins VideoRAM schreiben Dateien: ======== PAGE.H/CPP Bildschirmseiten Klasse : PAGE void InitVGA(BYTE modus); VGA-Modus �ber BIOS-Funktion initialisieren. void Screen(BYTE status); Bildschirmausgabe �ber BIOS-Funktion aus-/einschalten. void Fill(BYTE page,BYTE color); Bildschirmseite mit einer Farbe f�llen. Mit Farbe=0 kann der Bildschirm gel”scht werden. void ToVram(BYTE page); Bildschirmseite ins VideoRAM kopieren. void PicToSwap(void); Hintergrundbild in die Bildschirmseite(SWAP) kopieren BMP.H/CPP Verwalten von Sprites Klasse : BITMAP WORD InitResource(char filename[],SPRITE bmp[]) Offset-Adressen und breite/h”he der Sprites einlesen. void CloseResource(void) Resource-Datei schlieáen. BOOL LoadSprite(WORD name,SPRITE bmp[]) Speicher f�r ein Sprite reservieren und das Sprite laden. BOOL LoadSpriteToPage(WORD name,SPRITE bmp[],BYTE page) Sprite direkt in eine Bildschirmseite schreiben. ( F�r Hintergrundbilder!) void Free(WORD name,SPRITE bmp[]) Reservierten Speicher f�r ein Sprite wieder freigeben. BOOL Put(WORD name,SPRITE bmp[],int x,int y,BYTE page,BOOL FAST) Sprite an XY-Koordinate(Mittelpunkt) in eine Bildschirmseite schreiben. (F�r groáe feststehende Objekte FAST=TRUE ) BOOL Zoom(WORD name,SPRITE bmp[],int x,int y,BYTE zoom,BYTE page) Sprite an XY-Koordinate(Mittelpunkt) in eine Bildschirmseite schreiben. Wird zum Beispiel dem Argument 'zoom' der Wert 2 �bergeben, wird jedes Pixel des Sprites auf 3x3 Pixel vergr”áert. Das Zoomen erfolgt proportional in alle Richtungen zum Mittelpunkt des Sprites. WORD Offset(int x,int y) Adresse von xy berechnen. 320*y+x void InitPalette(WORD palnr) Eine der zehn Farbpaletten (0-9) aus der Grafik-Resource initialisieren. BOOL SetRGB(int color,BYTE red,BYTE green,BYTE blue) Eine Farbe der aktuellen Palette „ndern. (ungetestet, da noch �ber VGA-BIOS-Interrupt) ^^^^ DRAW.H/CPP Zeichnen von Linien usw. Klasse : DRAW void SetPix(int x,int y,BYTE color,BYTE page); Ein Pixel zeichnen. BYTE GetPix(int x,int y,BYTE page); Ein Farbwert eines Pixels auslesen. void Line(int x1,int y1,int x2,int y2,BYTE color,BYTE page); Eine Linie zeichnen. void Rectangle(int x1,int y1,int x2,int y2,BYTE color,BYTE page); Ein Rechteck zeichnen. void Bar(int x1,int y1,int x2,int y2,BYTE color,BYTE page); Eine rechteckige Fl„che zeichnen. void Circle(float xm,float ym,float hm,float bm,float radius,BYTE color,BYTE page); Einen Kreis, oder eine Ellipse zeichnen. Diese Funktion ist f�r Spiele noch ungeeignet, weil zu langsam. void FillCircle(float xm,float ym,float hm,float bm,float radius,BYTE color,BYTE page); Einen ausgef�llten Kreis, oder eine ausgef�llte Ellipse zeichnen. Diese Funktion ist f�r Spiele noch ungeeignet, weil zu langsam. void Chassis(BYTE color); Rahmen �ber eine BIOS-Funktion auáerhalb der XY-Koordinaten zeichnen. MOUSE.H/CPP Mausfunktionen Klasse : MOUSE BYTE Reset(void); Maus zur�cksetzen. void Off(void); Mauscursor ausschalten. void On(void); Mauscursor einschalten. int Gx(void); X-Position der Maus im GAME-Modus auslesen. int Gy(void); Y-Position der Maus im GAME-Modus auslesen. int Tx(void); X-Position der Maus im TEXT-Modus auslesen. int Ty(void); Y-Position der Maus im TEXT-Modus auslesen. int Key(void); Welche Maustaste wurde gedr�ckt. Enjoy ;-)