Comment ont-ils fait bouger l'écran dans Dangerous Dave?

14

J'ai fait des jeux en BASIC quand j'étais enfant, et j'étais curieux de savoir comment les graphiques étaient faits dans la version 1988 de Dangerous Dave faite en C ++; surtout parce qu'ils n'avaient pas de paquets graphiques valables ces jours-ci. Rappelez-vous comment lorsque Dave a atteint le bord de l'écran, le graphique de l'écran entier utilisé pour se déplacer vers la gauche dans un mouvement de balayage? Je me souviens avoir lu que Romero avait utilisé une technique spéciale pour ce faire. Je voulais créer quelque chose comme Dave et je me demandais

  1. quel package / méthode graphique ils ont utilisé pour Dave?
  2. et comment faire bouger tout le graphique de l'écran comme ils l'ont fait?
Nav
la source
1
Son seul jeu sur lequel je me souviens comme un cadeau de mon enfance
Vishnu
Pour une vidéo de ce jeu en action pour voir l'effet de défilement dont parle Nav, consultez dosgamesarchive.com/download/dangerous-dave
Tim Holt

Réponses:

18

Ma version 1988 de Dangerous Dave était la version Apple II. Le défilement a été effectué en déplaçant tous les octets d'écran, puis en dessinant une nouvelle tuile sur le bord de l'écran - répétez 20 fois pour un décalage d'écran complet. La version Apple II a été écrite entièrement en langage assembleur 6502.

Sur le PC, la version 1990, j'ai écrit du code graphique en langage assembleur 80x86 pour tous les modes vidéo de l'époque: CGA, EGA, VGA. Dangerous Dave PC est le seul jeu que je connaisse qui possède les 3 modes vidéo et commutable à tout moment (F2), même au milieu d'un saut!

Pour faire défiler l'écran rapidement, tout était en langage assembleur et j'ai utilisé une technique similaire à celle utilisée avec la version Apple II - déplacer rapidement les octets dans la mémoire vidéo et dessiner une tuile sur le côté droit. En EGA, c'était plus délicat car pour faire quoi que ce soit rapidement en mode EGA, il fallait utiliser le mode Latch pour les déplacements de mémoire. Je me souviens avoir enseigné à Todd Replogle comment faire pour que Duke Nukem 1 soit un jeu amusant (un Duke Nukem lent n'aurait pas été cool).

Le code du jeu pour Dangerous Dave PC a été écrit en C, dans l'IDE Borland C 3.0. La plupart du débogage a été effectué dans Turbo Debugger sur un moniteur 12 "orange branché sur une carte Hercules.

user42604
la source
Hou la la! bon d'obtenir des informations de quelqu'un qui avait réellement travaillé sur ces modes vidéo en assemblage!
Nav
@Nav ehm ... vous parlez en fait à Romero lui-même :-)
Gianluca Ghettini
@GianlucaGhettini Eh bien, c'est un utilisateur avec la photo de Romero qui est disponible sur Internet. Est-ce que John Romero créerait un compte juste pour répondre à une question? Je ne peux pas être tout à fait sûr :-) C'est assez étrange cependant, que vous ayez commenté juste un jour après avoir joué Dangerous Dave après très très longtemps.
Nav
@Nav selon son tweet ici: twitter.com/romero/status/679769135681826817, il a en fait dit à Todd Replogle comment faire un défilement lisse EGA pour Duken Nukem, ce qui est exactement ce qu'il déclare dans cette réponse. Je doute que quelqu'un se faisant passer pour lui le sache .. :-)
Gianluca Ghettini
Cet article confirme que user42604 est bien Romero gamasutra.com/blogs/DavidLightbown/20170223/289955/…
mastazi
13

Ah je me souviens de ces techniques de mes jours DOS. Déplacer la RAM vidéo avec blitting pour effectuer un défilement aurait entraîné un défilement saccadé. EGA a introduit les registres de panoramique vertical et horizontal des pixels qui pouvaient être utilisés pour définir l'origine de l'écran (où dans la mémoire vidéo la carte vidéo a commencé à afficher des données). Parce qu'il n'y a pas de copie de mémoire en cours, cela est presque instantané et peut être utilisé pour un défilement pixel par pixel très fluide et rapide sur EGA et VGA si vous avez un accès direct aux registres matériels. La plupart des scrollers sous DOS l'auraient utilisé, et cette partie du code aurait probablement été écrite en langage assembleur pour accéder directement aux registres matériels. Cependant, ces méthodes ne sont plus vraiment valides. Pour obtenir un effet similaire maintenant, Je pense que sur du matériel graphique moderne, vous pourriez probablement le faire assez rapidement en redessinant tout l'écran à chaque image. L'autre méthode à laquelle je pense est d'utiliser OpenGL ou DirectX et de rendre une texture à un quadruple deux fois la largeur de l'écran et de la déplacer. D'une certaine manière, cela ne semble pas aussi amusant que de manipuler des registres matériels :)

fait
la source
3
"D'une certaine manière, cela ne semble pas aussi amusant que de manipuler des registres matériels :)" - Vrai :)
Nav
4

Edit: Voici un lien vers un article du Dr Dobbs qui traite du défilement latéral. Ce peut être la méthode utilisée pour cet effet.

http://www.drdobbs.com/184408045


Il est difficile de juger exactement comment cela a été fait, mais considérez que ce jeu a été écrit pour une spécification matérielle très spécifique - DOS avec une carte vidéo EGA (640x480 pixels). Le code fait probablement quelques manipulations de bas niveau de la mémoire vidéo pour que le défilement se fasse en douceur.

Voici un site Web qui parle de la programmation de graphiques DOS qui pourraient vous donner une idée de ce que ce serait ...

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

Tim Holt
la source
Ce jeu utiliserait le mode vidéo 320x240.
Skizz
Skizz J'y pensais aussi, mais j'ai trouvé quelques captures d'écran du jeu qui étaient 640x400 - une résolution EGA. Il y avait différentes versions du jeu, et je suppose que les premières étaient en 320x200.
Tim Holt
4

Metagun (jeu développé par Markus aka Notch aka MineCraft guy) a la même sensation de défilement que vous recherchez.

Le jeu est Open-Source et écrit en Java.

J'espère que vous apprendrez en regardant le code.

は る と
la source
1
Et au cas où vous voudriez voir un timelapse de lui faire le jeu: youtube.com/watch?v=ZV-AFnCkRLY
は は と
1
-1, bien qu'il ait la même apparence, il est clair qu'il n'utilise pas du tout la même méthode.
2
Je suis conscient que ce n'est pas la méthode exacte utilisée par John Romero en 1988. Mais puisque @Nav voulait créer quelque chose de similaire, je ne l'ai pas excepté pour le programmer en utilisant Applesoft BASIC sur un ordinateur Apple II. Le code auquel j'ai lié, fait clairement le même travail que vous l'avez souligné.
は る と
Merci Joe, mais Eibx a raison de dire que je cherchais également d'autres moyens.
Nav
2

Je peux penser à deux façons de procéder:

  1. Force brute: il suffit de dessiner la scène
  2. Registres Mode-X et panoramique. Dessinez le bit à faire défiler et ajustez les registres de panoramique pour faire défiler la scène. Vous auriez besoin de redessiner la zone d'affichage supérieure à chaque image, mais c'est moins de travail à faire que de dessiner la zone de lecture principale. Vous n'auriez pas besoin de redessiner la zone inférieure car il y avait un registre dans le matériel qui obligerait les DAC vidéo à lire à partir de l'adresse 0 sur une ligne de balayage donnée (donc la zone inférieure serait à l'adresse 0 dans le ram vidéo et en haut) commencerait après la zone inférieure) * .

J'irais probablement avec 1) car il n'y a pas grand-chose graphiquement, il peut y avoir du code auto-généré pour blit et couper les images sur les bords. Une technique possible sur laquelle un de mes collègues travaillait à l'époque était les sprites auto-écrits, c'est-à-dire que les données de sprite n'étaient pas des données, c'était du code. Cela signifiait qu'il n'y avait pas de vérification de transparence et que les données lues du blit étaient effectivement libres (c'était sur un 386 où chaque instruction était lue puis décodée donc au lieu de lire le code-> lire les données-> écrire les données c'était juste lire le code- > écrire des données). Cela a fonctionné incroyablement bien - nous avons eu beaucoup de sprites énormes sur plusieurs couches de parallaxe fonctionnant à 25fps +.

Mais nous parlons de Romero ici et il y a probablement un peu d'exagération à propos des techniques.

  • J'ai effectivement fait cela dans mon premier jeu DOS majeur, et il y a un bug dans certains matériels où la réinitialisation de l'adresse s'est produite trop tôt sur une ligne de balayage afin que vous ayez un pixel à mi-hauteur entre les deux sections.
Skizz
la source