Technische Tips und Tricks:Einfache Datenkompression von B. Kühnast Dies soll eine mehr oder weniger regel- mäßige Serie werden. Ich werde hier auf einige der Probleme eingehen, die beim Programmieren auftreten können. Dabei werde ich mich nach Möglichkeit nicht auf eine Programmiersprache beschrän- ken. Als kurze persönliche Vorstellung soll hier nur erwähnt werden, daß ich mich schon ein paar Jahre mit Ataris be- fasse. Zu meiner Schande muß ich aber gestehen, daß die meisten meiner Pro- jekte aus Zeitmangel im Sande verlaufen sind. Weiter im Text: In dieser Folge geht es um Datenkompression (steht ja auch im Titel...). Gemeint sind damit aber nicht solche Sachen wie die Huffmann- Methode, sondern eine einfache Methode, mit der man relativ viel Platz sparen kann. Die größten Speicherfresser sind Musik- daten und Grafik. Musikdaten sind lei- der nicht so einfach zu packen und brauchen beim Entpacken immer noch viel Platz. Grafikdaten lassen sich dagegen gut komprimieren. An dieser Stelle ein paar Erklärungen: Komprimieren oder Packen bedeutet das Zusammenfassen von Daten, um Platz im RAM oder auf der Diskette zu sparen. Das Gegenteil ist Entpacken bzw. Dekomprimieren. Als Beispiel finden Sie auf der Disket- te das Spiel PUSH!. Auf Feinheiten wie Punktezählung und -anzeige habe ich verzichtet. PUSH! ist in Turbo-Basic geschrieben, man hätte es aber genauso- gut in Quick schreiben können. Jeder Level von PUSH! ist so groß, daß er ohne Scrollen auf einen Bildschirm paßt. Ein Bildschirm in Graphics 12 hat 40 Spalten * 24 Zeilen=960 Bytes. Da unser Beispiel 16 Levels hat, wären das 960 * 16=15360 Bytes oder 15 KBytes. Die Grafik von PUSH! wird aber aus Blöcken zusammengesetzt, wie z. B. auch bei Boulder Dash und Zybex. Jeder Block besteht aus 2 * 2 Zeichen. Wenn statt jedem Block nur ein Kennbyte gespei- chert wird, benötigen wir nur noch ein Viertel des Platzes, also 240 Bytes pro Level. Ein normaler Bildschirm sieht z. B. so aus: ABABABAB ... CDCDCDCD ... Wenn wir AB und CD als Block 1 zusammenfassen, erhalten wir: 1111 ... Bei PUSH! gibt es vier Blöcke: Kiste: Die schwarz-weißen Quadrate Stellplatz: Die schwarzen Ringe der Platz, wo die Kisten hin sollen Mauer: Die rot-schwarzen Quadrate und das leere Feld Sie sind von 0 bis 3 nummeriert. Um vier verschiedene Zahlen darzustellen, braucht man vier Bits: binär dezimal 00 0 01 1 10 2 11 3 Da ein Byte 8 Bit hat, werden die Kennzahlen von 4 Blöcken in ein Byte gequetscht, also: 4 * Block 1 = %01010101 = 85 dezimal Statt 240 Bytes pro Level werden jetzt nur noch 240 / 4=60 Bytes gebraucht. Das macht bei 16 Levels 960 Bytes statt 15360, also nur noch 6.25 %! Zugegeben: Nicht jedes Spiel hat nur 4 verschiedene Blöcke. Bei einem Programm mit 16 Blöcken kann man aber immer noch 2 Blöcke in ein Byte quetschen. Dann braucht ein Bildschirm 120 Bytes. Puuh, ein Dankeschön an die, die bis hier durchgehalten haben. Wir wenden uns jetzt dem Entpacken zu. Im Beispiel sind 2 Prozeduren von Bedeutung: ENTPACKEN und CHAR. 699 ---------------------------------- 700 PROC ENTPACKEN 730 W1=TRUNC(W/64):W=W-W1*64 740 W2=TRUNC(W/16):W=W-W2*16 750 W3=TRUNC(W/4):W4=W-W3*4 . . . 797 ENDPROC 799 ---------------------------------- In ENTPACKEN wird das Byte W durch 64, 16 und 4 geteilt, so daß man in W1 bis W4 vier einzelne Kennzahlen erhält. (TRUNC ergibt übrigens den Wert einer Zahl ohne die Nachkommastellen zu berücksichtigen.) In CHAR werden dann die der Kennzahl entsprechenden Zeichen ausgegeben, aus 1 wird also die Kiste usw. So, ich hoffe, daß ich einige Anre- gungen geben konnte. Wie oben erwähnt benutzen ja auch kommerzielle Programme die Darstellung durch Blöcke. Zur Entspannung kann man sich ja auf PUSH! stürzen. Hier noch schnell die Bedienung: Unter Turbo-Basic das Programm PUSH.TUR starten. Im Titelbild den Feuerknopf drücken. Ziel des Spieles ist es, die Kisten (schwarz-weiße Quadrate) an die Stellplätze (schwarze Ringe) zu schieben. Sind alle Kisten unterge- bracht, folgt der nächste Level. Geschoben wird, indem man den Cursor (der weiße Rahmen) neben die Kiste stellt und den Joystick Richtung Kiste drückt. Man kann keine zwei Kisten gleichzeitig schieben. Vorsicht: Es gibt Stellen, wo man die Kisten nicht mehr weg bekommt! Mit dem Feuerknopf kann der Level aber neu gestartet werden. So, das war aber wirklich genug. Bis zum nächsten Mal !