Explosion im Scroller...

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Explosion im Scroller...

Beitrag von Dr. Irata »

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

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von pps »

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.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von Dr. Irata »

... 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...

Benutzeravatar
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...

Beitrag von cas »

Dr. 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...
Bei mehreren Explosionen ein Array von 2/3/4 ... 10 Speicherstellen. Jede Speicherstelle = 1 Explosion

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)

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von pps »

Die Position ist unnötig. Einfach direkt in den Zeichensatz schreiben.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von Dr. Irata »

aber wenn du mit einem Zeichen mehrere gleiche Raumschiffe darstellst,würde die Explosion ja alle gleichen Raumschiffe betreffen

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von pps »

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.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
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...

Beitrag von cas »

Dr. Irata hat geschrieben:
27.11.2023 15:22
aber wenn du mit einem Zeichen mehrere gleiche Raumschiffe darstellst,würde die Explosion ja alle gleichen Raumschiffe betreffen
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.

Benutzeravatar
DjayBee
Beiträge: 680
Registriert: 17.08.2021 04:02
Has thanked: 418 times
Been thanked: 200 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von DjayBee »

Dr. Irata hat geschrieben:
27.11.2023 14:09
... ja ... dann brauche ich die Position des getroffenen Charakters - die ändert sich je nach scrolling
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.

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von Dr. Irata »

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...

Benutzeravatar
LarsImNetz
Beiträge: 156
Registriert: 24.08.2021 18:27
Has thanked: 115 times
Been thanked: 85 times
Kontaktdaten:

Re: Explosion im Scroller...

Beitrag von LarsImNetz »

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.

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
  [...]
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

Code: Alles auswählen

clc  lda screen+1  adc #3  sta screen+1
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.

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast