Programm-Version v1.13 von RandomXmas vom 07.05.2002 (ca. 225 KB) Readme.txt: 07.05.2002 (324 Zeilen) Texturen: *.bmp: 05.05.2002 (77.512 Bytes) makefile: 16.04.2002 (51 Zeilen) Programmierer: Stefan Ziegler Mails an: stefan.ziegler_zst@gmx.de Webseite: http://www.stefanziegler-online.de/weihnachten/weihprogs.html (English version in readme_EN.txt) Lizenz/License /* RandomXmas v1.13 zu Weihnachten 2001 * Frei kopierbar, aber nur vollstaendig mit allen zugehoerigen Quelltexten, * Makefile, readme.txt und tex*.bmp. Veraenderungen moeglich, bei Weitergabe * aber immer Original-Quelltexte mit beilegen (gleicht moegliche Fehler im * geaenderten Teil aus), * Keine Patentierungen auf Teile des oder ganzes Programm(s)*/ /* RandomXmas v1.13 for Christmas 2001 * Free Copying, only with all belonging program files, Makefile, Readme.txt, * and tex*.bmp. Changes are possible, but republishing only with all original * files (to have an original if there will be any mistakes in changes). * I don't want any software patents on parts or all of the program.*/ Inhalt: 1. Anleitungen 1.1 Bedienung 1.2 Spielbeschreibung 1.3 Benutzung 1.4 Texturen 2. Programmierung 2.1 Geschichte des Programms 2.2 Geplante Verbesserungen 2.3 Klassen 1. Anleitungen ============== 1.1 Bedienung: - Spielfigur bewegen auch mit Maus: Taste links gedrueckt halten und Maus verschieben. Spielfigur bewegt sich dann in diese Richtung. Aufladen fuer Sprung mit mittlerer Maustaste. Je nach Programmgeschwindigkeit ist die Bewegung per Maus unterschiedlich sensibel, (einstellbar in "konstanten.h"). - Tasten 'x', 'y', 'z' drehen Spielfeld auf der entsprechenden Achse, je um 30 Grad in positiver Richtung. - Tasten 'X', 'Y', 'Z' drehen Spielfeld entsprechend in negativer Richtung. - Mit Taste 'i' drehen sie das Spielfeld wieder in die Ausgangsrichtung. - Mit 'd', 'v', 'r' schalten Sie zwischen (D)rehen, (V)erschieben und (R)eshape (Fenstergroesse) um. Bei allen funktioniert 'X'/'x', 'Y', 'y', 'i', beim Verschieben/Drehen natuerlich auch 'z'/'Z'. - Taste 'p' schaltet Punktanzeige an/aus. - 'Esc'-Taste beendet Spiel vorzeitig mit Punktzahl 0. - Spielfigur bewegen Sie mit Cursortasten (oder Maus). - Mit Taste 'Ende' aufladen fuer Sprung, ausgefuehrt mit Cursortasten. - Scrollen bei Highscore mit 'Bild hoch' oder 'Bild herunter'(Page Up/Down) oder mit Maus("Rollen" im Menue) mit gedrueckter linker Maustaste hoch/runter. - Umschalten auf Blick von Spielfigur/von aussen mit 'b'. ausgefuehrt nach einer Bewegung der Spielfigur. - Weitere Spielfiguren mit 'n', Auswaehlen der Figur mit 's'. Es zaehlen die Punkte der Figur, die als letztes im Spiel benutzt wurde. - Pull-down-Menue mit rechter Maus-Taste erreichbar, dort sind alle Funktionen drin, die auch mit der Tastatur benutzt werden koennen. - Theoretisch auch mit Joystick (ab GLUT-API 4, nur mit Windows, nicht getestet). Die Groesse des Fensters ist variabel, sollte aber quadratisch gehalten werden, sonst verdreht sich in Extremfaellen das Spielfeld nach unten. 1.2. Spielbeschreibung: Sammeln Sie Punkte unter (zufaellige Werte) und ueber (zufaellig, aber gleicher Buchstabe(nur noch 6 verschiedene) - gleiche Veraenderung) den Baeumen (hineinlaufen/springen). In einigen Faellen aendert sich dabei die Maximalpunktzahl (nicht zufaellig). Mit groesseren Huegeln wechseln sie in andere Ebenen. In einigen Faellen verlieren sie aber auch(siehe Konstanten). Bei kleineren passiert nichts. Fuer die Buchstaben darueber gilt das gleiche wie bei den Baeumen. Wenn die Maximalpunktzahl erreicht ist (rechts von den Punkten), dann gehen sie in einen Huegel und das Spiel ist beendet (oder mit 'Esc'). Dann kommt die TopTen und darunter ihre Punktzahl (bei verlorenen -1, abgebrochenen Spielen 0) mit Datum, Uhrzeit und Namen (soweit angegeben). Mit 'Esc'-Taste beendet sich dann das Programm. 1.3. Benutzung: Braucht Libraries GL, GLU, GLUT und andere Standardbibliotheken. Download-Hinweise bei www.opengl.org -> Downloads Glut: http://www.opengl.org/developers/documentation/glut.html glut.dll fuer Windows bei http://www.xmission.com/~nate/glut.html Uebersetzungs-Hinweise bei: http://www.lighthouse3d.com/opengl/glut/ Variable DETAILS in konstanten.h: 10 ist Standard, d.h. 100 Polygone je Kugel, 50 Polygone je Kegel(-stumpf). 1. spiel113.tar.gz in ein Verzeichnis kopieren, auspacken mit 'tar -xzvf spiel113.tar.gz' 2. Programm uebersetzen mit 'make spiel' 3. Bei fehlerfreier Uebersetzung ist eine Datei 'spiel' angelegt worden. 4. Mit './spiel' starten sie das Programm 5. Mit './spiel highscore' wird das Punktergebnis in dieses File eingetragen. Die Filelaenge ist beliebig (sollte in den Speicher passen), je Zeile werden 100 Zeichen gelesen (sonst Umbruch) und nach Einordnung der erspielten Punkte die Zeilen zurueckgeschrieben. 6. Mit './spiel highscore Name' oder 'spiel highscore Vorname Nachname' wird der Name ins Highscorefile mit eingetragen. 7. Also am besten Variante 6 in Script/Batch-Datei stecken und damit starten. 1.4 Texturen Als Texturen koennen beliebige BMP-Dateien genutzt werden. Diese werden dann auf das entsprechende Objekt draufgelegt(gestreckt/gezerrt) und dargestellt. Durch die erwaehnte Zerrung sieht das Bild dann nicht immer so aus wie erwartet. Auf der Ebene wird es nur verkleinert/vergroessert. Voreingestellt sind folgende Dateinamen entsprechend ihrer Bestimmung: Im Verzeichnis "textures/" - "texebene.bmp" Dateiname fuer Textur auf Ebene - "texhuegel.bmp" Dateiname fuer Textur auf Huegel - "texbaum.bmp" Dateiname fuer Textur auf Baeumen - "texcap.bmp" Dateiname fuer Textur auf Muetze des Weihnachtsmannes - "texhead.bmp" Dateiname fuer Textur auf Kopf des Weihnachtsmannes - "texbody.bmp" Dateiname fuer Textur auf Mantel des Weihnachtsmannes - "texshoes.bmp" Dateiname fuer Textur auf Schuhen Mitgeliefert wurden folgende 10 Bilder (erstellt mit 'xfig' und 'xv'): Dateiname empfohlene Nutzung (per Link/Kopieren) - "baum.bmp" Baum-Textur fuer Baum - "beton.bmp" Beton-Textur fuer Huegel/Ebene - "colorgrid.bmp" Farbiges Gitter, zum Testen auf runden Oberflaechen - "eis.bmp" Eis-Textur fuer Huegel/Ebene - "erde.bmp" Erd-Textur fuer Huegel/Ebene - "gesicht.bmp" Gesicht fuer Kopf der Spielfigur - "holz.bmp" Holz-Textur fuer Baum/Huegel/Ebene - "sand.bmp" Sand-Textur fuer Huegel/Ebene - "schnee.bmp" Schnee-Textur fuer Huegel/Ebene - "stein.bmp" Stein-Textur fuer Huegel/Ebene Zum Testen, ob das Bild im Programm ladbar ist, kann man "testtexturen" verwenden (make testtexturen). Starten mit "testtexturen " Das geladene Bild kann man dann genauso drehen und verschieben wie die Ebene oder das Highscorefile im Spiel (nur mit Tastatur). Es muessen nicht alle Dateien vorhanden sein! Wenn eine fehlt, sieht die Darstellung genauso aus wie in Version 1.11 . Es entsteht kein Programmfehler. Die Groesse ist beliebig, sollte aber in den Speicher passen(4 Byte pro Pixel und Zusatzinfos). Bei grossen Bildern dauert aber das Laden am Programmstart laenger und diese werden meist stark verkleinert, damit sie "passen". 2. Programmierung ================= 2.1 History: 21.12.2000: erste Beta-Version, einige kleinere Macken, aber keine schweren Fehler, spielbar 22.12.2000: v1.00 Erste nahezu fehlerfreie Version 25.12.2000: v1.01 -Anzeige der Geschenke ausschaltbar, -eine schon vorhandene Ebene wird nicht neu angelegt, wenn in sie gewechselt wird (sonst Speicher belegt, der nicht wieder freigegeben werden kann) -Readme mit History -Versionsnummern eingefuehrt. 05.01.2001: v1.02 Punktanzeige korrigiert, jetzt FELDEINHEIT ueberall Mass fuer Abstand, statt MAXFELDHOEHE zwischen grossen und kleinen Geschenken. 06.01.2001: v1.03 Zeitausgabe am Ende umprogrammiert auf gettimeofday. und ohne doppeltes Newline Makefile erweitert auf alle X-Libs 09.11.2001: v1.10 - Punkteanzeige mit Ziffern, Schriftverwendung, - Highscorefile-Verarbeitung/Anzeige, - Punktesammeln erweitert, - globales Licht in Szene und entsprechende Farben, - Joystickfunktion eingebaut aber nicht getestet, - Aufteilen des Codes in Files mit den entsprechende Klassen, - Standard-Sicht veraendert. - ToDoList eingefuegt in readme 23.12.2001: v1.11 - Sprunghoehe abhaengig von MAXFELDHOEHE - Quadrics geloescht bei Ebenenwechsel - Schriftanzeige deutlicher, von 64 auf ca. 128 Zeichen - auch bei Highscore X-Drehung(vorher nur Y/Z) moeglich - Highscore zeigt jetzt auch beliebiges File ohne Probleme an (bei Readonly-Rechten auch nicht veraendert) - Filelaenge beliebig durch Nutzung von Listen - Scrolling bei Highscore-Dateianzeige. - Displaylisten in extra Programmstueck ausprobiert - Detaillevel einstellbar fuer Baeume/Huegel - Klassen-Beschreibung eingefuehrt in Readme.txt 09.01.2002: v1.12 - Tabulator in Grafikausgabe korrigiert, 1 als erste Position - Displaylisten und Texturen vollstaendig in Ebene/Feld, auch ungerade Anzahl in MAXFELD unterstuetzt - Mann mit Texturen, auf eigenen Blickwinkel umschaltbar, bei Bedarf auch mit DETAILS anpassbar, Displaylist - nur noch 6 verschiedene Buchstaben zum Punktesammeln - Klasse Texturen, kann sie auch selber darstellen - Klasse Stringlist geaendert, nur noch strlen in FindText abhaengig von Grundtyp char-Feld. - Readme mit Inhalt, Abschnitte Texturen, Lizenz, Teile in Englisch. - Vier Textur-Dateien mitgeliefert, Makefile neu geschrieben - Darstellung von Mann/Ebene/Feld weniger Push-/Popmatrix, beschleunigt - Double-Buffer eingefuehrt gegen Flimmern beim Neu-Zeichnen 06.05.2002: v1.13 - Warnings bei Uebersetzung aufgeloest (allgemein) - einige System-Header-Files hinzugefuegt (sont manchmal Probleme beim Uebersetzen) - readme.txt angepasst, Englische Version extra - neue Texturen, alte verbessert, in Unterverzeichnis. (ebenefeld) - Ebenenummer und Text in extra Funktion, extra Fensterbereich und unabhaengig von MAXFELD (jetzt feste Groessen) - Ebene Bodenflaeche ohne GEN_TEXTUR(ausgeschaltet), alle anderen jetzt mit GEN_TEXTUR (geschenke) - TriggerPunktAnz gibt keinen Wert mehr zurueck - Punktanzeige auf fester Position (ohne MAXFELD) (grafikausg) - Funktion DrawGlutChar zeichnet mit GLUT-Strich-Schrift - Diese nur genutzt bei gesetzter Konstante USE_GLUT_FONT - Fuer Groesse nur noch positive Werte angenommen - bei Divisionen float Werte als Divisor(Teiler) (highsboard) - ausgegliedert aus Datei spiel.cpp - Uebergabe Punkte, Name, Dateiname an Konstruktor - CloseSublist, GetListLine extra Funktion, vereinfacht Readfile, Writefile -> keine doppelten Zeilen drin - Variablen uebersetzt/umbenannt ins Englische - Fehler bei Punktzahl -1 speichern entfernt (-2 als Abbruch) (konstanen.h) - Farb-, Licht- und Materialwerte dorthin - Unterteilt in 4 Abschnitte -> umgeordnet - einige (v.a. boolesche) Variablen als char statt short - neu: MANN_NUMBER, MANN_CAP, USE_GLUT_FONT, MOUSE_SENSE, USE_TEXTURES (makefile) - neue Regeln fuer highsboard, spielraum - SPIELOBJ aufgeteilt - Regel zum Kompilieren von C-Files (inkl. CLFAGS) (mann) - extra Funktion DrawPunkte fuer Punktausgabe in extra Bereich - Blickwinkel des Spielers in extra Prozedur und verbessert - Fuer Klasse spielraum angepasst, Ebenegenerierung dort - in Addpos neue x- und y-Position zusammengelegt - bekommt Punkte des Feldes von spielraum - Kopf-Sphere richtig gedreht, damit Textur richtig liegt - durch MANN_CAP mit/ohne Muetze zeichnen (spiel.cpp) - Winkelneuberechnung bei Drehen in negativer Richtung korrigiert (und in neue DoRotate) - Mausunterstuetzung fuer Bewegung der Spielfigur, und Drehen/verschieben/Scrollen -> mousemodifmodes MOUSE_SENSE in konstanten.h zur Sensibilitaet - Maus-Menue, entspr. Funktionen damit wie Tastatur - Joystick-Funktion wie MouseMotion angepasst, (Joystick erst ab GLUT API 4, Win unterstuetzt), wird mit dieser Bearbeitungsfunktion wohl falsch arbeiten (unab- haengig von Unterstuetzung) - Winkel, Verschiebungen in 2 Felder fuer je 3 Achsen modifmodekey statt 3 Variablen -> Var.zahl verkleinert - Name schon bei Uebergabe zusammengesetzt, so an highscore - Mehrere Spielfiguren (Feld weihmann, Zeiger weihmann_id) (CreateFigure, SwitchFigure) - Punktlichter vorn und hinten(Pos) -> eigene AMB, DIF, SPEC, in extra Funktion bei Draw da manchmal verstellt - an Nutzung von Klasse spielraum angepasst - InitHighscore aus display ausgelagert, mit Menue-Anpassung in display auch gleich Darstellung -> ohne Taste druecken - Funktion DrawGameScreen ausgelagert aus display, zwei Fensterbereiche ->Viewport, LookAt, Perspective - bei Reshape bei Blick Mann nicht LookAt veraendert - Funktionen DoRotate, DoTranslate aus Eingabebehandlung heraus (nicht mehr doppelt bei Maus, Joystick, Tastatur) beide umgeschrieben, - DoMove genauso ausgelagert aus Eingabebehandlung, total umgeschrieben (nur noch eine statt 15 lokalen Variablen) - bei Tastaturbehandlung (void key(...) ) grosse/kleine Achsenangabe nur durch mult unterschieden (spielraum) - ausgegliedert aus ebenefeld, mann, spiel.cpp - aus Struktur Klasse gemacht -> Methoden fuer Variablen - Variablen umbenannt/uebersetzt - Switchlevel: umschalten in andere Ebene, aus Mann heraus - GetContent, GetAbove statt direkter Abfrage der Ebene - SwitchEnd: umschalten auf highscore/Spielende zentral - uebernimmt Laden der Texturen von spiel.cpp - TriggerViewMann uebernimmt rueckschalten von spiel.cpp - Draw-Funktionen fuer Zugriff auf entspr. Ebene-Fkt. (texturen) - neue Funktion Test_print_error zur Fehlerausgabe - diese mit entspr. Fehlertexten eingefuegt - 24-bit BMP: Farbreihenfolge umgedreht entspr. xv-Erzeugung - Textur-Koordinaten generieren einschalten (OBJECT_LINEAR) - Ausgabe auf Ebene: ohne Generierung; umgebaut 2.2 ToDoList: - Version fuer Nicht-Weihnachtszeit (Farben und Material der Felder/Spielfigur), - gluLookat Zentrale Werte (nur an einem Platz) - Klasse main ? - Konfigurationsfile statt "konstanten.h", - autoconf - Uebersetzung, - Veroeffentlichung unter GPL 2.0 (nicht fuer Versionen vor 1.14), - ladbare Schriften (Konsolefonts ?), - Sound (Soundblaster-Beeps und Wavefile-Abspielung), - Netzwerk- und Mehrspieler-Modus irgendwann 2.3 Klassen: Ebene: Darstellung eines Levels, nutzt Feld, Grafikausgabe und (ebenefeld.h) Texture Feld: Darstellung eines Gegenstandes(Baum/Huegel), (ebenefeld.h) nutzt Grafikausgabe und Texture Geschenke: Punkte eines Spielers, Darstellung dieser, nutzt Grafikausgabe Grafikausgabe: Darstellung/Aufbewahrung von Zahlen, char[]-Zeichenketten (grafikausg.h) mit eigener oder GLUT-Schrift Highscoreboard: Darstellung des Highscore oder allgemein von Files, nutzt (highsboard.h) Doublelist, Stringlist und Grafikausgabe Simplelist: Grundklasse der Listen, einfach verkettet, fuer Zahlen (listen.h) Template spaeter ? Stringlist: Listenklasse fuer char-Felder(Strings), abgeleitet von (listen.h) Simplelist, Texttype derzeit nur fuer char-Felder, strlen fuer beliebige Felder ? dann Template-Klasse. Doublelist: Doppeltverkettete Liste fuer Listenhierarchie (nimmt Listen (listen.h) auf), abgeleitet von Simplelist. Template spaeter ? Mann: Darstellung, Verwaltung eines Spielers, nutzt Geschenke, (mann.h) Spielraum und Texture Spielraum: Aufnahme aller noetigen Variablen eines Spiels, Nutzung von (spielraum.h) Ebene, Texture, ohne Spieler. Verwaltung und Weitergabe der Werte an nutzende Klassen/Programme. Texture: Laden einer Textur aus BMP-Datei, Darstellung/Nutzen dieser Haupt-Programm: nutzt Spielraum, Mann, Highscoreboard. Zusammenspiel aller (spiel.cpp) wichtigen Klassen geregelt, GL-Grundfunktionen, Bedienung.