Seite 1 von 1

Eine Idee...

Verfasst: 02.04.2026 07:46
von Dr. Irata
... bräuchte ich für folgendes Problem:

Ich bewege mich in Antic 4 - also Charaktergrafik.
An einer bestimmten Position des Bildschirmes ist ein Zeichen gesetzt. An dieser Position soll jetzt durch z.B. eine Kollision mit einem Player eine Folge von anderen Charaktern gesetzt werden - die Folge ist immer gleich. Nach dem letzten Charakter geht dann ein Leerzeichen an diese Position.
Das soll jetzt aber nicht nur für einen Charakter an einer Stelle funktionieren, sondern für eine fast beliebige Anzahl von Charaktern und die "Folge" darf zwar gleich sein, muss aber unabhängig von den möglichen anderen Treffern laufen!

Klingt eigentlich ganz simpel...

Meine Idee war jetzt... ich höre erstmal, wie ihr das machen würdet... meine Idee ist gefühlt zu aufwendig...

Re: Eine Idee...

Verfasst: 02.04.2026 09:00
von DjayBee
Soll der Code auch verwalten, ob ein Character überhaupt auf dem Bildschirm vorhanden ist (unabhängig davon, ob gerade eine "Animation" läuft) und an welcher Position er sich befindet oder geht's dir nur um die Verwaltung von beliebig vielen Animationen?

Re: Eine Idee...

Verfasst: 02.04.2026 09:12
von Dr. Irata
tatsächlich soll der Code das verwalten...

Re: Eine Idee...

Verfasst: 02.04.2026 09:12
von Dr. Irata
wahrscheinlich reicht es, wenn er 10-20 Charakter dieser Art verwaltet...

Re: Eine Idee...

Verfasst: 02.04.2026 13:21
von Kveldulfur
Hallo!

Die Frage ist natürlich wie immer, wie du das Scrolling realisierst. Ist das Spielfeld komplett im RAM vorhanden oder wird es mehr oder weniger dynamisch erzeugt?

Bei [Schranken 3 + 4] habe ich meine geliebten Bomben (von Mr. Robot) eingebaut. Diese explodieren nach einiger Zeit, wenn man darüber gelaufen ist. Bei beiden Spielen ist das Spielfeld komplett im RAM enthalten, womit ich mir also nur merken muss, an welcher Speicherstelle welche aktivierte Bombe steht. Inaktive Bomben sind uninteressant. Wenn der Spieler über eine Bombe läuft, wird diese aktiviert und in eine Tabelle an einer freien Stelle geschrieben.

Dafür habe ich drei Tabellen mit maximal 50 Einträgen:

Tabelle 1: Der Status
0 = inaktiv bzw. frei
1 = Frame 1 + Soundeffekt starten
2 = Frame 2
3 = Frame 3
...
6 = Frame 6 = leeres Feld
7 = wait
8 = wait
9 = reset = Bombe darstellen und Status auf 0 setzen

Tabelle 2: Die Adresse
Hier wird die Adresse einer Bombe hinterlegt, die ich aktiviert habe (Word).

Tabelle 3: Die Zeit
Hier ist ein Zähler enthalten, der immer auf 0 herunterläuft und bei 0 erst das Ereignis (z. B. Framewechsel) auslöst.

Die Zeit nutze ich, weil meine Bomben respawnen. Außerdem kann man so die Animation verlangsamen usw.

50 Einträge bedeuten viel Aufwand. Da bei mir alles immer erst nach dem Bildaufbau ausgeführt wird, wird diese Schleife, in der ich den Status der Tabelle prüfe, alle 1/50 Sekunden ausgeführt. Und damit es nicht so viel Rechenzeit einnimmt, teile ich die Tabelle auf:

1/50 s → Position 0, 3, 6, 9, 12 ...
2/50 s → Position 1, 4, 7, 10, 13 ...
3/50 s → Position 2, 5, 8, 11, 14 ...
... und dann wieder von vorne

Das heißt, die Animation kann sich frühestens alle 3/50 s weiterdrehen. Wenn also eine Animation startet, läuft alles automatisch, bis sie wieder zurückgesetzt ist.

Wenn du das Spielfeld nicht komplett im RAM hast, sondern dynamisch aufbaust, müsste das Konzept dennoch funktionieren, da sich innerhalb des Bildes die Speicherstelle nicht verändert. Ich bin mir da gerade nicht ganz sicher, denke aber schon. Man müsste nur, sobald die Explosion aus dem Bild verschwindet, den Status zwangsweise auf 0 setzen, weil sonst die Explosion oben wieder erscheint ;)

Grüße
Janko

Re: Eine Idee...

Verfasst: 02.04.2026 14:57
von Dr. Irata
Tatsächlich wird der BS gescrollt mit DL-Manipulation. Das Bild liegt nicht im Speicher, sondern wird dynamisch aufgebaut...

Re: Eine Idee...

Verfasst: 02.04.2026 15:03
von Dr. Irata
... so etwas ähnliches hatte ich mir gestern schon überlegt, ein Handler, der das alles steuert. Mit einem Speicherbereich, wo die Positionen und der Status gespeichert ist. Mir war klar, daß es so gehen kann, es bedeutet aber leider auch einen großen Rechenaufwand... ich hatte hier auf eine elegante "einfache" Möglichkeit/Idee gehofft.
Janko - wir sprachen damals über dein Zeitproblem... jetzt verstehe ich das! Deine Routine hat da ne Menge zu tun ;-)

Leider kann man einem Charakter keinen echten Status mitgeben...

Re: Eine Idee...

Verfasst: 02.04.2026 18:00
von DjayBee
Hast du genug Zeichen im Zeichensatz verfügbar, dass du für jedes unterschiedliche Zeichen alle Bewegungsschritte speichern kannst?

Dann kannst du für jede Instanzierung auf dem Bildschirm ein Statusbyte in einer Tabelle nehmen.
0=ganz normal
1 bis n=Bewegungsschritt
-1 bzw. $ff=Leerzeichen bzw. derzeit nicht aktiv

Die Schritte zählst du dann im VBI rückwärts und wenn du bei 0 ankommst, setzt du es auf -1 und schreibst ein Leerzeichen auf den Schirm.
Das Byte ist dann auch der Zeiger in den Zeichensatz, relativ zum "Hauptzeichen".

Die Adresse des Zeichens würde ich auftrennen in zwei Tabellen. Dadurch kannst du alle Tabellen absolut,X oder absolut,Y adressieren. Das ist schneller als (indirekt),Y und du musst nicht jedes Mal den Pointer in der Zeropage setzen.

Das Schreiben des Zeichens selbst muss dann natürlich trotzdem indirekt erfolgen.