Come hanno fatto muovere lo schermo in Dangerous Dave?


14

Ho realizzato giochi in BASIC da bambino, ed ero curioso di sapere come venivano realizzate le grafiche nella versione del 1988 di Dangerous Dave in C ++; soprattutto perché in quei giorni non avevano pacchetti grafici utili. Ricordi come quando Dave raggiunse il bordo dello schermo, l'intera grafica dello schermo si spostava a sinistra in un movimento ampio? Ricordo di aver letto che Romero aveva usato una tecnica speciale per farlo. Volevo creare qualcosa come Dave, e mi chiedevo

  1. quale pacchetto / metodo grafico hanno usato per Dave?
  2. e come spostare l'intera grafica dello schermo come hanno fatto?

1
È un gioco su cui ricordo come regalo della mia infanzia
Vishnu il

Per un video di questo gioco in azione per vedere l'effetto a scorrimento di cui parla Nav, vedere dosgamesarchive.com/download/dangerous-dave
Tim Holt il

Risposte:


18

La mia versione del 1988 di Dangerous Dave era la versione Apple II. Lo scorrimento è stato fatto spostando tutti i byte dello schermo sopra quindi disegnando una nuova tessera sul bordo dello schermo - ripetere 20 volte per uno spostamento a schermo intero. La versione Apple II è stata scritta tutta in linguaggio assembly 6502.

Sul PC, la versione del 1990, ho scritto codice grafico in linguaggio assembly 80x86 per tutte le modalità video dell'epoca: CGA, EGA, VGA. Dangerous Dave PC è l'unico gioco che conosco che ha tutte e 3 le modalità video e commutabile in qualsiasi momento (F2), anche nel mezzo di un salto!

Per scorrere rapidamente lo schermo, era tutto in linguaggio assembly e ho usato una tecnica simile a quella usata con la versione Apple II: spostare rapidamente i byte nella memoria video e disegnare un riquadro sul lato destro. In EGA era più complicato perché per fare qualcosa rapidamente in modalità EGA era necessario l'uso della modalità Latch per gli spostamenti di memoria. Ricordo di aver insegnato a Todd Replogle come farlo, così Duke Nukem 1 sarebbe stato un gioco divertente (un lento Duke Nukem non sarebbe stato bello).

Il codice di gioco per Dangerous Dave PC è stato scritto in C, nell'IDE 3.0 di Borland C. La maggior parte del debug è stata eseguita in Turbo Debugger su un monitor ambra da 12 "collegato a una scheda Hercules.


Wow! buono per ottenere informazioni da qualcuno che aveva effettivamente lavorato su quelle modalità video durante il montaggio!
Nav

@Nav ehm ... in realtà stai parlando con lo stesso Romero :-)
Gianluca Ghettini,

@GianlucaGhettini Bene, è un utente con la foto di Romero che è disponibile su Internet. John Romero avrebbe creato un account solo per rispondere a una domanda? Non posso essere del tutto sicuro :-) È abbastanza strano, però, che tu abbia commentato solo un giorno dopo che ho interpretato Dangerous Dave dopo molto tempo.
Nav

@Nav secondo il suo tweet qui: twitter.com/romero/status/679769135681826817 in realtà ha detto a Todd Replogle come eseguire lo scorrimento regolare EGA per Duken Nukem, che è esattamente ciò che sta affermando in questa risposta. Dubito che qualcuno che finge di essere lui lo sappia .. :-)
Gianluca Ghettini,

Questo articolo conferma che user42604 è davvero Romero gamasutra.com/blogs/DavidLightbown/20170223/289955/…
mastazi

13

Ah, ricordo queste tecniche dai miei giorni in DOS. Spostare la RAM video con blitting per eseguire lo scorrimento avrebbe comportato uno scorrimento a scatti. EGA ha introdotto i registri di pixel verticali e orizzontali che potrebbero essere utilizzati per impostare l'origine dello schermo (da dove nella memoria video la scheda video ha iniziato a visualizzare i dati). Poiché non è in corso alcuna copia della memoria, questo è quasi istantaneo e può essere utilizzato per uno scorrimento dei pixel molto fluido e veloce su EGA e VGA se si ha accesso diretto ai registri hardware. La maggior parte degli scroller in DOS avrebbe usato questo, e questa parte del codice sarebbe stata probabilmente scritta in linguaggio assembly per accedere direttamente ai registri hardware. Tuttavia, questi metodi non sono più validi. Per ottenere un effetto simile ora, Penso che su hardware grafico moderno potresti probabilmente farlo abbastanza velocemente ridisegnando l'intero schermo ogni frame. L'altro metodo che mi viene in mente è l'utilizzo di OpenGL o DirectX e il rendering di una trama su un quadruplo della larghezza dello schermo e lo spostamento. In qualche modo non sembra divertente come manipolare i registri hardware però :)


3
"In qualche modo non sembra divertente come manipolare i registri hardware però :)" - Vero :)
Nav

4

Modifica: ecco un link ad un articolo del Dr. Dobbs che discute lo scorrimento laterale. Potrebbe essere il metodo utilizzato per questo effetto.

http://www.drdobbs.com/184408045


È difficile giudicare esattamente come è stato fatto, ma considera che questo gioco è stato scritto per una specifica hardware molto specifica: DOS con una scheda video EGA (640x480 pixel). Il codice sta probabilmente eseguendo alcune manipolazioni di livello piuttosto basso della memoria video per rendere scorrevole lo scorrimento.

Ecco un sito web che parla della programmazione della grafica DOS che potrebbe darti un'idea di come sarebbe ...

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


Questo gioco utilizza la modalità video 320x240.
Skizz,

Skizz Ci stavo pensando anch'io, ma ho trovato alcuni screenshot del gioco che erano 640x400 - una risoluzione EGA. C'erano diverse versioni del gioco, e immagino che le prime fossero 320x200.
Tim Holt,

4

Metagun (gioco sviluppato da Markus aka Notch aka MineCraft guy) ha la stessa sensazione di scorrimento che stai cercando.

Il gioco è Open-Source e scritto in Java.

Spero che imparerai guardando il codice.


1
E nel caso tu voglia vedere un time-lapse di lui mentre realizza il gioco: youtube.com/watch?v=ZV-AFnCkRLY
は る と

1
-1, sebbene appaia uguale, chiaramente non utilizza affatto lo stesso metodo.

2
Sono consapevole che questo non è il metodo esatto usato da John Romero nel 1988. Ma poiché @Nav voleva creare qualcosa di simile, non ho fatto eccezione a lui per programmarlo usando Applesoft BASIC su un computer Apple II. Il codice a cui ho collegato, fa chiaramente lo stesso lavoro che hai indicato.
は る と

Grazie Joe, ma Eibx ha ragione sul fatto che stavo cercando anche modi alternativi.
Nav

2

Posso pensare a due modi in cui questo è stato fatto:

  1. Forza bruta: basta disegnare la scena
  2. Mode-X e registri di panning. Disegna il bit da scorrere in vista e regola i registri di panoramica per scorrere la scena. Dovresti ridisegnare l'area di visualizzazione superiore di ogni fotogramma, ma è meno lavoro che disegnare l'area di gioco principale. Non avresti bisogno di ridisegnare l'area inferiore in quanto vi era un registro nell'hardware che causava la lettura dei DAC video dall'indirizzo 0 in una determinata linea di scansione (quindi l'area inferiore sarebbe all'indirizzo 0 nella ram del video e nella parte superiore inizierebbe dopo l'area inferiore) * .

Probabilmente andrei con 1) poiché non c'è molto da fare graficamente, potrebbe esserci del codice auto-generato per blitare e ritagliare le immagini ai bordi. Una possibile tecnica su cui un mio collega stava lavorando all'epoca era lo sprite che scriveva da sé, cioè i dati di sprite non erano dati, era codice. Ciò significava che non vi erano controlli di trasparenza e che i dati letti dal blit erano effettivamente gratuiti (questo era su un 386 in cui ogni istruzione veniva letta e quindi decodificata, quindi invece di leggere il codice-> leggi i dati-> scrivi i dati era solo leggi il codice- > scrivere dati). Ha funzionato incredibilmente bene - abbiamo ottenuto molti sprite enormi su più livelli di parallasse a 25 fps +.

Ma stiamo parlando di Romero qui e probabilmente c'è un po 'di esagerazione in corso sulle tecniche.

  • In realtà l'ho fatto nel mio primo grande gioco DOS, e in alcuni hardware c'è un bug per cui il reset dell'indirizzo è avvenuto troppo presto con una scanline in modo da avere un pixel a mezza altezza tra le due sezioni.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.