Explosion im Scroller...
Moderator: Rockford
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Explosion im Scroller...
Guten Morgen in die Runde!
Man hat den Eindruck, daß es hier zunehmend ruhig im Forum wird... daher mal eine Frage in die Runde bezüglich eines Problemes, was ich schon bei Battle of Eris hatte:
Bei einem Scroller (Shooter) im z.B. Antic 4 Modus habe ich Aliens über Charakter dargestellt. Ich nehme z.B. Zeichen Nr. 7 und ändere es entsprechend - vielleicht wird es noch animiert.
Nun wird dieses Alien abgeschossen und explodiert. Während der Explosionsphasen bewegt sich der Scroller weiter, die Explosion geht entsprechend der Gesamtbewegung mit, die einzelnen Explosionsphasen werden entsprechend eingeschrieben und am Ende ist an der Stelle ein Loch / Blank.
Das Problem ist nun folgendes:
Ich kann die Explosionsphasen nicht in den Charakter Nr.7 einspeichern, da sich ja dann alle 7 er zugleich ändern würden.
Ich muss also an die Stelle des getroffenen Nr. 7 einen anderen Charakter an die gleiche Stelle einspeichern - z.B. Nr 1 - dieses Charakter hat die animierte Explosion. Wenn ich nun aber Carakter 1 so baue, daß es ständig eine Explosionsanimation durchläuft, dann hört die Explosion ja an dieser Stelle nie auf - im besten Fall scrollt es einfach aus dem sichtbaren Bildschirm raus (übrigens sieht man dieses Problem identisch bei Caverns of Mars 1 - später hat der Programmierer das Problem dann gelöst).
Ich müsste also relativ aufwendig mir alle Positionen der getroffenen Aliens merken und nach der fertig abgelaufenen Explosion an diese Stelle ein Blank reinprinten.
Noch aufwendiger wird es dann, wenn das Alien (wie in den meisten Fällen) aus mehreren Charaktern zusammengesetzt ist, dann muss man genau bestimmen, wo getroffen worden ist und die ganze Explosionsanimation dann an der richtigen Position starten.
Über dieses Problem habe ich bei BoE wochenlang gegrübelt und es dann aufwendig so gelöst, daß das gesamte Scrolling während der Explosionsphase - also in der Explosionsroutine einfach von dort mitläuft (aufgerufen wird).
Aber das muss doch irgendwie einfacher gehen.... hat da irgendjemand Erfahrung oder eine erleuchtende Idee???
Liebe Grüße
Peter
Man hat den Eindruck, daß es hier zunehmend ruhig im Forum wird... daher mal eine Frage in die Runde bezüglich eines Problemes, was ich schon bei Battle of Eris hatte:
Bei einem Scroller (Shooter) im z.B. Antic 4 Modus habe ich Aliens über Charakter dargestellt. Ich nehme z.B. Zeichen Nr. 7 und ändere es entsprechend - vielleicht wird es noch animiert.
Nun wird dieses Alien abgeschossen und explodiert. Während der Explosionsphasen bewegt sich der Scroller weiter, die Explosion geht entsprechend der Gesamtbewegung mit, die einzelnen Explosionsphasen werden entsprechend eingeschrieben und am Ende ist an der Stelle ein Loch / Blank.
Das Problem ist nun folgendes:
Ich kann die Explosionsphasen nicht in den Charakter Nr.7 einspeichern, da sich ja dann alle 7 er zugleich ändern würden.
Ich muss also an die Stelle des getroffenen Nr. 7 einen anderen Charakter an die gleiche Stelle einspeichern - z.B. Nr 1 - dieses Charakter hat die animierte Explosion. Wenn ich nun aber Carakter 1 so baue, daß es ständig eine Explosionsanimation durchläuft, dann hört die Explosion ja an dieser Stelle nie auf - im besten Fall scrollt es einfach aus dem sichtbaren Bildschirm raus (übrigens sieht man dieses Problem identisch bei Caverns of Mars 1 - später hat der Programmierer das Problem dann gelöst).
Ich müsste also relativ aufwendig mir alle Positionen der getroffenen Aliens merken und nach der fertig abgelaufenen Explosion an diese Stelle ein Blank reinprinten.
Noch aufwendiger wird es dann, wenn das Alien (wie in den meisten Fällen) aus mehreren Charaktern zusammengesetzt ist, dann muss man genau bestimmen, wo getroffen worden ist und die ganze Explosionsanimation dann an der richtigen Position starten.
Über dieses Problem habe ich bei BoE wochenlang gegrübelt und es dann aufwendig so gelöst, daß das gesamte Scrolling während der Explosionsphase - also in der Explosionsroutine einfach von dort mitläuft (aufgerufen wird).
Aber das muss doch irgendwie einfacher gehen.... hat da irgendjemand Erfahrung oder eine erleuchtende Idee???
Liebe Grüße
Peter
- pps
- Beiträge: 566
- Registriert: 18.06.2021 23:05
- Has thanked: 122 times
- Been thanked: 225 times
- Kontaktdaten:
Re: Explosion im Scroller...
Also so von der Idee her...
Nimm ein anderes Zeichen für diesen getroffenen Alien. Sobald dieses Zeichen zu sehen ist, startet eine Routine damit in dieses die Explosions Animation einzuschreiben. Sagen wir mal, das sind 7 Durchgänge. Dann wird also 7 mal animiert, bis es durch ist. Dann wird dieses Zeichen zum Loch und somit nicht weiter animiert.
Nimm ein anderes Zeichen für diesen getroffenen Alien. Sobald dieses Zeichen zu sehen ist, startet eine Routine damit in dieses die Explosions Animation einzuschreiben. Sagen wir mal, das sind 7 Durchgänge. Dann wird also 7 mal animiert, bis es durch ist. Dann wird dieses Zeichen zum Loch und somit nicht weiter animiert.
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Explosion im Scroller...
... ja ... dann brauche ich die Position des getroffenen Charakters - die ändert sich je nach scrolling - muss dann nach der Animation die "Null" in die Position nach Ablauf der Explosion einschreiben... schwieriger wird es, wenn 2/3/4 Explosionen zugleich in unterschiedlichen Explosionsphasen stattfinden...
- cas
- Beiträge: 843
- Registriert: 18.06.2021 21:01
- Wohnort: Solar System
- Has thanked: 189 times
- Been thanked: 389 times
- Kontaktdaten:
Re: Explosion im Scroller...
Bei mehreren Explosionen ein Array von 2/3/4 ... 10 Speicherstellen. Jede Speicherstelle = 1 ExplosionDr. Irata hat geschrieben: ↑27.11.2023 14:09... ja ... dann brauche ich die Position des getroffenen Charakters - die ändert sich je nach scrolling - muss dann nach der Animation die "Null" in die Position nach Ablauf der Explosion einschreiben... schwieriger wird es, wenn 2/3/4 Explosionen zugleich in unterschiedlichen Explosionsphasen stattfinden...
Zwei weitere Arrays gleicher Größe für X/Y Position.
Jede Speicherstelle speichert den Status der Explosion. 0 = Explosion zu Ende
Beim Start einer Explosion durch das Array gehen und den frühsten niedrigsten Eintrags-Wert finden (sollte "0" sein, kann aber auch höher sein, dann "verschwindet" die älteste Explosion ohne durch alle Phase gegangen zu sein). In diesen Offset den Anfangswert der Explosion eintragen (z.B. 7 bei sieben Explosions-Phasen).
Via Timer (z.B. VBI) durch das Array gehen -- Werte >0 um 1 vermindern, dann Zeichen an X/Y anpassen (gleiches Offset für Koordinaten)
- pps
- Beiträge: 566
- Registriert: 18.06.2021 23:05
- Has thanked: 122 times
- Been thanked: 225 times
- Kontaktdaten:
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Explosion im Scroller...
aber wenn du mit einem Zeichen mehrere gleiche Raumschiffe darstellst,würde die Explosion ja alle gleichen Raumschiffe betreffen
- pps
- Beiträge: 566
- Registriert: 18.06.2021 23:05
- Has thanked: 122 times
- Been thanked: 225 times
- Kontaktdaten:
Re: Explosion im Scroller...
Daher hatte ich ja geschrieben, dass die Explosion in einem anderen Zeichen sein soll. Das geht natürlich nur, wenn Du genügend Zeichen frei hast. Aber für ich sage mal 10 Raumschiffe, dann halt 10 Zeichen zusätzlich, damit sie alle unterschiedlich explodieren können.
- cas
- Beiträge: 843
- Registriert: 18.06.2021 21:01
- Wohnort: Solar System
- Has thanked: 189 times
- Been thanked: 389 times
- Kontaktdaten:
Re: Explosion im Scroller...
Ich glaube Ralf mein, man hat mehrere Zeichen für die Explosionen. Es wird dann jeweils der Zeichensatz für das entsprechende Zeichen im Speicher überschrieben (8 Byte), statt das Zeichen auf dem Bildschirm auszutauschen.
Geht beides, welches eleganter ist kommt auf die Spiel-Engine an. Wenn man über Tabellen X/Y schnell ermitteln kann, dann ist das Schreiben eines anderen Zeichens ggf. schneller als das Ändern des Zeichensatzes.
- DjayBee
- Beiträge: 680
- Registriert: 17.08.2021 04:02
- Has thanked: 418 times
- Been thanked: 200 times
- Kontaktdaten:
Re: Explosion im Scroller...
Unabhängig von dem, was die Kollegen schon geschrieben haben (und dem damit verbundenen anderen Ansatz, die Zeichen selbst zu verändern):
Wieso ändert sich da etwas?
Das Zeichen hat einen festen Platz im RAM. Nur die Position auf dem "Fernseher" ändert sich durch die Manipulation der Displaylist und des [H|V]SCROL Registers.
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Explosion im Scroller...
das stimmt... die Position ändert sich quasi nicht, aber ich muss sie dennoch zwischenspeichern, da am Ende der Explosion dort eine Null eingeschrieben werden muss... es sei denn jemand hat noch eine andere pfffige Idee...
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 115 times
- Been thanked: 85 times
- Kontaktdaten:
Re: Explosion im Scroller...
Opfere für Explosionen ruhig 32 Zeichen.
Wenn Du 2x2 große Blöcke an die entsprechende x,y Position schreibst.
Erst den 1. Block, dann den 2. Block, 3.,4.,5.,6.,7.,8. jeweils 3 Frames lang anzeigen, dann dauert die ganze Animation ca. 24 Frames das sieht dann entsprechend nett aus. Am Ende setzt Du einfach 4xNull und weg ist das explodierte Etwas.
Für die Gegner würde ich auch min. 32 Zeichen spendieren, so könntest Du locker schicke Rotationen mit unterbringen. Dann hast Du für den Rest/Hintergrund immer noch 63 weitere Zeichen. Was locker reichen sollte.
Das Setzen eines 2x2 Blocks sollte stark optimieren sein. Hier mal so eben als Idee runtergetippert.
Diese Routine braucht ca. 59 Zyklen um einen 2x2 Block in den Screen zu poken und 31 Bytes. Hast Du 16 verschiedene 2x2 Blöcke, bau Dir 16 dieser Routinen. Das mag ~500 Bytes kosten, aber Du könntest damit auch locker 100 Blöcke in 1/50s setzen.
Immer vorausgesetzt der Screen ist 256 Bytes breit. Also die nächste Zeile beginnt 256 Bytes weiter. Ist der Screen 512 Bytes breit, kostet einen 2x2 Block setzen 5 Zyklen mehr (inc muss 2x ausgeführt werden) Bei noch breiterem Screen ist addieren genau so teuer. Das wäre braucht aber mehr Bytes.
Bei einem Scroll-Screen mit Breite <256 Zeichen z.B. 240 Zeichen setzt man einfach das Y-Register hoch statt den Screen-Pointer zu manipulieren (dey und inc screen+1 könnte man sich dann sparen.) Dann ist das Setzen eines 2x2 Blockes noch flotter.
Ja man muss sich leider merken, wo die Explosion stattgefunden hat und in welcher Phase sich diese eine Explosion gerade befindet, aber Tabellen sind halt alles auf dem Atari.
BTW: Die Verwaltung der Tabellen&Berechnungen macht man in der Zeit, wo einem der Elektronenstrahl in die Quere kommen könnte.
Wenn Du jetzt auch noch den Hintergrund sichern willst, wird es nur etwas länger, hier mal nur für 1 Byte.
Den Rest überlasse ich mal Dir.
HTH
Wenn Du 2x2 große Blöcke an die entsprechende x,y Position schreibst.
Erst den 1. Block, dann den 2. Block, 3.,4.,5.,6.,7.,8. jeweils 3 Frames lang anzeigen, dann dauert die ganze Animation ca. 24 Frames das sieht dann entsprechend nett aus. Am Ende setzt Du einfach 4xNull und weg ist das explodierte Etwas.
Für die Gegner würde ich auch min. 32 Zeichen spendieren, so könntest Du locker schicke Rotationen mit unterbringen. Dann hast Du für den Rest/Hintergrund immer noch 63 weitere Zeichen. Was locker reichen sollte.
Das Setzen eines 2x2 Blocks sollte stark optimieren sein. Hier mal so eben als Idee runtergetippert.
Code: Alles auswählen
lda position_low,x
sta screen
lda position_high,x
sta screen+1 ; ~14 Zyklen um Position zu laden
[...]
ldy #0
lda #1 ; 1. Zeichen
sta (screen),y
iny ; Position anpassen
lda #2 ; 2. Zeichen
sta (screen),y
dey ; Position anpassen
inc screen+1 ; falls eine Zeile 256 Bytes lang ist
lda #3 ; 3. Zeichen
sta (screen),y
iny ; Position anpassen
lda #4 ; 4. Zeichen
sta (screen),y
[...]
Immer vorausgesetzt der Screen ist 256 Bytes breit. Also die nächste Zeile beginnt 256 Bytes weiter. Ist der Screen 512 Bytes breit, kostet einen 2x2 Block setzen 5 Zyklen mehr (inc muss 2x ausgeführt werden) Bei noch breiterem Screen ist addieren genau so teuer. Das wäre
Code: Alles auswählen
clc lda screen+1 adc #3 sta screen+1
Bei einem Scroll-Screen mit Breite <256 Zeichen z.B. 240 Zeichen setzt man einfach das Y-Register hoch statt den Screen-Pointer zu manipulieren (dey und inc screen+1 könnte man sich dann sparen.) Dann ist das Setzen eines 2x2 Blockes noch flotter.
Ja man muss sich leider merken, wo die Explosion stattgefunden hat und in welcher Phase sich diese eine Explosion gerade befindet, aber Tabellen sind halt alles auf dem Atari.
BTW: Die Verwaltung der Tabellen&Berechnungen macht man in der Zeit, wo einem der Elektronenstrahl in die Quere kommen könnte.
Wenn Du jetzt auch noch den Hintergrund sichern willst, wird es nur etwas länger, hier mal nur für 1 Byte.
Code: Alles auswählen
[...]
lda background_buffer_position,x
tax
ldy #0
lda (screen),y ; Background holen
sta background_buffer,x ; im Buffer ablegen
inx ; Zeiger von Background Buffer erhöhen
lda #1 ; 1. Zeichen
sta (screen),y ; in Screen poken
iny ; nächste Position anwählen
[...]
Den Rest überlasse ich mal Dir.
HTH
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast