Eine Implementierung von SpaceWar! auf dem AVR. Gehackt an einem Wochenende bietet es einen Spaß für zwei Spieler.
Gameplay-Video: https://mq32.de/public/spacewavr-04.mp4
Um SpaceWavr zu benutzen, benötigt man ein Oszilloskop mit XY-Ableitung und optional einem Z-Eingang sowie zwei Spieler.
Beide Spieler steuern jeweils ihr Raumschiff. Spieler 1 steuert das linke Raumschiff, Spieler 2 das Rechte. Die Controller haben vier Tasten:
Die beiden Tasten auf dem Steuerkreuz sind für die Drehung des Raumschiffs zuständig, die runde Taste auf der rechten Seite beschleunigt das Raumschiff, der rechte Trigger feuert einen Schuss ab.
Die Spieler versuchen nun, sich gegenseitig abzuschießen und den Schüssen des Gegners auszuweichen. That's it!
Das Projekt ist mit einem ATmega32 implementiert und benutzt zwei R2R-Netzwerke als Digital-Analog-Wandler mit jeweils 8 Bit Auflösung.
Die Ausgänge dieser DACs dienen als X- bzw. als Y-Ableitung für den Oszilloskop-Strahl. Dieser wird dann im Programm direkt über die Ports B und D des Atmega32 angesteuert.
Intern rechnet das Programm alle Bildschirm-Koordinaten als vorzeichenbehafteter 16-Bit-Integer und schneidet die niederwertigen 8 Bit bei der Ausgabe ab:
void move_cursor(int16_t x, int16_t y) { PORTB = 128 + x / 256; PORTD = 128 + y / 256; }
Damit ist sowohl ausreichend Rechenpräzision garantiert als auch genug Geschwindigkeit, dass die Bewegung des Strahls schnell genug vonstatten geht.
Die Eingabe erfolgt direkt über den Port C und benutzt hier die internen PullUp-Widerstände. Dies vereinfacht die Schaltung, da keine externen Widerstände benötigt werden.
Den vollen Quellcode findet man auf GitHub:
https://github.com/MasterQ32/SpaceWavr
Schaltplan oder Platinenlayout müsste mal jemand machen hubel hubel.