Multiple Sprites mehrfarbig animiert darstellen
Moderator: Rockford
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Multiple Sprites mehrfarbig animiert darstellen
Hallo in die Runde!
Player/Missile sind ja ein tolle Erfindung, leider aber beim A8 sehr eingeschränkt, da man einfarbig nur maximal 4+1 Sprite darstellen kann. Nun gibt es findige Programmierer, die sich Alternativen ausgedacht haben. Das Thema Softwaresprites hatten wir ja schon - eine tolle Methode quasi unendlich viele mehrfarbige Sprites darzustellen. Diese Methode ist aber relativ rechenaufwendig und hat Probleme bei der Kollisionserkennung (Thema Hitboxen) und schwierig wird es auch, wenn mehrere Softwaresprites übereinander sich bewegen...
Daher komme ich wieder auf die Player/Missile zurück und hier auf das Multiplexing. Es gibt ein paar interessante Demos im Netz, wo ein Multiplexing dargestellt wird, das neue Programm von Lars beruht wohl auch auf einer umgeschriebenen eigenen Multiplexing Engine. Diese Technik möchte ich gerne für Assembler (MADS) erlernen und am liebsten hier im Forum Schritt für Schritt herleiten. Dazu brauche ich aber Hilfe und hoffe auf tatkräftige Unterstützung hier im Forum - am Ende wäre es toll, wenn eine Anleitung oder Engine für multiple animierte mehrfarbige Player/Missile Grafik hier rauskäme!
Liebe Grüße
Peter
Player/Missile sind ja ein tolle Erfindung, leider aber beim A8 sehr eingeschränkt, da man einfarbig nur maximal 4+1 Sprite darstellen kann. Nun gibt es findige Programmierer, die sich Alternativen ausgedacht haben. Das Thema Softwaresprites hatten wir ja schon - eine tolle Methode quasi unendlich viele mehrfarbige Sprites darzustellen. Diese Methode ist aber relativ rechenaufwendig und hat Probleme bei der Kollisionserkennung (Thema Hitboxen) und schwierig wird es auch, wenn mehrere Softwaresprites übereinander sich bewegen...
Daher komme ich wieder auf die Player/Missile zurück und hier auf das Multiplexing. Es gibt ein paar interessante Demos im Netz, wo ein Multiplexing dargestellt wird, das neue Programm von Lars beruht wohl auch auf einer umgeschriebenen eigenen Multiplexing Engine. Diese Technik möchte ich gerne für Assembler (MADS) erlernen und am liebsten hier im Forum Schritt für Schritt herleiten. Dazu brauche ich aber Hilfe und hoffe auf tatkräftige Unterstützung hier im Forum - am Ende wäre es toll, wenn eine Anleitung oder Engine für multiple animierte mehrfarbige Player/Missile Grafik hier rauskäme!
Liebe Grüße
Peter
Online
- Kveldulfur
- Beiträge: 648
- Registriert: 17.08.2021 02:32
- Has thanked: 249 times
- Been thanked: 176 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Hallo!
Ich hebe da Mal meine Hand und bekunde auch interesse an dem Thema. Mehrfarbige Sprites frei zu bewegen interessiert mich sehr. Wie ich untereinander mehrere Sprites positionieren kann, dank DLI, ist klar. Aber diese auch vertikal bewegen zu können, wäre interessant.
Grüße
Janko
Ich hebe da Mal meine Hand und bekunde auch interesse an dem Thema. Mehrfarbige Sprites frei zu bewegen interessiert mich sehr. Wie ich untereinander mehrere Sprites positionieren kann, dank DLI, ist klar. Aber diese auch vertikal bewegen zu können, wäre interessant.
Grüße
Janko
-
- Beiträge: 600
- Registriert: 04.11.2021 15:52
- Has thanked: 53 times
- Been thanked: 122 times
- Kontaktdaten:
Multiple Sprites mehrfarbig animiert darstellen
Hi,
ich werde da auch interessiert mitlesen aber Zeit für Tests o.ä. hab ich leider nicht.
Außerdem hab ich von Spieleprogrammierung keine Ahnung und werde demzufolge staunen aber nicht helfen können.
Mfg, Erhard
ich werde da auch interessiert mitlesen aber Zeit für Tests o.ä. hab ich leider nicht.
Außerdem hab ich von Spieleprogrammierung keine Ahnung und werde demzufolge staunen aber nicht helfen können.
Mfg, Erhard
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 114 times
- Been thanked: 84 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Moin,
eigentlich wollte ich mit der Veröffentlichung noch warten, aber jetzt habe ich es doch getan.
16 Single-Color Sprites die nur dann flackern, wenn mehr als 4 davon nebeneinander dargestellt werden sollen.
https://github.com/the-atari-team/tat.multi-sprites
Ich hoffe die Readme ist verständlich geschrieben in meinem angebrochenen Englisch.
Und sorry, das es meine Algol/Action! ähnliche Sprache ist, zumindest das drum herum, der wichtige Code ist natürlich in bestem 6502 Assembler allerdings nur atasm/Mac65 kompatibel.
BTW: Ich beschreibe in der Readme nur, wie man es bei sich einrichtet und was es zu beachten gibt. Wie das genau funktioniert, da bin ich auch noch nicht genauer hinter gestiegen, da ist für Peter also noch Luft.
LG
Lars
eigentlich wollte ich mit der Veröffentlichung noch warten, aber jetzt habe ich es doch getan.
16 Single-Color Sprites die nur dann flackern, wenn mehr als 4 davon nebeneinander dargestellt werden sollen.
https://github.com/the-atari-team/tat.multi-sprites
Ich hoffe die Readme ist verständlich geschrieben in meinem angebrochenen Englisch.
Und sorry, das es meine Algol/Action! ähnliche Sprache ist, zumindest das drum herum, der wichtige Code ist natürlich in bestem 6502 Assembler allerdings nur atasm/Mac65 kompatibel.
BTW: Ich beschreibe in der Readme nur, wie man es bei sich einrichtet und was es zu beachten gibt. Wie das genau funktioniert, da bin ich auch noch nicht genauer hinter gestiegen, da ist für Peter also noch Luft.
LG
Lars
- Dateianhänge
-
- atari001.png (3.54 KiB) 907 mal betrachtet
-
- Beiträge: 600
- Registriert: 04.11.2021 15:52
- Has thanked: 53 times
- Been thanked: 122 times
- Kontaktdaten:
Multiple Sprites mehrfarbig animiert darstellen
Hi,
is this
.byte DL_GR0|DL_DLI
a binary OR?
Actually it cannot be an OR because that would not make sense here:
.byte DL_ADDRES|DL_GR0|DL_DLI
edit: ok, DL-ADDRESS is not an address but the load DL address command, so it could make sense.
Best, Erhard
is this
.byte DL_GR0|DL_DLI
a binary OR?
Actually it cannot be an OR because that would not make sense here:
.byte DL_ADDRES|DL_GR0|DL_DLI
edit: ok, DL-ADDRESS is not an address but the load DL address command, so it could make sense.
Best, Erhard
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 114 times
- Been thanked: 84 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Hi Erhard,
.byte DL_GR0|DL_DLI ist ein OR
und .byte DL_ADDRES|DL_GR0|DL_DLI macht Sinn.
Bit DL_ADDRES ist $40 Bildschirm laden
Bit DL_GR0 ist $02 Graphics 0 (2)
Bit DL_DLI ist $80 für DLI ausführen
Zusammen $C2 alles per OR
LG
Lars
.byte DL_GR0|DL_DLI ist ein OR
und .byte DL_ADDRES|DL_GR0|DL_DLI macht Sinn.
Bit DL_ADDRES ist $40 Bildschirm laden
Bit DL_GR0 ist $02 Graphics 0 (2)
Bit DL_DLI ist $80 für DLI ausführen
Zusammen $C2 alles per OR
LG
Lars
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Vielen Dank erstmal.... ich habe mir die Readme durchgelesen und habe auch den Code von Shanti in MADS .... ich denke wir können das hier im Forum von Grund auf herleiten. Noch verstehe ich allerdings nicht genau, was da gemacht wird - habe da nur so eine Ahnung!
Ich denke man unterteilt die Displaylist und hat viele Interrupts. Das Timing muss hier genau stimmen, sonst gibt es Spritefehler oder das System stürzt ab.
Ein Sprite ist ja im Grunde 8 Bit breit (einfarbig) und geht komplett von Zeile 1 bis zur letzten Zeile runter. Man müsste also entsprechend mit jedem DLI das Sprite in einer Zeile mit einer neuen Farbe, Position und Texture erstellen können. Der DLI ist zeitlich begrenzt, daher wird die gesamte Berechnung im VBI durchgeführt und von den entsprechenden DLI´s einfach nur Zeile für Zeile gezeichnet. Stellt man mehr als 4 Sprites in einer Zeile dar, dann kommt es zum flackern, da es hier zu "Löschungen" kommt... wie man jetzt einen guten Scrollübergang von einer in die andere Zeile hinbekommt ist rechnerisch möglich, scheint aber recht aufwendig... so meine Vorstellung der Theorie.
Thema Kollisionserkennung: Keine Ahnung! Hier würde ich wohl den Mainplayer ganz normal darstellen (flackert dann auch nicht) und die Kollision ist dann mit diesem Player und dem Playground oder einem anderen Player - wobei man entweder gar nicht genau wissen muss, mit welchem des Multiplexplayer man kollidiert ist, oder man fragt die Positionen ab (das mache ich ja auch gerade und ist recht aufwendig).
Habe ich das Grundprinzip so richtig verstanden???
Ich denke man unterteilt die Displaylist und hat viele Interrupts. Das Timing muss hier genau stimmen, sonst gibt es Spritefehler oder das System stürzt ab.
Ein Sprite ist ja im Grunde 8 Bit breit (einfarbig) und geht komplett von Zeile 1 bis zur letzten Zeile runter. Man müsste also entsprechend mit jedem DLI das Sprite in einer Zeile mit einer neuen Farbe, Position und Texture erstellen können. Der DLI ist zeitlich begrenzt, daher wird die gesamte Berechnung im VBI durchgeführt und von den entsprechenden DLI´s einfach nur Zeile für Zeile gezeichnet. Stellt man mehr als 4 Sprites in einer Zeile dar, dann kommt es zum flackern, da es hier zu "Löschungen" kommt... wie man jetzt einen guten Scrollübergang von einer in die andere Zeile hinbekommt ist rechnerisch möglich, scheint aber recht aufwendig... so meine Vorstellung der Theorie.
Thema Kollisionserkennung: Keine Ahnung! Hier würde ich wohl den Mainplayer ganz normal darstellen (flackert dann auch nicht) und die Kollision ist dann mit diesem Player und dem Playground oder einem anderen Player - wobei man entweder gar nicht genau wissen muss, mit welchem des Multiplexplayer man kollidiert ist, oder man fragt die Positionen ab (das mache ich ja auch gerade und ist recht aufwendig).
Habe ich das Grundprinzip so richtig verstanden???
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 114 times
- Been thanked: 84 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Ich glaube der Code sagt, alle 8 Screen Zeilen ein DLI um die x-position der Sprites entsprechend sauber zu setzen und die Farbe.
Zum Zeichnen eines Sprites wird 8 Zeilen über ihm alles gelöscht, dann die 16 Bytes gemalt und unter ihm wieder 8 Zeilen gelöscht. Dann ist es egal in welchem Bereich von 32 Byte der 16 Zeilen hohe Sprite gemalt wird.
Zum Flackern, es werden pro 8 Zeilenblock immer nur 4 Player mit Daten gefüllt und sich gemerkt wer als nächstes dran ist. Beim nächsten Durchlauf wird also mit "nächster" weitergemacht.
Man sollte das Füllen der Sprites nicht im VBI machen, der kommt einfach zu spät. Sondern damit starten, nachdem der letzte DLI ausgeführt wurde, dann ist für das saubere Zeichnen mehr Zeit. Siehe mein Code, die blaue Linie, aktives warten auf VCOUNT==112 oder ähnlich.
Im VBI sollte die Musik gemacht werden, damit diese gleichmäßiger kommt.
Hier noch mein Kollisionscode. Sollte leicht verständlich sein. Der Compiler ist so schlau die 2er Komplement Divisionen durch entsprechend viele Shifts zu ersetzen. Das "break" verlässt die for-Schleife, wie in Java/C. Alle Variablen sind vom Type "byte".
Zum Zeichnen eines Sprites wird 8 Zeilen über ihm alles gelöscht, dann die 16 Bytes gemalt und unter ihm wieder 8 Zeilen gelöscht. Dann ist es egal in welchem Bereich von 32 Byte der 16 Zeilen hohe Sprite gemalt wird.
Zum Flackern, es werden pro 8 Zeilenblock immer nur 4 Player mit Daten gefüllt und sich gemerkt wer als nächstes dran ist. Beim nächsten Durchlauf wird also mit "nächster" weitergemacht.
Man sollte das Füllen der Sprites nicht im VBI machen, der kommt einfach zu spät. Sondern damit starten, nachdem der letzte DLI ausgeführt wurde, dann ist für das saubere Zeichnen mehr Zeit. Siehe mein Code, die blaue Linie, aktives warten auf VCOUNT==112 oder ähnlich.
Im VBI sollte die Musik gemacht werden, damit diese gleichmäßiger kommt.
Hier noch mein Kollisionscode. Sollte leicht verständlich sein. Der Compiler ist so schlau die 2er Komplement Divisionen durch entsprechend viele Shifts zu ersetzen. Das "break" verlässt die for-Schleife, wie in Java/C. Alle Variablen sind vom Type "byte".
Code: Alles auswählen
if countOfEnemies > 0 then
begin
collision_dude_ypos := sprite_y[0] / 8
for i:=1 to countOfEnemies+2 do
begin
if sprite_shape[i] >= 40 then // ab 40 beginnen die Enemies
begin
collision_sprite_ypos := sprite_y[i] / 8
if collision_dude_ypos == collision_sprite_ypos then
begin
// yposition von Sprite und Dude sind gleich
collision_dude_xpos := sprite_x[0] / 8
collision_sprite_xpos := sprite_x[i] / 8
if collision_dude_xpos == collision_sprite_xpos then
begin
// xposition von Sprite und Dude sind auch gleich
@dude_died()
break // weitere Suche nicht notwendig
end
end
end
end
end
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
... die Berechnung machst du also im Hauptprogramm und wartest einfach auf VBCount
Zu den Sprites: Dann muss der entsprechende DLI ja genau wissen, welchen Teil des Sprites er gerade zeichnen muss... z.B. 3 Zeilen, der nächste DLI zeichnet volle 8 und der dritte 5 Zeilen (plus die Zeilen drüber und drunter)..
Der Sprite ist ja gesplittet - was passiert, wenn der gesplittete Sprite in gleicher Höhe mit sich selbst ist???
Zu den Sprites: Dann muss der entsprechende DLI ja genau wissen, welchen Teil des Sprites er gerade zeichnen muss... z.B. 3 Zeilen, der nächste DLI zeichnet volle 8 und der dritte 5 Zeilen (plus die Zeilen drüber und drunter)..
Der Sprite ist ja gesplittet - was passiert, wenn der gesplittete Sprite in gleicher Höhe mit sich selbst ist???
- LarsImNetz
- Beiträge: 156
- Registriert: 24.08.2021 18:27
- Has thanked: 114 times
- Been thanked: 84 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
Die DLI Zeichnen nicht, sondern setzen nur die x-position, wenn sie eine setzen müssen. Deshalb muss der meter Value ja auch genau stimmen.
Ich weiß auch nicht, was passiert, wenn 2 Sprites direkt untereinander liegen. Vermutlich flackert es dann auch. Oder der Multiplexer nimmt einfach einen anderen Player.
Wie gesagt, soweit habe ich den Code auch noch nicht durchdrungen. Nur soweit, das ich es einfach nutzen kann.
Ich weiß auch nicht, was passiert, wenn 2 Sprites direkt untereinander liegen. Vermutlich flackert es dann auch. Oder der Multiplexer nimmt einfach einen anderen Player.
Wie gesagt, soweit habe ich den Code auch noch nicht durchdrungen. Nur soweit, das ich es einfach nutzen kann.
- Dr. Irata
- Beiträge: 946
- Registriert: 24.08.2021 14:40
- Has thanked: 113 times
- Been thanked: 275 times
- Kontaktdaten:
Re: Multiple Sprites mehrfarbig animiert darstellen
... das Thema finde ich sehr spannend, jetzt habe ich aber noch mit CoE zu tun, sobald das Programm fertig ist und in die Testphase geht, werde ich mich dann im Rahmen des neuen Projektes "Tempel of Eris" - das wird ein Jump´n Run Spiel - mit dem Thema Multiplexing beschäftigen.
Den Code bzw. das Prinzip möchte ich komplett verstehen. Zunächst möchte ich hier einen Code herleiten, wo 1 Sprite quasi gedoppelt wird. Daraus wird man alles ableiten können und dann komplexer machen...
Den Code bzw. das Prinzip möchte ich komplett verstehen. Zunächst möchte ich hier einen Code herleiten, wo 1 Sprite quasi gedoppelt wird. Daraus wird man alles ableiten können und dann komplexer machen...
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast