Multiple Sprites mehrfarbig animiert darstellen

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Dr. Irata »

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

Benutzeravatar
Kveldulfur
Beiträge: 624
Registriert: 17.08.2021 02:32
Has thanked: 237 times
Been thanked: 163 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Kveldulfur »

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

Online
Erhard
Beiträge: 555
Registriert: 04.11.2021 15:52
Has thanked: 52 times
Been thanked: 111 times
Kontaktdaten:

Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Erhard »

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

Benutzeravatar
LarsImNetz
Beiträge: 152
Registriert: 24.08.2021 18:27
Has thanked: 109 times
Been thanked: 81 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von LarsImNetz »

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.

Bild
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
atari001.png (3.54 KiB) 853 mal betrachtet

Online
Erhard
Beiträge: 555
Registriert: 04.11.2021 15:52
Has thanked: 52 times
Been thanked: 111 times
Kontaktdaten:

Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Erhard »

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

Benutzeravatar
LarsImNetz
Beiträge: 152
Registriert: 24.08.2021 18:27
Has thanked: 109 times
Been thanked: 81 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von LarsImNetz »

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

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Dr. Irata »

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

Benutzeravatar
LarsImNetz
Beiträge: 152
Registriert: 24.08.2021 18:27
Has thanked: 109 times
Been thanked: 81 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von LarsImNetz »

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

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

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Dr. Irata »

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

Benutzeravatar
LarsImNetz
Beiträge: 152
Registriert: 24.08.2021 18:27
Has thanked: 109 times
Been thanked: 81 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von LarsImNetz »

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.

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Multiple Sprites mehrfarbig animiert darstellen

Beitrag von Dr. Irata »

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast