Hallo Besucher, der Thread wurde 7,2k mal aufgerufen und enthält 63 Antworten

letzter Beitrag von Endurion am

Vertikales Scrolling, Panel am unteren Rand, Abstand

  • Mahlzeit, ich wieder mit Scrolling.


    Ich habe vertikales Scrolling (ca. 22 Zeilen sichtbar). Darunter soll sich eine feststehende Score-Anzeige befinden. Zwischen den Sektionen wird in einem Raster-IRQ umgeschaltet.
    Jetzt habe ich aber das Problem, dass in manchen Frames die Anzeige-Daten eine Zeile weiter unten beginnt. Ich löse offenbar versehentlich VSP aus. Ich habe schon mit unterschiedlichen Positionen des Raster-IRQs für das untere Umschalten experimentiert, aber stabil ist es nie geworden.


    Welchen Abstand zwischen Scroll-Fläche und Anzeige ist denn empfehlenswert (soll eigentlich relativ gering sein)?

  • Das müsste mit einem FLD zu lösen sein, der zwischen 0 und 7 Zeilen enfügen, und das müsste am besten 8 Zeilen vor der unteren Anzeige passen, Der Spezialfall ist maximaler Y-Scroll. In dem Falle ist die angezielte Zeile eine Badline, aber in dem Fall muß die Routine auch nichts mache, der Anzeigebereich schliesst dann ohne Abstand an.

  • Oha, das klingt ja schon etwas fortgeschritten. Wird das so üblicherweise gemacht? Grade bei den älteren Spielen kann ich mir das kaum vorstellen. Oder hatten die alle mind. 1 Leerzeile Abstand?



    OT: Eigentlich müsste ich dich in jedem Spiel lobend erwähnen, hast mir schon viel geholfen!

  • Daran habe ich mich bei Catnipped schon versucht. Und es ist verflixt unangenehm, wenn da Sprites unten rausscrollen können und der Score-Anzeige in die Quere kommen :)
    Würde ich wenn's geht vermeiden wollen.


    Wegen VSP/FLD, ich glaube, ich habe eher einen FLD-Effekt. Sprich, wenn alles verrutscht ist, ist die unterste Scrollfeld-Zeile nochmal darunter in der Display-Anzeige zu sehen. Wenn ich richtig begreife (ich begreifstutze grade so schön), dann sollte ich mit dem FLD-Effekt die Anzeige komplett eine Zeile tiefer erzwingen?

  • Daran habe ich mich bei Catnipped schon versucht. Und es ist verflixt unangenehm, wenn da Sprites unten rausscrollen können und der Score-Anzeige in die Quere kommen :)


    Meine Lösung dazu:
    - Sprites nach y-Position sortieren. (falls du mehr als 8 Sprites verwendest, machst du das ja eh)
    - im Sprite-Status ausserhalb des Bildschirms nur maximal 6 Sprites verwenden
    - falls der Status oben sein soll, die X-Koordinate von Sprites 0 und 1 auf 0 setzen (und das msb) - damit werden die ordentlich abgeschnitten. Das geht, wenn im oberen Status nur Sprites 2-7 verwendet werden. (und die Sprites im Spielfeld sind ja sortiert, d.h. oben sind die Sprites 0 und 1)
    - falls der Status unten sein sollte, gehts fast genauso, allerdings statt Sprites 0 und 1 die Sprites 6 und 7 auf 0 setzen (da diese unten sind, aufgrund der Sortierung)


    war das nicht hier schon abschließend erklärt?


    Die Raid on Bungeling Bay-Methode funktioniert aber nur bei 1-zeiligen Status, oder? Man könnte evtl. aber je nach Y-Position den gesamten Status neu an der richtigen Stelle in den Bildschrimspeicher schreiben.

  • Also daß die Split-Sache im Scrolling-Workshop kann ich mich jetzt nicht erinnern, und ich finde da jetzt auch nix...


    Ach ja: Falls da noch Charset o.Ä. umgeschaltet werden soll, dann ist das doch eng mit der Badline. Außerdem hab ich ewig nichts mehr gemacht, das ist nur aus dem Kopf und Theorie!

  • Hier ist ein Codeschnipsel, den ich für Yucatan benutzt habe:


    irq1 muss eine Zeile vor dem score panel getriggert werden.

  • Wegen VSP/FLD, ich glaube, ich habe eher einen FLD-Effekt. Sprich, wenn alles verrutscht ist, ist die unterste Scrollfeld-Zeile nochmal darunter in der Display-Anzeige zu sehen. Wenn ich richtig begreife (ich begreifstutze grade so schön), dann sollte ich mit dem FLD-Effekt die Anzeige komplett eine Zeile tiefer erzwingen?

    Ziel sollte sein, die feststehende Score-Anzeige immer mit YSCROLL=7 darzustellen.
    Wenn der obere Scrollbereich mit YSCROLL=7 so weit wie möglich per Soft-Scrolling nach unten gescrollt ist, dann kann die feststehende Score-Anzeige direkt (ganz ohne Lücke) daran anschließend dargestellt werden.
    Wenn der obere Scrollbereich mit YSCROLL=N (wobei N<7) weniger weit per Soft-Scrolling nach unten gescrollt ist, dann muss Du dafür sorgen, dass genau N Pixelzeilen Abstand zwischen dem Scrollbereich und der feststehenden Score-Anzeige sind.
    Bei N zwischen 4 und 6 machst Du es so: 1-2 Rasterzeilen vor dem Ende des aktuell sichtbaren Scrollbereichs schreibst Du 7 nach YSCROLL.
    Bei N zwischen 0 und 3 machst Du es so: 1-2 Rasterzeilen vor dem Ende des aktuell sichtbaren Scrollbereichs schreibst Du zunächst den Wert (N+4) nach YSCROLL. Anschließend, so 2 Rasterzeilen nach dem Ende des aktuell sichtbaren Scrollbereichs, schreibst Du 7 nach YSCROLL.
    Ist das so verständlich?

  • Ich hab den Thread gefunden und er beschäftigt sich genau mit meinem Problem. Leider versteh ich aber die Antwort von ssdsanicht wirklich.


    Problem: Ich scrolle vertikal von oben nach unten auf Screen1 mit Charset1. Im unteren Bereich soll auf eine Statusanzeige umgeschaltet werden, welche auf Screen2 mit Charset2 dargestellt wird. Also muss ich Screen und Charset wechseln.
    Leider ist das Genze ein ziemliches Geflacker.


    Frage: Kann mir jemand eine Lösung vorschlagen bzw. ssdsa Vorschlag erläutern? Ich möchte das ganze ohne Statusanzeige via Sprite im Openborder realisieren.

  • Was ist denn das Problem beim Verständnis der Antwort von ssdsa?
    Könnte das gleiche jetzt nur nochmal in eigenen Worten umformulieren.
    Mit YSCROLL sind natürlich die unteren 3 Bits von $d011 gemeint. Das Timing des zurückschaltens dieser Bits auf den festen Wert 111 (=7) machst Du eben abhängig von den Werten beim Scroll-Bereich.

  • Sorry, ich versuch es mal besser zu formulieren.


    Wenn ich 1-2 Rasterzeilen vor Ende des aktuellen Scrollbereiche YScroll wieder auf 7 setze, dann hab ich doch eine totales hin und her Gezucke, nach meiner Meinung. Ich glaube, ich versteh das Ganze nicht, was da ab geht. Hört sich bisschen nach Vodoo an.

  • Wenn ich 1-2 Rasterzeilen vor Ende des aktuellen Scrollbereiche YScroll wieder auf 7 setze, dann hab ich doch eine totales hin und her Gezucke, nach meiner Meinung. Ich glaube, ich versteh das Ganze nicht, was da ab geht. Hört sich bisschen nach Vodoo an.


    Du vergisst vermutlich, dass eben genau diese Bits bei $d011 dafür verantwortlich sind, in welchen Rasterzeilen Badlines auftreten. Deswegen ja auch die Unterscheidung je nach $d011 im Scrollbereich in ssdsas Auflistung, damit die erste Badline der Statusanzeige immer auf der gleichen Rasterzeile landet. Das Geruckel hat man eben dann, wenn man es *nicht* anpasst.
    Zum besseren Verständnis einfach mal für Dich selbst genau aufschreiben welche Werte $d011 enthält und wo dann die Badlines sind etc...

  • Also wenn ich YScroll = 1, dann ist die 1. Badline bei 52 und nicht bei 51. usw. YScroll = 2 dann 1. Badline = 53, YScroll = 3 dann 1. Badline = 54 ?!


    Fast. YSCROLL ist defaultmäßig = 3, d.h. normalerweise ist die erste Badline bei $33 (51).
    Es ist einfacher in Hex, weil Du dann nur noch die Low-Nibble betrachten musst:
    YSCROLL Wert : Badline , Badline
    0 : $0 , $8
    1 : $1 , $9
    2 : $2 , $A
    3 : $3 , $B
    4 : $4 , $C
    5 : $5 , $D
    6 : $6 , $E
    7 : $7 , $F


    Also z.B. für YSCROLL = 5 sind Badlines: $35, $3D, $45, $4D, $55, $5D, $65, $6D ... uswusf ...

  • Bei YSCROLL = 0 ist eine Badline bei $30, $38, $40, $48 ..... $F0, $F8. Bei YSCROLL = 1 dann halt $31, $39 ..... $F9 usw. Bei Score-Anzeige unten macht man am besten einen kleinen FLD, der eine Lücke zwischen Playfield und Scoreleiste erzeugt. Das korrekte Abschneiden des Playfield ist dann noch ein weiteres Problem, was sich aber auch lösen lässt. Am einfachsten ist es, einfach 8 verschiedene IRQ-Routinen für den Bereich zu bauen, eine für jeden YSCROLL-Wert.

  • Ja, es klappt. Kein Flackern mehr. Super und vielen Dank! Ich hab jetzt für jede YScroll eine eigene IRQ-Routine gebaut. Jetzt mach ich morgen das Feintuning, da abundzu noch eine Zeile zuviel oder zuwenig ist.


    Was ich leider doof finde ist, dass ich es immer noch ncht verstanden hab. Also der Zusammenhang zwichen Badlines und dem Setzen von $D011 an verschiedenen Positionen. Am Beispiel: bei mir beginnt der neue Bereich ab $d7. Kann das mal jemand daran erklären. Es wäre echt total nett, weil ich wissen will, warum es klappt.