Pregunta

OK. Estoy en esencia tratando de hacer mi propia interpretación del hardware de NES, por lo que puede hacer un juego que, idealmente, se asemejaría a lo que es un juego de NES se vería así. Actualmente estoy atascado con la forma de ajustar cómo dibujar el campo de juego a la memoria de vídeo (búfer posterior).

BACKBUFFER

Los NES tenían restricciones a la NameTable o backbuffer. Para mi ejemplo, la backbuffer es 256x240pixels grande, o el tamaño de una pantalla. Si Dibujé esto al televisor, sería llenar la pantalla perfectamente. Ahora bien, si Dibujé esto a la pantalla con un desplazamiento de X = 5, toda la imagen se movió y se envolvía alrededor de la pantalla.

Por ejemplo .....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

La pantalla se divide en cuadrados de 8x8 píxeles cada una, por un total de 32x30 filas y columnas. (256x240 píxeles). El desplazamiento se representa en píxeles - no columnas; así que en teoría, podría compensar la pantalla por 5 píxeles y cada columna se desplazaría hacia la derecha por cinco píxeles.

nivel de diseño

Mis etapas se componen de pantallas, que contiene los datos que se representan en 16x15 filas y columnas, cada una de 16x16 píxeles. Esta es emular el número de juegos de NES almacena los datos de nivel -. Cada baldosa tiene información sobre lo que debería ser en cada bloque de 8x8

por ejemplo:.

AA
BC     with A,B,C,D representing what 8x8 graphic should go where
diseño

Nivel está representado por esto también, con cada número es una pantalla diferente y -. que no significa nada, null

-----
-123-
---4-
--54-
-----

COLOCACIÓN DE CARACTERES Esto es facil. Ya sé cómo puedo determinar la tabla, fila y columna de mis personajes están en la base de su posicionamiento absoluto. I también puede determinar la posición relativa dentro de la pantalla.

Con esta información, que puede fácilmente averiguar qué columnas están a la izquierda y derecha del carácter, en su caso (si el personaje está en el lado izquierdo de la pantalla 1, thered ser no más nivel de la izquierda)

SO aquí está la pregunta DUN DUN DUN ¿Cómo puedo dibujar mis niveles de la pantalla, de modo que se desplazan de una a la siguiente. Sería relativamente fácil trazar una pantalla completa a la vez, y cuando el personaje llega a la orilla sólo la vuelta a otra pantalla.

Sin embargo, el problema que estoy teniendo es conceptualmente que necesito 'arroyo' los datos de nivel en la pantalla. Que, digamos el personaje se mueve 24 píxeles hacia la derecha. El BG necesita moverse también.

Por lo tanto, tengo que ajustar el desplazamiento de la backbuffer por 24 píxeles. Sin embargo, sólo el desplazamiento solo hará que la pantalla para envolver otra vez, diplsaying parte vieja del nivel. Así, mientras se desplaza necesito para asegurarse de dibujar nuevas piezas del nivel al búfer de reserva. Pero antes de que pueda hacer eso, necesito averiguar qué fichas deben dejarse arrastrar por primera vez. Y si la persona va de 24 píxeles a la izquierda, lo que necesito para volver a dibujar los azulejos en el backbuffer y cambiar la compensación en consecuencia también.

Y no olvidemos que si se mueve el personaje correctas y que no hay más datos de nivel que se pueden extraer, no debería haber ningún desplazamiento sino que el personaje se acerca más a un lado de la pantalla (en lugar de estar centrado en el medio de la pantalla a través del eje X).

Básicamente, sólo tengo una gran cantidad de diferentes números y valores atrapado en mi mente ahora mismo - tratando de envolver mi cabeza alrededor de muchos conceptos y que hizo que mi cerebro para convertirse en sustancia viscosa. Alguien tiene alguna perspectiva sobre cómo puedo acercarse a este?

EDIT: El uso de VB.Net. C # es aplicable también (programa I en ambos)

¿Fue útil?

Solución

La forma en la NES hicieron fue con 4 tablas de nombres, cada uno de 256x240. Cuando se desplazará una fuera de la pantalla, la adyacente sería desplazamiento continuo. Para conseguir "mundos" más grande que 512x480, se actualiza la tabla de nombres en las posiciones que están fuera de la pantalla.

En general, un cartucho tendría una mesa gigante en ROM con todos los datos de nivel, y sería realizar un seguimiento de la posición global con 1 o 2 variables RAM. Luego, cuando el juego desplaza, sería actualizar las variables de memoria RAM, las usará para buscar la tabla de datos de nivel y copiar en los nuevos datos de nivel a la región de la tabla de nombres que estaban fuera de la pantalla.

Así que en realidad el búfer de reserva debe ser 512x480, y le mostrará sólo una parte de ella 256x240.

¿Has mirado en el desmontaje de ningún juego de NES que tienen grandes mundos de desplazamiento? Creo que un parcial de desmontaje de Metroid es en alguna parte ...

... sí, encontró algunos documentos en romhacking.net

Metroid desmontaje ; no es real bien comentado, pero con un poco de esfuerzo no debería ser demasiado difícil de averiguar.

Otra desmontaje que se comenta mejor.

EDIT: En el segundo desmontaje publicado anteriormente, mirada en MetroidGameEnginePage.txt en la rutina "SetupRoom" y la rutina "DrawRoom"; También la rutina en la etiqueta muestra cómo LEB4D la tabla de nombres se actualiza en un caso. Busque también en los extensos comentarios anteriores la rutina "GetNameTable". En general, una búsqueda de texto para la "tabla de nombres" en todo el documento le conseguirá porciones más.

EDITAR EDIT: También en romhacking.net; la href="http://www.romhacking.net/docs/345/" rel="nofollow noreferrer"> mapa de memoria para SMB podría ser útil.

Otros consejos

Me gustaría establecer una cuadrícula de controles de imagen y cargar los niveles de una base de datos que almacena qué columna y fila cada imagen es relativa al nivel. Una vez que la imagen que representa el personaje del juego se hace lo suficientemente lejos hacia la derecha (que tendría que almacenar su ubicación en algunas variables de nivel de módulo) de la pantalla que le cargue la siguiente columna de imágenes (al tiempo que cambia todas las otras imágenes una a la izquierda y la eliminación de la primera columna).

scroll top