Hice juegos en BASIC cuando era niño, y tenía curiosidad acerca de cómo se hicieron los gráficos en la versión 1988 de Dangerous Dave hecha en C ++; especialmente porque no tenían ningún paquete de gráficos que valiera la pena esos días. ¿Recuerdas cómo cuando Dave llegó al borde de la pantalla, todo el gráfico de la pantalla solía moverse hacia la izquierda en un movimiento de barrido? Recuerdo haber leído que Romero había usado una técnica especial para hacer eso. He estado queriendo crear algo como Dave, y me preguntaba
- ¿Qué paquete / método de gráficos utilizaron para Dave?
- ¿Y cómo hacer que todo el gráfico de la pantalla se mueva como lo hicieron?
Respuestas:
Mi versión 1988 de Dangerous Dave fue la versión de Apple II. El desplazamiento se realizó moviendo todos los bytes de la pantalla y luego dibujando un nuevo mosaico en el borde de la pantalla; repita 20 veces para un cambio de pantalla completa. La versión de Apple II fue escrita en lenguaje ensamblador 6502.
En la PC, la versión de 1990, escribí un código gráfico en lenguaje ensamblador 80x86 para todos los modos de video en ese momento: CGA, EGA, VGA. Dangerous Dave PC es el único juego que conozco que tiene los 3 modos de video y se puede cambiar en cualquier momento (F2), ¡incluso en medio de un salto!
Para desplazar la pantalla rápidamente, todo estaba en lenguaje ensamblador y utilicé una técnica similar a la que utilicé con la versión Apple II: mover rápidamente los bytes en la memoria de video y dibujar un mosaico en el lado derecho. En EGA fue más complicado porque hacer algo rápidamente en modo EGA requería el uso del modo Latch para movimientos de memoria. Recuerdo haberle enseñado a Todd Replogle cómo hacerlo para que Duke Nukem 1 fuera un juego divertido (un Duke Nukem lento no hubiera sido genial).
El código del juego para Dangerous Dave PC fue escrito en C, en el Borland C 3.0 IDE. La mayor parte de la depuración se realizó en Turbo Debugger en un monitor ámbar de 12 "conectado a una tarjeta Hercules.
fuente
Ah, recuerdo estas técnicas de mis días de DOS. Mover la RAM de video con blitting para realizar el desplazamiento habría resultado en un desplazamiento desigual. EGA introdujo los registros de desplazamiento panorámico de píxeles verticales y horizontales que podrían usarse para establecer el origen de la pantalla (donde en la memoria de video la tarjeta de video comenzó a mostrar datos). Debido a que no se realiza ninguna copia de memoria, esto es casi instantáneo y puede usarse para un desplazamiento de píxel a píxel muy suave y rápido en EGA y VGA si tiene acceso directo a los registros de hardware. La mayoría de los desplazadores en DOS habrían usado esto, y esta parte del código probablemente habría sido escrita en lenguaje ensamblador para acceder directamente a los registros de hardware. Sin embargo, estos métodos ya no son realmente válidos. Para lograr un efecto similar ahora, Creo que en el hardware de gráficos moderno probablemente podría hacerlo lo suficientemente rápido simplemente redibujando la pantalla completa de cada fotograma. El otro método que se me ocurre es usar OpenGL o DirectX y renderizar una textura a un cuádruple dos veces el ancho de la pantalla y moverla. De alguna manera, no parece tan divertido como manipular registros de hardware :)
fuente
Editar: Aquí hay un enlace a un artículo del Dr. Dobbs que analiza el desplazamiento lateral. Puede ser el método utilizado para este efecto.
http://www.drdobbs.com/184408045
Es difícil juzgar exactamente cómo se hizo esto, pero tenga en cuenta que este juego fue escrito para una especificación de hardware muy específica: DOS con una tarjeta de video EGA (640x480 píxeles). El código probablemente está haciendo algunas manipulaciones de nivel bastante bajo de la memoria de video para que el desplazamiento se realice sin problemas.
Aquí hay un sitio web que habla sobre la programación de gráficos de DOS que podrían darle una idea de cómo sería ...
http://www.phatcode.net/res/224/files/html/index.html
fuente
Metagun (juego desarrollado por Markus alias Notch alias MineCraft) tiene la misma sensación de desplazamiento que estás buscando.
El juego es de código abierto y está escrito en Java.
Espero que aprendas mirando el código.
fuente
Puedo pensar en dos formas en que esto se ha hecho:
Probablemente iría con 1) ya que no hay mucho gráfico, puede haber algún código autogenerado para borrar y recortar imágenes en los bordes. Una técnica posible en la que un colega mío estaba trabajando en ese entonces era los sprites de auto escritura, es decir, los datos del sprite no eran datos, era código. Esto significaba que no había controles de transparencia y que la lectura de datos del blit era efectivamente libre (esto era en un 386 donde cada instrucción se leía y luego se decodificaba, así que en lugar de leer código-> leer datos-> escribir datos, solo era leer código- > escribir datos). Funcionó increíblemente bien: obtuvimos muchos sprites enormes en múltiples capas de paralaje a más de 25 fps.
Pero estamos hablando de Romero aquí y probablemente hay un poco de exageración sobre las técnicas.
fuente