Hallo Besucher, der Thread wurde 1,7k mal aufgerufen und enthält 12 Antworten

letzter Beitrag von Hucky am

Multiplexed Sprites

  • Tach !


    WIE funktioniert das ?


    Wie ist es Möglich z.B. 32 Bälle, oder so die sich z.B. im Kreis auf dem Bildschirm bewegen, darzustellen ?


    Funktioniert das nur mit gleichen Sprites ?


    Ist die Routine so aufgebaut, dass trotzdem immer nur 8 Sprites gleichzeitig nebeneinander sind und die Spritezeiger einfach nur wechseln, oder wie, oder was ?!


    mfG Hucky


    http://www.emuecke.de

  • Zitat

    Original von Hucky
    Wie ist es Möglich z.B. 32 Bälle, oder so die sich z.B. im Kreis auf dem Bildschirm bewegen, darzustellen ?


    Funktioniert das nur mit gleichen Sprites ?


    Ist die Routine so aufgebaut, dass trotzdem immer nur 8 Sprites gleichzeitig nebeneinander sind und die Spritezeiger einfach nur wechseln, oder wie, oder was ?!


    Deine Vermutung ist schon richtig. Man programmiert den Rasterzeileninterrupt, in deren Behandlungsroutine man immer wieder die Sprites umsetzt. Pro Bildschirmzeile können so nicht mehr als 8 Sprites auftauchen, aber in jeder Zeile kann das wieder gewechselt werden. Man kann auch die Sprites selber wechseln, d.h., sie können unterschiedlich aussehen.


    Gruß,
    - Spiro.

  • Tach !


    Hat jemand vielleict ne "einfache" Routine wo man was draus lernen kann :P


    Ne Kreisbewegung bekomm ich mit Sprites ja noch hin. Nur wie mach ich das genau mit dem "Umschalten" ? Ist wohl alles nen bischen komplexer.
    Ich könnte das nur über Tabellen lösen und jede Konstallation vorher eben in diese Tabellen eintragen.
    Es muss doch einfacher gehen ?!



    mfG Hucky


    http://www.emuecke.de

  • Du machst einfach einen Sortieralgorythmus. Dieser schluckt die meiste Rechenzeit, je nach anzahl der zu sortierenden Werte.


    Ein sehr gutes Tutorial findest du bei Cadaver in seinen Rants, sowie den passenden Source, der leicht zu modifizieren ist.


    Siehe hier:
    http://cadaver.homeftp.net/rants/sprite.htm


    hier das Demoprog (.zip):
    http://covertbitops.c64.org/rants/multi.zip

  • Hi ...


    Also mit dem multiplexen gibt es mehrere möglichkeiten(schlauer satz)


    Als erstes gibt es die möglichkeit ueber einen Sort algorithmus diese braucht aber extrem viel rasterzeit fuer das sortieren,plus das warten auf die irq zeile wo der sprite init erfolgt.
    Das gleiche aber effektiver geht so das du also einen permanent scan der Rasterline vornimmst dir hieraus ein feld in der breite eines sprites bastels und abcheckst ob eines deiner y register hierrein passt.


    Wenn ja setzt du dir nen merker auf 1 als zeichen das der sprite schon da war und deshalb nicht nochmal gecheckt werden braucht.


    Dann setzt du nur d000 + do10 und 07f8 evtl noch d027 und das wars.
    Dann erhoehst du einfach den aktuellen d000 und d001 wert.
    wenn du willst schick mir mal deine email addy und ich schick dir dann ein demo wo so ein plexer drinne ist(von mir) meine ist: honesty_afl@yahoo.de


    Der nachteil der routine ist das die y koordinaten nicht so dicht liegen koennen da sonst der permanent scan zu ungenau wird und evtl manche sprites skipt.
    reichte glaube ich fuer knapp 40 sprites mit uterem boarder.


    Der naechste trick und eigentlich der womit man die riesen plexer ala crest macht ist folgender:


    Du hast eigentlich nur einen stehenden raster wo also immer die sprites an der gleichen stelle stehen.
    sagen wir zwei pro y reihe, die naechsten 2 kommen dann in y+6 die naechsten dann wieder in y+12 die naechsten dann y+18 damit hast du also 8 sprites weg.
    die naechsten sprites sind ja dann y+24 da ein sprite also nur 21 y lines hat nimmst du also wieder die ersten.
    Damit das aber aussieht also ob sich das bewegt legst du vorher im speicher ne tabelle von 0 bis 254 step 2 ab(das sind deine y koords)
    und eine von 1 bis 255 step2
    und dann machsteso (ungefaehr) ;)


    ldy hlp
    lda ytab1,y
    sta$d001
    lda ytab2,y
    sta$d003
    lda hlp
    eor#03
    sta hlp


    diese eor funktion emuliert die bewegung da ja die sprites nun bei jedem durchlauf hoch und runterhopsen.


    Dann musste dir nurnoch ne routine schreiben die deine spritepointer richtig rumkopiert und was du sonst noch so brauchst und das wars dann.


    puh ok


    honesty

  • hucky@emuecke.de


    :P


    Danke !!!


    Ähhh.... Hast Du auch was parat um Sprites auf Rasterzeilen zu klatschen, ohne dass das Timing abtickt ?


    Das geht doch irgendwie über die Timer im CIA. Richtig ? Zusätzlich irgendwie über NMI ?


    Ich habs vor Jahren mal erfolglos probiert :(


    Nur so interessenhalber... :P


    DANKE SEHR....


    mfG Hucky


    http://www.emuecke.de

  • Zitat

    Original von HuckyÄhhh.... Hast Du auch was parat um Sprites auf Rasterzeilen zu klatschen, ohne dass das Timing abtickt ?


    Das geht doch irgendwie über die Timer im CIA. Richtig ? Zusätzlich irgendwie über NMI ?


    Was meinst Du denn damit??

  • Wenn ich das richtig verstanden habe.... ungefaehr so:


    LDA Rasterzeile
    * CMP$D012
    bcc *
    lda ypos
    sta$d001
    usw fuer alle 8 sprites
    dann machste


    lda $d001
    clc
    adc#$15
    * cmp$d012
    bcc *


    damit muesste das problem gesolved sein


    oder meinst du nen sprite in nen raster zu moven und das ugging zu verhindern?
    Hm das ist ne interessante frage
    Vielleicht mit flexiblen timing tabellen


    ala y position des sprites ermitteln und vergleih ob in y im raster liegt.
    Wenn ja dann den timing tabel aendern(also weniger zyklen da ja fuer en sprite display mehr gebraucht werden)


    Wobei die sprites verschieden viele zyklen verbrauche.Gemacht habe ich sowas auch noch nicht um ehrlich zu sein ;)


    Aber so muesste das ungefaehr gehen



    FRed

  • der trick um sprites über raster (ich gehe mal aus ihr meint farbbalken und sowas) zu bewegen ist der sie garnicht zu bewegen, zumindest nicht in Y richtung (in x richtung ändert sich das timing ja nicht). anstadt die sprites zu bewegen schaltest du jede zeile die spritepointer um, evtl kombiniert mit über d017 runtergestrechten sprites oder gleich spritecrunching.


    @honesty: was du da vorschlägst wird kaum funktionieren, stell dir mal paar sprites die sich wild in nem sinus oder so bewegen vor....da ist essig mit dem ausprobieren aller möglichen kombinationen :)

  • Ach so wars gemeint. Was auch noch gehen würde:
    -Sprites, die zwischen den beiden Nachbarn "eingeklemmt" sind, kann man ohne Timingänderung wegnehmen/verschieben. Liegen z.B. in einer Rasterzeile die Sprites 0,1 und 2, dann kannst Du Sprite 1 auch wegnehmen, ohne daß sich das Timing ändert.
    -Du multiplext ein Sprite grundsätzlich alle 21 Zeilen und betrachtest diesen Balken als 1 Sprite, dessen Y-Pos nur zwischen 0 und 20 liegt. Egal, wie Du diese Balken nach oben und unten verschiebst, ab Zeile 21 hast Du dann immer alle Sprites in einer Zeile und somit immer das gleiche Timing.

  • Häää ?!


    Spritecrunching ?


    Schade, habe im Moment keine Zeit ere Tips mal auszuprobieren, trotzdem ertsmal danke für die Antworten.


    Es muss auch irgendwie einfacher gehen.
    Ich habe eine Demo von Upfront, die "Toaster" heisst, die ist schon relativ alt, muss so um 89, oder 90 sein, da war man mit "komplizierteren Sachen" noch nicht so weit....


    mfG Hucky


    http://www.emuecke.de