Wie haben sie den Bildschirm in Dangerous Dave zum Laufen gebracht?

14

Ich habe Spiele in BASIC gemacht, als ich ein Kind war, und ich war neugierig, wie die Grafiken in der 1988er Version von Dangerous Dave gemacht wurden, die in C ++ erstellt wurde. vor allem, weil sie damals keine lohnenden Grafikpakete hatten. Erinnern Sie sich, wie Dave, als er den Rand des Bildschirms erreichte, sich die gesamte Bildschirmgrafik in einer Schwenkbewegung nach links bewegte? Ich erinnere mich, dass ich gelesen habe, dass Romero dazu eine spezielle Technik verwendet hatte. Ich wollte so etwas wie Dave erschaffen und habe mich gefragt

  1. Welches Grafikpaket / welche Grafikmethode haben sie für Dave verwendet?
  2. und wie lässt sich die gesamte Bildschirmgrafik so bewegen, wie sie es tat?
Nav
quelle
1
Es ist ein Spiel, an das ich mich als Geschenk aus meiner Kindheit
Vishnu
Ein Video dieses Spiels in Aktion, um den Bildlaufeffekt zu sehen, von dem Nav spricht, finden Sie unter dosgamesarchive.com/download/dangerous-dave
Tim Holt

Antworten:

18

Meine 1988er Version von Dangerous Dave war die Apple II-Version. Das Scrollen wurde durchgeführt, indem alle Bildschirmbytes verschoben wurden und dann eine neue Kachel am Rand des Bildschirms gezeichnet wurde. Wiederholen Sie dies 20 Mal, um den gesamten Bildschirm zu verschieben. Die Apple II-Version wurde alle in 6502 Assembler-Sprache geschrieben.

Auf dem PC, der Version von 1990, habe ich Grafikcode in der Assemblersprache 80x86 für alle Videomodi geschrieben: CGA, EGA, VGA. Der gefährliche Dave PC ist das einzige mir bekannte Spiel, in dem alle drei Videomodi enthalten sind und das jederzeit (F2) umgeschaltet werden kann, sogar mitten in einem Sprung!

Um schnell durch den Bildschirm zu scrollen, war alles in Assemblersprache und ich verwendete eine ähnliche Technik wie bei der Apple II-Version - schnell Bytes im Videospeicher verschieben und eine Kachel auf der rechten Seite zeichnen. In EGA war es schwieriger, da für die schnelle Ausführung im EGA-Modus der Latch-Modus für Speicherverschiebungen erforderlich war. Ich erinnere mich, Todd Replogle beigebracht zu haben, wie das geht, damit Duke Nukem 1 ein unterhaltsames Spiel wird (ein langsamer Duke Nukem wäre nicht cool gewesen).

Der Spielcode für Dangerous Dave PC wurde in C in der Borland C 3.0 IDE geschrieben. Das meiste Debugging wurde im Turbo Debugger auf einem 12-Zoll-Bernsteinmonitor durchgeführt, der an eine Hercules-Karte angeschlossen ist.

user42604
quelle
Beeindruckend! Es ist gut, Informationen von jemandem zu erhalten, der tatsächlich in der Montage an diesen Videomodi gearbeitet hat!
Nav
@Nav ehm ... du sprichst eigentlich mit Romero selbst :-)
Gianluca Ghettini
@GianlucaGhettini Nun, es ist ein Benutzer mit dem Foto von Romero, das im Internet verfügbar ist. Würde John Romero ein Konto erstellen, um nur eine Frage zu beantworten? Ich kann nicht ganz sicher sein :-) Es ist allerdings ziemlich seltsam, dass du nur einen Tag nach meinem langen Spiel gegen Dangerous Dave einen Kommentar abgegeben hast.
Nav
@Nav laut seinem Tweet hier: twitter.com/romero/status/679769135681826817 er sagte Todd Replogle tatsächlich, wie man EGA-Smooth-Scrolling für Duken Nukem macht, was genau er in dieser Antwort angibt. Ich bezweifle, dass jemand, der vorgibt, er zu sein, davon weiß .. :-)
Gianluca Ghettini
Dieser Artikel bestätigt, dass user42604 tatsächlich Romero ist. Gamasutra.com/blogs/DavidLightbown/20170223/289955/…
mastazi
13

Ah, ich erinnere mich an diese Techniken aus meiner DOS-Zeit. Das Bewegen des Video-RAM mit dem Blitting zum Scrollen hätte zu ruckeligem Scrollen geführt. EGA hat die vertikalen und horizontalen Pixel-Panning-Register eingeführt, mit denen der Ursprung des Bildschirms festgelegt werden kann (woher die Grafikkarte im Videospeicher die Daten anzeigt). Da kein Speicherkopiervorgang stattfindet, erfolgt dies fast augenblicklich und kann für einen sehr ruckelfreien und schnellen Pixel-für-Pixel-Bildlauf auf EGA und VGA verwendet werden, wenn Sie direkten Zugriff auf die Hardwareregister haben. Die meisten Bildlaufprogramme unter DOS hätten dies verwendet, und dieser Teil des Codes wäre wahrscheinlich in Assemblersprache geschrieben worden, um direkt auf die Hardwareregister zuzugreifen. Diese Methoden sind jedoch nicht mehr gültig. Um jetzt einen ähnlichen Effekt zu erzielen, Ich denke, mit moderner Grafikhardware könnte man es wahrscheinlich schnell genug machen, indem man einfach den gesamten Bildschirm für jeden Frame neu zeichnet. Die andere Methode, die ich mir vorstellen kann, ist die Verwendung von OpenGL oder DirectX und das Rendern einer Textur auf das Vierfache der Bildschirmbreite und das Verschieben dieser. Irgendwie macht es nicht so viel Spaß, wie Hardware-Register zu manipulieren :)

