Alles, was hier folgt, bezieht sich auf Assembler, im Prinzip kann man das aber auch direkt auf andere Sprachen (BASIC) übertragen.
Vorüberlegungen:
Wenn man ein Spiel programmiert, dann muss man sich recht bald Gedanken machen in welchem Grafikmodus dieses Spiel sich bewegen soll. Hier muss man einen guten Kompromiss in Auflösung, Farbmenge, Speicherplatzbedarf und Geschwindigkeit finden. Oft wird man zum ANTIC Mode 4 greifen, da man hier 4 verschiedene Farben mit einer guten Auflösung und einem moderatem Speicherplatzbedarf hat. ANTIC 4 ist Charaktergrafik mit einer Auflösung von 40x24 Zeichen. Jedes Zeichen hat eine Breite von 8x8 Bits, wobei man hier beachten muss, daß wegen der Farben der Charakter man nur eine Breite von 4 Bits auflösen kann. Im Endeffekt kann ich aber nur 40x24 Charakter auf den Bildschirm bringen, was einen Speicherbedarf von 960 Bytes benötigt (in ANTIC 4).
Die Player/Missile-Grafik funktioniert ganz anders. Letztlich hat man hier eine schöne feine Bewegungsauflösung von 256x256 wobei aber horizontal nur der Bereich 48-208 sichtbar ist und vertikal 32-224.
Schießt man nun einen Missile z.B. von einem Raumschiff ab, dann hat man ja zunächst die horizontale Position des Missiles, trifft das Missile auf einen Charakter, dann kommt es zu einer entsprechenden Änderung des Kollisionsregisters dieses Missiles, was man direkt abfragen kann. Kommt es zu einer Kollision, dann springe ich in eine entsprechende Subroutine, wo alles weitere verarbeitet wird... so weit, so gut.
Nun gehen aber die Probleme erst los, denn wenn man das Missile etwas schneller haben möchte, dann wird man 2-3 vertikale Steps nach unten machen und muss ganz genau beachten, was man denn trifft. Man wird also nur einen "in etwa" genauen Wert für die vertikale Ebene bekommen und muss diesen Wert korrigieren, wenn man das getroffene Element z.B. explodieren lassen will. Das Gleiche gilt für die horizontale Position, denn das Missile hat ja eine viel feinere Auflösung, als das Charakterelement. Auch diese Position muss korrigiert werden. Ganz schwierig wird es, wenn man die Element (ich nenne sie Items) aus mehreren Charaktern aufbaut und die Items auch noch verschieden hoch sind und verschieden geformt sind. Meine Items sind z.B. aus 12 bzw. 6 Charaktern aufgebaut. Auf den Bildschirm geprintet werden diese Items meanderförmig von links oben nach rechts unten. Auch die Explosion wird so animiert geprintet, da ich hier die gleiche Printroutine nehme.
Hier 3 Items, alle verschieden aufgebaut:
Meine Korrekturroutine muss also zwingend sicher bei Kollision den linken oberen Startpunkt des Items finden, der kann dann im Item liegen, oder aber auch völlig in der Luft sein. Und hier wird es schwierig...
Aber der Reihe nach!
Zuerst muss man also den Wert des Missiles in den Charakterwert umrechnen:
Vertikale Umrechnung: Y-Wert (-32):8 - z.B. unterste Charakterlinie ist bei ANTIC 4 bei 24. Unterster PM-Bereich liegt ja bei 224. 224-32= 192 -> 192:8=24
Horizontale Umrechnung: X-Wert (-48):4 - z.B. rechte Seite des Bildschirmes bei ANTIC 4 ist bei 40. Weitester rechter Wert des PM-Bereiches ist ja 208. 208-48=160 -> 160:4=40
Folgende Assemblerroutine ist also notwendig:
Code: Alles auswählen
lda yschuss1 ;in ANTIC 4 -32 (sichtbarer Bereich ab 32 und /8
sec
sbc #32
lsr
lsr
lsr
sta yschuss1
tax ;y-Position in das x-Register schreiben
lda xschuss1 ;x-Position -48 (sichtbarer Bereich)und /4
sec
sbc #48
lsr
lsr
tay ;x-Position in das y-Register schreiben
Die jeweiligen umgerechneten Werte schreibe ich in das y- und x-Register zur Weiterverarbeitung.
Praktischerweise geht der horizontale Wert (ich nenne ihn mathematisch ja x-Wert) ins y-Register und der vertikale Wert geht ins x-Register. Das muss man wegen der indirekt indizierten Adressierung so machen!
Dann hole ich meine Bildschirmstartadresse (steht bei var1/var1+1) und speichere die in meine "Arbeitsadresse" var2:
Jetzt noch die fast richtige Höhe einstellen:
Code: Alles auswählen
clc
@ lda var2 ;jetzt die y-Position auf die richtige Höhe stellen
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
dex
bpl @- ;die y-Position steht in x - Addition von x Zeilen
und schon hat man in etwa die Position, wo man das Item getroffen hat.
Danach kommt die eigentliche Korrektur und Anpassung, bis man die genaue Startadresse hat, wo die animierte Explosion beginnt......
Die Logik dazu folgt im nächsten Post!