Estoy tratando de desarrollar un videojuego de estilo NES antiguo, con parpadeo de sprites y desaceleración gráfica. He estado pensando en qué tipo de lógica debería usar para habilitar tales efectos.Emulando el parpadeo de los sprites de la vieja escuela (teoría y concepto)
que tienen en cuenta las siguientes restricciones si quiero ir de la vieja escuela estilo NES:
- no más de 64 sprites en la pantalla a la vez
- No más de 8 sprites por línea de escaneo, o para cada línea en el eje y
- Si hay demasiada acción va en la pantalla, el sistema se congela la imagen de un marco para que el procesador de ponerse al día con la acción
Por lo que he leído, si hubiera más de 64 sprites en la pantalla, el desarrollador solo dibujaría sprites de alta prioridad sin tener en cuenta los de baja prioridad. También podrían alternar, dibujando cada sprite par en marcos opuestos de los impares.
El problema de la exploración es interesante. A partir de mis pruebas, es imposible obtener una buena velocidad en el XBOX 360 XNA framework dibujando sprites píxel por píxel, como hizo el NES. Es por eso que en los juegos de la vieja escuela, si había demasiados sprites en una sola línea, algunos aparecerían si se redujeran a la mitad. Para todos los propósitos de este proyecto, estoy haciendo que las líneas de exploración tengan 8 píxeles de alto y que agrupen a los sprites por escaneo según su posición en Y.
Para aclarar, dibujaría sprites en la pantalla en lotes de 8x8 píxeles, no 1x1.
Así, callados que necesito para llegar a una solución que ....
- 64 sprites en pantalla a la vez
- 8 sprites por 'línea de barrido'
- Puede dibujar sprites basado en prioridad
- puede alternar entre sprites por trama
- Emulate desaceleración
aquí está mi teoría actual
Primero y ante todo, una idea fundamental que se me ocurrió es hacer frente a la prioridad de sprites. Suponiendo valores entre 0-255 (0 siendo baja), puedo asignar niveles de prioridad sprites, por ejemplo:
- 0 a 63 siendo bajo
- 63-127 ser medio
- 128-191 siendo alta
- 192 a 255 con una antigüedad máxima
Dentro de mis archivos de datos, que puede asignar a cada sprite para ser una cierta prioridad. Cuando se crea el objeto principal, se le asigna aleatoriamente un número entre su rango designado. Luego dibujaba los sprites en orden de mayor a menor, con el objetivo final de dibujar cada sprite.
Ahora, cuando un sprite se dibuja en un marco, lo generaría aleatoriamente un nuevo valor de prioridad dentro de su nivel de prioridad inicial. Sin embargo, si un sprite no se dibuja en un marco, podría agregar 32 a su prioridad actual. Por ejemplo, si el sistema solo puede dibujar sprites hasta un nivel de prioridad de 135, se puede dibujar un sprite con una prioridad inicial de 45 después de 3 cuadros sin dibujar (45 + 32 + 32 + 32 = 141)
Esto, en teoría, permitiría a los sprites alternar fotogramas, permitir niveles de prioridad y limitar sprites a 64 por pantalla.
Ahora, la pregunta interesante es ¿cómo limito los sprites a solo 8 por scanline?
Estoy pensando que si estoy clasificando los sprites de alta prioridad a baja prioridad, repite el ciclo hasta que haya dibujado 64 sprites. Sin embargo, no debería simplemente tomar los primeros 64 sprites en la lista.
Antes de dibujar cada elemento, pude comprobar cuántos sprites se dibujaron en su respectiva línea de exploración a través de variables de contador. Por ejemplo:
- Y-valores entre 0 y 7 pertenecen a la línea de exploración 0, scanlineCount [0] = 0
- Y-valores entre 8 a 15 pertenecen a la línea de exploración 1, scanlineCount [1] = 0
- etc.
Podría restablecer los valores por línea de escaneo para cada trama dibujada. Mientras baja por la lista de sprites, agregue 1 al contador respectivo de la exploración si un sprite se dibuja en esa línea de exploración. Si es igual a 8, no dibuje ese sprite e ir al sprite con la siguiente prioridad más baja.
SLOWDOWN
Lo último que necesito hacer es emular desaceleración. Mi idea inicial fue que si estoy dibujando 64 sprites por cuadro y todavía hay más sprites que necesitan ser dibujados, podría pausar el renderizado en 16ms más o menos. Sin embargo, en los juegos de NES que he jugado, a veces hay desaceleración si no hay ningún parpadeo de los sprites, mientras que el juego se mueve maravillosamente, incluso si hay algo de parpadeo de los sprites.
Quizás otorgue un valor a cada objeto que use sprites en la pantalla (como los valores de prioridad anteriores), y si los valores combinados de todos los objetos w/sprites superan un umbral, ¿introduce desaceleración?
En conclusión ...
hace todo lo que escribí en realidad suena legítimo y podía trabajar, o se trata de una quimera? ¿Qué mejoras pueden posiblemente pensar con esta teoría de programación de juegos?
todo esto es genial, y tienes mi +1 por ser exhaustivo ... pero ¿hay * una pregunta * aquí? –
+1 porque lograste que mi lo leyera todo. –
En "En conclusión". :) Pregunté si esto sonaba legítimo y si podría funcionar o si podría haber mejoras en mi teoría. Considero que esto es un problema, porque expuse mis objetivos y mi teoría actual para obtenerlos, y estoy pidiendo consejos sobre cómo hacerlo: D –