Ich versuche, ein Oldschool-NES-Stil-Videospiel zu entwickeln, mit Sprite Flackern und grafischen Verlangsamung. Ich habe darüber nachgedacht, welche Art von Logik ich verwenden sollte, um solche Effekte zu ermöglichen.Emulation Old-School-Sprite Flackern (Theorie und Konzept)
Ich habe folgende Einschränkungen zu beachten, wenn ich die alte Schule NES Stil gehen will:
- nicht mehr als 64 Sprites auf dem Bildschirm zu einer Zeit
- nicht mehr als 8 Sprites pro Scanline, oder für jede Zeile auf der Y-Achse
- Wenn es zu viel Action auf dem Bildschirm geht, friert das System das Bild für einen Rahmen der Prozessor mit dem
Von dem, was ich gelesen habe, wenn es mehr als 64 Sprites auf dem Bildschirm gab, würde der Entwickler nur Sprites mit hoher Priorität zeichnen, während er niedrige Priorität ignoriert. Sie könnten sich auch abwechseln, indem sie jedes gerade numerierte Sprite auf gegenüberliegenden Bildern von ungeradzahligen Bildern zeichnen.
Das Scanline-Problem ist interessant. Nach meinen Tests ist es unmöglich, eine gute Geschwindigkeit auf dem XBOX 360 XNA-Framework zu erreichen, indem Pixel Pixel für Pixel gezeichnet werden, wie es beim NES der Fall war. Dies ist der Grund, warum in Spielen der alten Schule, wenn es zu viele Sprites in einer einzigen Zeile gäbe, einige erscheinen würden, wenn sie halbiert würden. Für alle Zwecke für dieses Projekt mache ich Scanlinien mit einer Höhe von 8 Pixel und gruppiere die Sprites pro Scanlinie nach ihrer Y-Positionierung.
Um zu klären, würde ich Sprites auf den Bildschirm in Chargen von 8x8 Pixel, nicht 1x1 zeichnen.
Also, verdummt Ich muss mit einer Lösung kommen, dass ....
- 64 Sprites auf dem Bildschirm auf einmal
- 8 Sprites pro 'Scanline'
- Kann Sprites zeichnen basierend auf Priorität
- Kann zwischen Sprites pro Rahmen
- Emulate Verlangsamung
Hier ist meine aktuelle Theorie
erster Linie eine grundlegende Idee kam ich mit Sprite Priorität anspricht. Unter der Annahme, Werte zwischen 0-255 (0 niedrig ist), kann ich Sprites Prioritätsstufen, zum Beispiel zu:
- 0 zu 63 niedrig ist
- 63-127 ist mittel
- 128-191 hoch ist
- 192 bis 255 werden maximal
Innerhalb meiner Daten-Dateien, kann ich jeden Sprite zuweisen eine gewisse Priorität. Wenn das übergeordnete Objekt erstellt wird, wird dem Sprite zufällig eine Zahl zwischen dem angegebenen Bereich zugewiesen. Ich würde dann Sprites in der Reihenfolge von hoch nach niedrig zeichnen, mit dem Endziel, jedes Sprite zu zeichnen.
Jetzt, wenn ein Sprite in einem Rahmen gezeichnet wird, würde ich dann zufällig einen neuen Prioritätswert innerhalb seiner anfänglichen Prioritätsstufe erzeugen. Jedoch, wenn ein Sprite nicht in einem Rahmen gezeichnet wird, könnte ich 32 zu seiner aktuellen Priorität hinzufügen. Wenn das System beispielsweise Sprites nur bis zu einer Prioritätsebene von 135 zeichnen kann, könnte ein Sprite mit einer anfänglichen Priorität von 45 gezeichnet werden, nachdem 3 Frames nicht gezeichnet wurden (45 + 32 + 32 + 32 = 141)
Dies würde es Sprites theoretisch ermöglichen, Frames abwechselnd zu verwenden, Prioritätsstufen zuzulassen und Sprites auf 64 pro Bildschirm zu begrenzen.
Die interessante Frage ist nun, wie kann ich Sprites auf nur 8 pro Scanline beschränken?
Ich denke, wenn ich die Sprites mit hoher Priorität zu niedriger Priorität sortiere, durchlaufen Sie die Schleife, bis ich 64 Sprites gezogen habe. Allerdings sollte ich nicht nur die ersten 64 Sprites in die Liste aufnehmen.
Bevor ich jedes Sprite zeichnete, konnte ich überprüfen, wie viele Sprites in seiner jeweiligen Scanlinie über Zählervariablen gezeichnet wurden. Zum Beispiel:
- Y-Wert zwischen 0 und 7 gehört, 0 bis Abtastzeile, scanlineCount [0] = 0
- Y-Wert zwischen 8 und 15 gehört 1, scanlineCount [1] = 0 bis Abtastlinie
- usw.
Ich könnte die Werte pro Scanline für jeden Frame zurückgesetzt werden. Wenn Sie in der Sprite-Liste nach unten gehen, fügen Sie 1 zum entsprechenden Zähler der Scanlinie hinzu, wenn ein Sprite in dieser Scanlinie gezeichnet wird. Wenn es gleich 8 ist, zeichne nicht dieses Sprite und gehe zum Sprite mit der nächstniedrigeren Priorität.
ABSCHWÄCHUNG
Das letzte, was ich tun muss, ist Verlangsamung zu emulieren. Meine ursprüngliche Idee war, dass wenn ich 64 Sprites pro Frame zeichne und es noch mehr Sprites gibt, die gezeichnet werden müssen, könnte ich das Rendering um 16ms oder so pausieren. In den NES-Spielen, die ich gespielt habe, gibt es jedoch manchmal eine Verlangsamung, wenn kein Sprite-Flimmern auftritt, während sich das Spiel schön bewegt, selbst wenn etwas Sprite flimmert.
Vielleicht geben Sie einen Wert für jedes Objekt, das Sprites auf dem Bildschirm verwendet (wie die obigen Prioritätswerte), und wenn die kombinierten Werte aller Objekte mit Sprites einen Schwellenwert überschreiten, führen Sie Verlangsamung ein?
SCHLUSS ...
Does ich alles schrieb klingen tatsächlich legitim und könnte funktionieren, oder ist es ein Wunschtraum? Welche Verbesserungen können Sie möglicherweise mit dieser Spielprogrammtheorie von mir denken?
das ist alles sehr cool, und Sie haben meine +1 für gründlich .. aber gibt es eine * Frage * hier? –
+1, weil du es geschafft hast, dass ich alles lese. –
Unter "Fazit". :) Ich fragte, ob das legitim klang und ob es funktionieren könnte oder ob es Verbesserungen bei meiner Theorie geben könnte. Ich betrachte dies als ein Problem, da ich meine Ziele und meine aktuelle Theorie angegeben habe, um sie zu erhalten, und ich bitte um Rat, wie das geht: D –