####################################################################### ##################### GetmanSoft presents ############################ ####################################################################### SpriteEnginePro V2.20 << FREEWARE >> Autor: J”rg Getschurek INHALT: 1. Kurzbersicht 2. Systemanforderungen 3. Anleitung 4. Kommandozeilenparameter 5. Dateiformat 6. Beigefgte Dateien a. Programm b. Demo 1 (Weltraumanimation) c. Demo 2 (Slide-Show) d. GameLibrary ( BC++3.1) fr 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 beigefgten C++Funktionen ------------------------------------------------------------------------ 1. Kurzbersicht: - 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) - Untersttzung 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 untersttzt: 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 fr : Export, Drucken und Paletten-Nr. „ndern). - Export ins Windows-Bitmapformat. - Die Kopfdaten der Resource k”nnen komplett ausgedruckt werden. (fr 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 fr Borland C++ 3.1 beigefgt. 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 zurckgreifen, da diese Programme einen Wust an Grafikfunktionen/Tricks zur Verfgung 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! - Fr die N„chsten Versionen ist geplant: - Direktes bearbeiten von Paletten - Bilder im Grafikmodus vor-und zurckbl„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 beigefgt) 3. Anleitung Mit 'F2 - Neu' werden alle Bitmap-Dateien aus dem aktuellen Verzeichnis in eine Resourcen-Datei geschrieben. Die Bitmaps mssen dem vorgeschriebenen Format entsprechen: Bildbreite <=1024 Pixel Bildh”he <= 768 Pixel Farbtiefe 8 Bit (256 Farben) Unkomprimiert (RGB encoded) Die Datei-Erweiterung fr die Resource kann frei gew„hlt werden. (Empfehlung: *.SEP um die Verknpfung 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 fr 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 (fr 4000 Bilder sind ca.60 DINA4-Seiten n”tig!). -> Gilt auch fr Markierte Bilder! Mit 'F7 - Export' wird das fokussierte Bild als einzelne Bitmap-Datei ge- speichert. Eine eventuell bereits vorhandene Datei wird berschrieben. -> Gilt auch fr 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 fr 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 Fr Standard-VGA 320*200 = 0 Fr 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,Grn,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 Fllbytes fr 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 Fllbytes fr den Bitmapexport ) ³ À--> Byte-Folge Sprungadresse+26 Farbwerte des Bildes usw. 6. Beigefgte 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) fr Standard-VGA 320*200 256 Farben Alle CCP Dateien mssen 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 mssen durchgefhrt werden, um eine Animation durchzufhren : 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 mssen 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 Grn 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 mssen vom Spieler durchgefhrt 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 drfen nicht ge„ndert werden - Es darf beim Einlesen der Bitmaps keine Datei fehlen - Der Name der Grafikresource darf nicht ge„ndert werden ( natrlich 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 mssen die Bilder ins BMP-Format konvertiert werden: a. Bild laden b. Bild markieren (kopieren) c. Bitmapformat w„hlen [B] d. Bild einfgen 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 beigefgte Quellcode darf kpl., oder in Auszgen verwendet werden. Das Cockpit aus Demo1 ist ein gepatchtes TIE-Defender-Cockpit. Die Monster aus Demo2 sind aus dem Alien-Patch fr 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 beigefgten 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 fr '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 fllen. 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 fr ein Sprite reservieren und das Sprite laden. BOOL LoadSpriteToPage(WORD name,SPRITE bmp[],BYTE page) Sprite direkt in eine Bildschirmseite schreiben. ( Fr Hintergrundbilder!) void Free(WORD name,SPRITE bmp[]) Reservierten Speicher fr 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. (Fr 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 fr Spiele noch ungeeignet, weil zu langsam. void FillCircle(float xm,float ym,float hm,float bm,float radius,BYTE color,BYTE page); Einen ausgefllten Kreis, oder eine ausgefllte Ellipse zeichnen. Diese Funktion ist fr 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 zurcksetzen. 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 gedrckt. Enjoy ;-)