home *** CD-ROM | disk | FTP | other *** search
- UNIT SpieleGraph;
- (* UNIT mit allgemeinen Routinen für die Spieleprogrammierung *)
- (* 12.10.1988 *)
-
- INTERFACE
-
- USES
- CRT, Graph;
-
- CONST
- MinX = 0; (* Bildschirm links *)
- MinY = 0; (* Bildschirm oben *)
-
- VAR MaxFarbe, (* Verfuegbare Farben *)
- MaxX, MaxY : INTEGER; (* Bildschirm-Koordinaten *)
- Space : POINTER; (* Leerzeichen fuer Grafik-Texte *)
- EndX, EndY : INTEGER; (* rechte bzw. untere Linie des Editierfeldes *)
-
- TYPE Bild = RECORD
- BildPtr : POINTER;
- Vorh : BOOLEAN;
- END;
-
- VAR Screen : ARRAY [1..3] OF Bild;
- (* [1] speichert Editier-Bild *)
- (* [2] speichert ArbeitsBild *)
- (* [3] speichert Kollektor-Bild *)
- (* vor dem ersten Aufruf "Screen.Vorh" unbedingt auf FALSE Setzen ! *)
-
- VAR GraphDriver,
- GraphMode : INTEGER;
-
- CONST GraphDir : STRING = 'D:\TP\Grafik';
- (* Verzeichnis mit Graphik-Treibern ! ANPASSEN !! *)
-
- PROCEDURE GraphikInit (GraphDriver, GraphMode : INTEGER);
- PROCEDURE GraphikEnde;
- FUNCTION Int2Str (Zahl, Stellen : INTEGER) : STRING;
- FUNCTION SaveGraphikScreen (Links, Oben, Rechts, Unten : INTEGER;
- DateiName : STRING) : INTEGER;
- FUNCTION LoadGraphikScreen (Links, Oben, Rechts, Unten : INTEGER;
- DateiName : STRING) : INTEGER;
- PROCEDURE ScreenToRam (Nr : INTEGER);
- PROCEDURE RamToScreen (Nr : INTEGER);
- PROCEDURE PortToRam (Links, Oben, Rechts, Unten, Nr : INTEGER);
- PROCEDURE RamToPort (Links, Oben, Nr : INTEGER);
- PROCEDURE HolZeichen (VAR Eingabe : CHAR);
- PROCEDURE HolString (VAR Text : STRING; Laenge : INTEGER);
- PROCEDURE SchreibSpace (Hori, Verti : INTEGER);
- PROCEDURE Beep (Ton, Dauer : INTEGER);
- PROCEDURE MachRaster
- (StartX, Spalten, DeltaX, StartY, Zeilen, DeltaY : INTEGER;
- Kennung : BOOLEAN);
- PROCEDURE Invers;
- PROCEDURE Normal;
- (*-----------------------------------------------*)
- IMPLEMENTATION
- (*-----------------------------------------------*)
- PROCEDURE GraphikInit (GraphDriver, GraphMode : INTEGER);
- (* setzt Graphikmodus *)
- VAR GraphikFehler : INTEGER;
-
- BEGIN
- DirectVideo := FALSE;
-
- InitGraph (GraphDriver, GraphMode, GraphDir);
-
- GraphikFehler := GraphResult;
- IF GraphikFehler <> GrOK THEN
- BEGIN
- WRITELN ('Graphik-Fehler : ', GraphErrorMsg (GraphikFehler));
- WRITE ('Das Programm wird abgebrochen !');
- HALT (1);
- END;
-
- MaxFarbe := GetMaxColor;
- MaxX := GetMaxX; MaxY := GetMaxY;
-
- GetMem (Space, ImageSize (0,0,7,7)); GetImage (0,0,7,7, Space^);
- (* Space-Zeichen für die Grafik-Ausgabe *)
- Screen [1].Vorh := FALSE; Screen [2].Vorh := FALSE;
- Screen [3].Vorh := FALSE;
- END;
- (*-----------------------------------------------*)
- PROCEDURE GraphikEnde;
- (* von der Graphik wieder in den Text-Modus zurück *)
- BEGIN
- CloseGraph;
- TextMode (C80);
- DirectVideo := TRUE;
- END;
- (*-----------------------------------------------*)
- (*-----------------------------------------------*)
- FUNCTION Int2Str (Zahl, Stellen : INTEGER) : STRING;
- (* Umwandlung für OutChar *)
- VAR S: STRING;
- BEGIN STR (Zahl:Stellen, S); Int2Str := S; END;
- (*-----------------------------------------------*)
- FUNCTION SaveGraphikScreen (Links, Oben, Rechts, Unten : INTEGER;
- DateiName : STRING) : INTEGER;
- (* Sprite auf Disk. speichern *)
- (* man kann auch den ganzen Bildschirminhalt abspeichern *)
- (* korrekt, wenn Ergebnis = 0 *)
- VAR BildGroesse : INTEGER;
- BildPtr : POINTER;
- Hilf : INTEGER;
- Datei : FILE;
- (*------------------*)
- PROCEDURE ScreenToPointer;
-
- BEGIN
- BildGroesse := ImageSize (Links, Oben, Rechts, Unten);
- GetMem (BildPtr, BildGroesse);
- GetImage (Links, Oben, Rechts, Unten, BildPtr^);
- END;
- (*------------------*)
- BEGIN (* SaveGraphikScreen *)
- ScreenToPointer;
- ASSIGN (Datei, DateiName);
- {$I-} REWRITE (Datei, 1); {$I+}
- Hilf := IOResult; SaveGraphikScreen := Hilf;
- IF Hilf <> 0 THEN EXIT;
- (* Fehlermeldung kann man noch ergänzen *)
- BlockWrite (Datei, BildPtr^, BildGroesse);
- CLOSE (Datei);
- END;
- (*-----------------------------------------------*)
- FUNCTION LoadGraphikScreen (Links, Oben, Rechts, Unten : INTEGER;
- DateiName : STRING) : INTEGER;
-
- (* Aufruf z. B. mit
- IF LoadGraphikScreen (0,0, GetMaxX, GetMaxY, 'D:test1.scr') <> 0 THEN
- BEGIN CloseGraph; WRITE (fehlermeldung); END; *)
-
- VAR BildGroesse : INTEGER;
- BildPtr : POINTER;
- Hilf : INTEGER;
- Datei : FILE;
-
- BEGIN (* LoadGraphikScreen *)
- BildGroesse := ImageSize (Links, Oben, Rechts, Unten);
- GetMem (BildPtr, BildGroesse);
- ASSIGN (Datei, DateiName);
- {$I-} RESET (Datei, 1); {$I+}
- Hilf := IOResult; LoadGraphikScreen := Hilf;
- IF Hilf <> 0 THEN EXIT;
- BlockRead (Datei, BildPtr^, BildGroesse);
- CLOSE (Datei);
- PutImage (MinX, MinY, BildPtr^, NormalPut);
- END;
- (*-----------------------------------------------*)
- PROCEDURE ScreenToRam (Nr : INTEGER);
- (* Bildschirminhalt im RAM ablegen *)
- (* ScreenToRam u. PortToRam lassen sich natürlich zusammenfassen *)
- (* so ist es aber im Hauptprogramm etwas leichter nachvollziehbar *)
-
- VAR Groesse : INTEGER;
-
- BEGIN
- Groesse := ImageSize (MinX, MinY, MaxX, MaxY);
- IF Screen [Nr].Vorh THEN
- FreeMem (Screen [Nr].BildPtr, Groesse);
-
- GetMem (Screen [Nr].BildPtr, Groesse);
- GetImage (MinX, MinY, MaxX, MaxY, Screen [Nr].BildPtr^);
- Screen [Nr].Vorh := TRUE;
- END;
- (*-----------------------------------------------*)
- PROCEDURE RamToScreen (Nr : INTEGER);
- (* vom RAM auf den Bildschirm *)
- BEGIN
- IF Screen [Nr].Vorh THEN
- PutImage (MinX, MinY, Screen [Nr].BildPtr^, NormalPut);
- END;
- (*-----------------------------------------------*)
- PROCEDURE PortToRam (Links, Oben, Rechts, Unten, Nr : INTEGER);
- (* Bildschirmausschnitt im RAM ablegen *)
- VAR Groesse : INTEGER;
-
- BEGIN
- Groesse := ImageSize (Links, Oben, Rechts, Unten);
- IF Screen [Nr].Vorh THEN
- FreeMem (Screen [Nr].BildPtr, Groesse);
-
- GetMem (Screen [Nr].BildPtr, Groesse);
- GetImage (Links, Oben, Rechts, Unten, Screen [Nr].BildPtr^);
- Screen [Nr].Vorh := TRUE;
- END;
- (*-----------------------------------------------*)
- PROCEDURE RamToPort (Links, Oben, Nr : INTEGER);
- (* vom RAM auf den Bildschirm *)
- BEGIN
- IF Screen [Nr].Vorh THEN
- PutImage (Links, Oben, Screen [Nr].BildPtr^, NormalPut);
- END;
- (*-----------------------------------------------*)
- PROCEDURE HolZeichen (VAR Eingabe : CHAR);
- (* 1 Zeichen inklusive einiger Scan-Codes *)
- BEGIN
- Eingabe := ReadKey;
- IF Eingabe = #0 THEN IF KEYPRESSED THEN (* IBM-Scan-Code *)
- BEGIN
- Eingabe := ReadKey;
- CASE Eingabe OF
- 'H' : Eingabe := ^E; (* Cursor hoch *)
- 'K' : Eingabe := ^S; (* Cursor links *)
- 'M' : Eingabe := ^D; (* Cursor rechts *)
- 'P' : Eingabe := ^X; (* Cursor tief *)
- 'G' : Eingabe := ^W; (* Home *)
- 'O' : Eingabe := ^C (* End *)
- ELSE Eingabe := '0';
- END;
- END
- END;
- (*-----------------------------------------------*)
- PROCEDURE HolString (VAR Text : STRING; Laenge : INTEGER);
- (* Texteingabe im Graph-Modus, Korrektur mit BackSpace .. *)
- (* .. Abbruch mit ESC *)
-
- VAR Zeichen : CHAR;
-
- BEGIN
- Text := '';
- REPEAT
- Zeichen := ReadKey;
- IF (Zeichen >= ' ') AND (BYTE (Text [0]) < Laenge) THEN
- BEGIN
- Text := Text + Zeichen; OutText (Zeichen);
- END
- ELSE IF (Zeichen = #8) THEN (* BackSpace *)
- IF Text [0] > #0 THEN
- BEGIN
- MoveRel (-8, 0);
- PutImage (GetX, GetY, Space^, NormalPut);
- DEC (Byte (Text [0]));
- END;
- IF Zeichen = #27 THEN Text := '';
- UNTIL (Zeichen = #13) OR (Zeichen = #27);
-
- END;
- (*-----------------------------------------------*)
- PROCEDURE SchreibSpace (Hori, Verti : INTEGER);
- BEGIN
- MoveTo (Hori, Verti);
- PutImage (GetX,GetY,Space^,NormalPut);
- END;
- (*-----------------------------------------------*)
- PROCEDURE Beep (Ton, Dauer : INTEGER);
-
- BEGIN
- SOUND (Ton); DELAY (Dauer); NoSound;
- END;
- (*-----------------------------------------------*)
- PROCEDURE MachRaster
- (StartX, Spalten, DeltaX, StartY, Zeilen, DeltaY : INTEGER;
- Kennung : BOOLEAN);
-
- (* baut ein Spielfeld aus Rechtecken auf *)
-
- VAR Schleife, Hilf : INTEGER;
-
- BEGIN
- EndX := StartX + Spalten * DeltaX;
- EndY := StartY + Zeilen * DeltaY;
-
- (* waagrechte Linien *)
- Schleife := 0;
- WHILE Schleife <= Zeilen DO
- BEGIN
- Hilf := StartY + DeltaY * Schleife;
- Line (StartX, Hilf, EndX, Hilf);
- INC (Schleife, 1);
- END;
-
- (* senkrechte Linien *)
- Schleife := 0;
- WHILE Schleife <= Spalten DO
- BEGIN
- Hilf := StartX + DeltaX * Schleife;
- Line (Hilf, StartY, Hilf, EndY);
- INC (Schleife, 1);
- END;
-
- IF Kennung THEN BEGIN
- FOR Schleife := 1 TO Spalten DO
- OutTextXY (StartX + DeltaX * Schleife - DeltaX DIV 2,
- StartY - 12, CHR(64 + Schleife));
-
- FOR Schleife := 1 TO Zeilen DO
- OutTextXY (StartX - 10, StartY + DeltaY * Schleife - DeltaY DIV 2,
- Int2Str (Schleife, 1));
- END; (* IF Kennung *)
-
- END;
- (*-----------------------------------------------*)
- PROCEDURE Invers;
- BEGIN TextColor(0); TextBackGround(14) END;
- (*-----------------------------------------------*)
- PROCEDURE Normal;
- BEGIN TextColor(14); TextBackGround(0) END;
- (*-----------------------------------------------*)
- BEGIN
- END.
- (*-----------------------------------------------*)