HaDesWWW logo
Startseite

Downloads
Geschichte(n)
 
Hardware
FPGA-Board
Prozessor
  Instruktionssatz
Peripherie
  XBus-Referenz
PS/2-Board
Soundboard
USB-MMC-Board
 
PC-Software
HaCom
HoAsm, HLink
Emulator
Connectivity
 
Embedded Software
HAL
Dateimanager
Tetris
PacMan
3D-Engine
Pong
PacMan 3D
 
Kontakt

HaDes XP - Pong

Überblick

Screenshot von Pong

Pong ist der ultimative Videospiel-Klassiker, denn schließlich war es das erste Videospiel überhaupt. Mit dem hat allerdings unsere Version nur noch wenig gemeinsam. Na gut, einen Ball quer über den Bildschirm befördern musste man auch damals schon... aber bei uns gibt es auch noch:

  • Zwei Spielmodi:
    • Pong-Turnier (Punkte gibt's, wenn der Gegner den Ball verliert)
    • Arkanoid (Wer räumt am meisten Hindernisse ab?)
  • Frei definierbare, polygon-förmige Hindernisse mit abgerundeten Ecken
  • Ablenkung und Beschleunigung ("Schmettern") des Balls mit dem Schläger
  • Super Soundeffekte 

Bedienung

Nach dem Start von Pong muss zunächst ein Level ausgewählt werden. Folgen Sie dazu den Anweisungen des Programms.

Die Steuerung der Schläger kann mit Hilfe des Tastaturkonfigurationsprogramms (Taste "C" im Hauptmenü) verändert werden. Die Standardeinstellungen sind wie folgt: 

Spieler 1 Spieler 2
links Position des Spielers rechts
[W] nach oben, [S] nach unten
Bewegung des Schlägers Cursor-Tasten (hoch, runter)
[linke Umschalttaste] Beschleunigung ("Schmettern") [Enter]

Grundlegend gilt: Versuchen Sie, stets den Ball zu treffen. Durch geschickten Einsatz des Schlägers können Sie den Ball auch in begrenztem Umfang steuern, je weiter unten am Schläger der Ball nämlich auftrifft, desto weiter wird er nach unten abgelenkt. Zusätzlich können Sie den Ball beschleunigen, indem Sie hart zuschlagen, d.h. etwa zwei Sekunden vor dem Aufprall die Beschleunigungstaste drücken und festhalten. 

Im Pong-Modus müssen Sie nun nur noch Ihren Gegner austricksen, so dass er den Ball öfter verliert als Sie, nach 11 Punkten haben Sie dann das Level gewonnen. 

Der Arkanoid-Modus ist deutlich komplizierter. Hier müssen alle Hindernisse ("Steine") auf dem Feld abgebaut werden, indem Sie diese ein- oder mehrfach (je nach Art des Steins) treffen. Für das Entfernen eines Steins gibt es Punkte. Zusatzpunkte (Double oder Triple Bonus) gibt es, wenn Sie mehr als einen Stein binnen einer Sekunde treffen. Verlieren Sie den Ball, dann wird Ihnen ein Leben abgezogen. Neue Leben gibt's für Punkte (aber immer seltener...).
Meist sind graue Steine schwer abzubauen (3-5 Treffer nötig) und alle anderen leicht (1 Treffer). Manchmal gibt es aber auch unzerstörbare Hindernisse, die Sie einfach umspielen müssen. 

Implementierung

Pong entstand zunächst in einer Version für die HaDes IV des Hardwarepraktikums, das wir im WS 2004/05 betreuten. Die hatte keine Hindernisse, keinen Arkanoid-Modus und natürlich auch keinen Sound, aber zum Ausgleich furchtbar hässlichen Code, damit sie in den winzigen Instruktionsspeicher (888 Befehle) der HaDes IV passte. 

Beim Rewrite von Pong für die HaDes XP war dann die Hauptaufgabe, Funktionen für Vektorarithmetik und 2D-Geometrie zu schreiben, die mit der Fixpunktarithmetik der HaDes XP funktionieren. Letzteres stellte sich dabei als das Hauptproblem heraus, denn die 16.16 Fixpunktzahlen haben bekanntlich nur einen Wertebereich von etwa -32000 bis +32000, was nicht einmal reicht, um die Länge eines Vektors von Bildschirmkoordinaten auf "normale Weise" zu berechnen. Dementsprechend ist auch die Funktion vlength_fp deutlich komplizierter als das übliche "sqrt(x*x + y*y)": 

// Given an FP vector v (may be as long as you wish)
// returns its FP length len.
function vlength_fp(ref Vector v) returns(len)
vars(t, u, shw)
{
// test if we have to shift
shw = 0;
t = v.x;
if(t < -100. || t > 100.) shw = 8;
u = v.y;
if(u < -100. || u > 100.) shw = 8;
t = t >> shw;
u = u >> shw;
len = t *: t +: u *: u;
len = sqrt(len);
len = len << shw;
}

Nachdem dann die Schnitttests für Strecken mit Geraden und Strecken mit Kreisen funktionierten, war die große Frage: wo kommen jetzt die Levels her? Im Prinzip handelt es sich bei einem Pong-Level um wenig mehr als eine Ansammlung von Polygonen, und so gab es erst mal ein Perlskript, das eine textuelle Beschreibung in das Binärformat konvertiert, das Pong erwartet. So eine Levelbeschreibung sieht z.B. wie folgt aus: 

# Pong Level

# Globals testen ###
LevelStyle Arkanoid # nur so zum Witz
NumPlayers 2
Name Test-Level
Start <300, 190>
# States & Polys ###
Colour red
Hits 0
Points 10
Repeat 2 <100,0>
Polygon <50,0> <100,80> <150,0> Color green # Jetzt auch für Amerikaner!
Hits 10
Points 233
Repeat 0
Polygon <300,300> <400,300> <400,200> <300,200>
Colour blue
Hits 1
Points 1
Repeat 0
Polygon <150,150> <170,200> <150,250> <200,250> <190,200> <200,150>
Polygon <470, 270> <514, 373> <595, 367> <560, 199>

So eine textuelle Beschreibung strapazierte dann aber die Vorstellungskraft des Entwicklers (oder das HaDesProgramm PongLevelView) doch gar zu sehr, also musste etwas besseres her. Das ist eine grafische Benutzeroberfläche, mit der die Level-Skripte interaktiv bearbeitet werden können. Sie ist in Perl/Tk programmiert, und beim Erstellen merkte ich (Florian) mal wieder: Perl ist im Prinzip komfortabel und schreibt sich flott, aber im Detail steckt der Teufel... ausserdem fehlt mir einfach ein vernünftiger Debugger dafür. Wie auch immer, der Editor funktioniert und ist ausreichend bequem: 

Screenshot des Pong Leveleditors

Tja, und jetzt fehlt nicht mehr der Editor, sondern nur noch die Ideen für mehr Levels... :-)

 
rrobek.de Hauptseite
 
Valid HTML 4.01!