2010-06-09 13 views
12

Me pregunto cómo el NES muestra su músculo gráfico. Investigué cosas en línea y las leí, pero me pregunto una última cosa: tablas de nombres.NES Programming - Nametables?

Básicamente, por lo que he leído, cada bloque de 8x8 en una tabla de nombre de NES apunta a una ubicación en la tabla de patrones, que contiene memoria gráfica. Además, la tabla de nombres también tiene una tabla de atributos que establece una determinada paleta de colores para cada bloque de 16x16. Están ligados juntos de esta manera:

(suponiendo 16 bloques de 8x8) NameTable, con ABCD = punteros de Datos de Sprite:

ABBB 
CDCC 
DDDD 
DDDD 

tabla de atributos, con 1 2 3 = punteros a los datos de paleta de colores , con referencia a < valor a la izquierda,^arriba, y 'a la izquierda y arriba:

1<2< 
^'^' 
3<3< 
^'^' 

así, en el ejemplo anterior, los bloques se pueden colorear por lo que

1A 1B 2B 2B 

1C 1D 2C 2C 

3D 3D 3D 3D 

3D 3D 3D 3D 

Ahora, si tengo esto en una pantalla fija, ¡funciona muy bien! Porque la resolución de NES es de 256x240 píxeles. Ahora, ¿cómo se ajustan estas tablas para el desplazamiento?

Porque Nametable 0 puede desplazarse hacia Nametable 1, y si continúa desplazándose, Nametable 0 se ajustará de nuevo. Eso me sale Pero lo que no entiendo es cómo desplazar la tabla de atributos también. Según lo que he leído en línea, los bloques de 16x16 a los que asigna atributos causarán distorsiones de color en las fichas de borde de la pantalla (como se ve al desplazarse de izquierda a derecha y viceversa en SMB3).

La preocupación que tengo es que entiendo cómo desplazar las tablas de nombres, pero ¿cómo se desplaza la tabla de atributos? Para empezar, si tengo un bloque verde en el lado izquierdo de la pantalla, mover la pantalla a la derecha debería, en teoría, hacer que las fichas de la derecha también estén verdes hasta que se muevan más en el marco, al cual volverán a sus colores normales.

~~~~ EDIT: Quiero señalar que sé sobre las líneas de exploración, X e Y. Este pensamiento simplemente pasó por mi mente.

Digamos que estoy en la línea de escaneo Y de 10. Eso significa que estoy leyendo 10 valores en mis tablas de nombres, horizontalmente. Eso significaría que mi primera columna está fuera de la pantalla, ya que solo tiene un ancho de píxeles de 8. Sin embargo, el atributo de color permanece, ya que tiene un ancho de 16.

Suponiendo que el atributo de color para toda la columna es verde, ¿estaría en lo correcto al asumir que para el usuario, los primeros 6 píxeles a la izquierda de la pantalla se verán coloreados en verde, y los 10 más a la derecha en la pantalla también estarán en verde? Entonces, ¿estaría correcto en mi suposición de que según la pantalla, la izquierda?

+2

+1 por genialidad. No tengo idea, pero te mueres por preguntar esto. –

Respuesta

2

This site Estoy seguro de que ya está muy, muy familiarizado con. Voy a prologar esto diciendo que nunca pude programar para el NES, pero tengo mucha experiencia con todo el hardware de Gameboy que se haya lanzado alguna vez y el NES comparte muchas peculiaridades, ahh, con el GB/DMG. Voy a apostar que o bien debe hacer una de algunas cosas:

  1. No desplazarse por la tabla de atributos. Asegúrate de que todos tus niveles tengan bloques de colores similares a lo largo de la dirección en que te mueves. Supongo que muchos juegos de primera generación hicieron esto.

  2. Adelante y permite el desplazamiento limitado de atributos: solo asegúrate de que las áreas donde se producen los cambios estén parcialmente compartidas en color o lo suficientemente esparcidas como para que el cambio no sea notorio.

  3. Obtenga su antiguo temporizador skool atari 2600 y programe una fecha para registrar $ 2006 al final de la actualización de HBlank para obtener el cambio de color que necesita, espere algunos tics y luego revierta durante el período de devolución de HBlank para que el borde izquierdo de la siguiente línea no se ve afectado. Tengo la sensación de que esta es la solución más utilizada, pero sin un buen emulador y paciencia, será un dolor en el trasero. También se comerá un poco en el uso general de la CPU, ya que tendrá que esperar en las interrupciones en varias líneas de escaneo para obtener su efecto.