madeyes
quelle
3
"Irgendwie macht es aber nicht so viel Spaß, wie Hardware-Register zu manipulieren :)" - Richtig :)
Nav
4

Bearbeiten: Hier ist ein Link zu einem Artikel von Dr. Dobbs, der das seitliche Scrollen beschreibt. Dies kann die Methode sein, die für diesen Effekt verwendet wird.

http://www.drdobbs.com/184408045


Es ist schwer genau zu beurteilen, wie das gemacht wurde, aber man sollte bedenken, dass dieses Spiel für eine sehr spezielle Hardware-Spezifikation geschrieben wurde - DOS mit einer EGA-Grafikkarte (640x480 Pixel). Der Code führt wahrscheinlich einige ziemlich einfache Manipulationen des Videospeichers durch, damit das Scrollen reibungslos verläuft.

Auf dieser Website erfahren Sie, wie Sie DOS-Grafiken programmieren, um einen Eindruck davon zu bekommen, wie diese aussehen würden ...

http://www.phatcode.net/res/224/files/html/index.html

Tim Holt
quelle
Dieses Spiel würde den Videomodus 320x240 verwenden.
Skizz
Skizz Das habe ich auch gedacht, aber ich habe ein paar Screenshots des Spiels gefunden, die 640x400 Pixel groß waren - eine EGA-Auflösung. Es gab verschiedene Versionen des Spiels, und ich vermute, die ersten waren 320x200.
Tim Holt
4

Metagun (Spiel entwickelt von Markus aka Notch aka MineCraft) hat das gleiche Scroll-Gefühl, das Sie suchen.

Das Spiel ist Open-Source und in Java geschrieben.

Ich hoffe, Sie werden vom Betrachten des Codes lernen.

は は る
quelle
1
Und falls Sie einen Zeitraffer sehen möchten, in dem er das Spiel macht: youtube.com/watch?v=ZV-AFnCkRLY
は る と
1
-1, obwohl es gleich aussieht, verwendet es eindeutig überhaupt nicht die gleiche Methode.
2
Mir ist bewusst, dass dies nicht die exakte Methode ist, die John Romero 1988 verwendet hat. Da @Nav jedoch etwas Ähnliches erstellen wollte, habe ich ihn nicht ausgenommen, um es mit Applesoft BASIC auf einem Apple II-Computer zu programmieren. Der Code, auf den ich verlinkt habe, erledigt eindeutig die gleiche Arbeit, die Sie angesprochen haben.
はると
Danke Joe, aber Eibx hat recht, dass ich auch nach alternativen Wegen gesucht habe.
Nav
2

Ich kann mir zwei Möglichkeiten vorstellen, wie dies getan wurde:

  1. Brute Force: Zeichne einfach die Szene
  2. Mode-X und Schwenkregister. Zeichnen Sie das Bit, das gescrollt werden soll, und passen Sie die Panning-Register an, um die Szene zu scrollen. Sie müssten den oberen Anzeigebereich für jedes Bild neu zeichnen, dies ist jedoch weniger arbeitsaufwendig als das Zeichnen des Hauptspielbereichs. Sie müssten den unteren Bereich nicht neu zeichnen, da in der Hardware ein Register vorhanden ist, das dazu führt, dass die Video-DACs bei einer bestimmten Scan-Zeile von der Adresse 0 lesen (der untere Bereich befindet sich also im Video-RAM auf der Adresse 0 und der oberen würde nach dem unteren Bereich beginnen) * .

Ich würde wahrscheinlich mit 1) fortfahren, da grafisch nicht viel los ist. Möglicherweise gibt es einen selbst generierten Code, um Bilder an den Rändern auszublenden und zu beschneiden. Eine mögliche Technik, an der ein Kollege von mir damals arbeitete, waren selbstschreibende Sprites, dh die Sprite-Daten waren keine Daten, sondern Code. Dies bedeutete, dass es keine Transparenzprüfungen gab und die Daten, die vom Blit gelesen wurden, effektiv frei waren (dies war auf einem 386, wo jeder Befehl gelesen und dann decodiert wurde, so dass anstatt Code zu lesen-> Daten zu lesen-> Daten zu schreiben, nur Code zu lesen- > Daten schreiben). Es hat erstaunlich gut funktioniert - wir haben viele riesige Sprites auf mehreren Parallaxenebenen mit mehr als 25 fps erhalten.

Aber wir reden hier über Romero und es wird wahrscheinlich ein bisschen übertrieben über die Techniken.

  • Ich habe dies tatsächlich in meinem ersten großen DOS-Spiel getan, und es gibt einen Fehler in der Hardware, bei dem das Zurücksetzen der Adresse eine Scan-Zeile zu früh passiert ist, sodass zwischen den beiden Abschnitten ein Pixel mit halber Höhe liegt.
Skizz
quelle