Ojalá tuviera una respuesta más concreta para usted, pero espero que ayude un poco. Gracias a Dios que el GB/DMG tenía un sistema de desplazamiento ligeramente más avanzado. :)

+0

En realidad, no es ninguna de las anteriores. Los atributos se desplazan con sus tablas de nombres, por lo que configurar el desplazamiento es tan simple como escribir en dos registros. La mayoría de los juegos hacen sus actualizaciones de la tabla de nombres a lo largo de una [costura] (http: // wiki.nesdev.com/w/images/a/ae/SMB1_scrolling_seam.gif), que no es muy complicado en absoluto. Los juegos que se desplazan a lo largo de un eje posicionarán esta costura fuera de la pantalla, pero los juegos que se desplazan a lo largo de dos ejes (como SMB3) no tienen suficiente memoria para hacerlo y su costura está a lo largo de los bordes visibles de la pantalla. Esto hace que los bordes parezcan irregulares. – Pubby

+0

Ah, hardware antiguo y sus caprichos - gracias por este comentario. –

0

Este sitio puede ser de alguna ayuda. http://www.games4nintendo.com/nes/faq.php#4

(Búsqueda de "¿Qué pasa con $ 2005/2006?" Y comenzar a leer por esa zona.)

Básicamente, parece que es imposible conseguirlo Pixel Perfect, sin embargo los que van a ser los bits probablemente tengas que investigar.

Desearía poder ser de más ayuda.

1

Tanto Super Mario Bros. 3 como Kirby's Adventure muestran artefactos colorantes en el borde de la pantalla cuando se desplaza. Creo que ambos juegos establecen el bit que blanquea los 8 píxeles de la izquierda de la pantalla, por lo que 0-8 píxeles se verán afectados en cualquier fotograma.

Si mal no recuerdo, Kirby's Adventure siempre trata de poner las columnas con fallas de color en el lateral de la pantalla que se desplaza hacia afuera para hacerlo menos notorio. No creo que estos artefactos se puedan evitar sin cambiar a la creación de reflejos verticales, que presenta dificultades propias.

Descargo de responsabilidad: han pasado casi cinco años desde que escribí el código NES.

1

Cada tabla de nombres tiene su propia tabla de atributos, por lo que no debe haber artefactos gráficos al desplazarse de una tabla de nombres a otra. El tipo de glitching de color al que te refieres es realmente solo un problema si tu juego se desplaza tanto vertical como horizontalmente. Solo tiene dos tablas de nombres, por lo que desplazarse en ambas direcciones requiere canibalizar la pantalla visible. Hay varias soluciones a este problema, un gran resumen de los cuales se pueden encontrar en este post nesdev:

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

0

Cada NameTable tiene su propia tabla de atributos. Si limita su mundo de juego a solo dos pantallas, solo necesitará escribir las tablas de nombres y las tablas de atributos una vez. La parte difícil viene cuando intentas hacer mundos más grandes que dos pantallas. Super Mario Bros. 1 hizo esto desplazándose hacia la derecha, envolviendo todo lo necesario y representando el nivel de una columna de bloques a la vez (16 píxeles) justo antes de que esa columna apareciera a la vista. No sé cómo se podría codificar esto de manera eficiente (tenga en cuenta que solo tiene un milisegundo de tiempo vblank).