Zx Spectrum: rutina en ensamblador para manejar SPRITES

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor Bubu » 19 Nov 2018, 20:43

Sí, torpedo, es un auténtico jaleo, pero es un jaleo que me gusta, y es que si uso una rutina que ya esté hecha (cosa que ya he intentado) primero que no aprendo, y segundo que no se adapta bien a los desarrollos de cada uno.
Lo de los "dirty rectangles" esos ya los estaba usando yo, pero nu sabía que se llamaban así. Efestivamente yo sólo memorizo el trozo de fondo sobre el que se está pintando el sprite. Cuando quiero cambiar el sprite, entóns recupero ese trozo de fondo y endiño encima el sprite.
Esa mezcla la he intentado hacer con XOR, pero queda bastante fea a mi gusto. He probado con OR y mejora muchísimo. Pero eso sí, para restaurar hay que estar redibujando el fondo como bien dices.

Yo creo que tengo ya claros todos los concestos, salvo un temita: la colisión de 2 sprites. Si A está encima de B, y B está encima del fondo, cuando cambie B voy a restaurar el fondo cuando no estaba A, y eso es un poblema. Nu sé si me explico...
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 396
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 138 veces
Contactar:

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor explorer » 19 Nov 2018, 23:13

Efectivamente, Bubu, podrías colocar el pintado en la interrupción, pero puede darse el caso que comenta Namek de desborde de cuadro.

Por eso te comenté unos mensajes atrás la técnica de "lista de tareas", que he visto recientemente en un juego de la 2600.

La idea es clara, pero puede ser liosa de implementar. Pero al mismo tiempo libera al programador de ciertos problemas.

La vuelvo a poner aquí: en el bucle principal te ocupas de mover y actualizar el aspecto de los sprites, dejando apuntada la tarea de pintado a la rutina de interrupción. Así lo haces con todas las partes que requieran actualizarse en pantalla.

En la rutina de interrupción repasas todas las tareas que tienes que hacer: recuperación del fondo, borrado, pintado de sprite... hasta se podría poner lo de tocar sonido. Y... para evitar lo que comentan Mamek y jitursan, de desborde de cuadro, lo que yo he visto en ese programa es que la rutina de interrupción lleva la cuenta de los ciclos (de forma aproximada) que lleva cada tarea, de tal manera que si no le da tiempo a terminar todas las tareas en ese cuadro, deja las pendientes para el siguiente cuadro.

De forma más específica: intenta realizar las tareas que se le mandan, pero sin tener que agotar todos los recursos de la CPU (podríamos tener centenares de sprites en la pantalla, pero apenas tendríamos tiempo para actualizar sus posiciones/colisiones). Si no hay tiempo, se deja para la siguiente interrupción. La consecuencia es que hay momentos del juegos en que los sprites se actualizan a 50 cps, pero en otros momentos baja a 25 cps o incluso 20 cps. Mientras el motor de juego se ejecute a una velocidad constante, no importa "mucho" que de vez en cuando algún sprite aparezca "roto" por algún sprite que pase por encima de él.

El caso más especial e impresionante que he visto de este truco es el juego de arcade Defender.

Si lo arrancas con el MAME, pulsas el tabulador para sacar el panel de control, vas a "Slider control" y le subes el Overclock CPU a 140 % o incluso más.

En una situación normal, cuando el procesador se queda sin tiempo para pintarlo todo (creo recordar que había un límite de 60 elementos gráficos en pantalla), lo que hace es "teletransportar" a los enemigos que no le da tiempo a pintar "al otro lado" del escenario, que es un truco que suelen usar los jugadores más profesionales: cuentan que muchos enemigos desaparecerán en situaciones de más estrés de la máquina.

Pero... aumentando la velocidad de CPU, el resultado es espectacular. El juego no va el doble de rápido. Lo que vemos es que le da tiempo al procesador a pintar todos los detalles, y por lo tanto, no desaparecen los sprites, y el juego se vuelve mucho más fluido (y difícil, al no desaparecer los enemigos).
Última edición por explorer el 20 Nov 2018, 00:58, editado 1 vez en total.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor Namek » 20 Nov 2018, 00:35

Bubu escribió:Yo creo que tengo ya claros todos los concestos, salvo un temita: la colisión de 2 sprites. Si A está encima de B, y B está encima del fondo, cuando cambie B voy a restaurar el fondo cuando no estaba A, y eso es un poblema. Nu sé si me explico...
La tecnica habitual es:

1.- Copiar los cuadros del fondo que se van a preservar antes de pintar nada.
2.- Se dibujan los Sprites.
3.- Se calculan nuevas posiciones.
4.- Se espera el barrido vertical
5.- Se recuperan los cuadros preservados para borrar los sprites, y vuelta a empezar...

De esta forma da igual si se pisan los sprites o no, aunque esta tecnica va mejor con doble buffer.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor Bubu » 23 Nov 2018, 23:45

Gracias, torpedos. Voy a por ello.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor Bubu » 07 Dic 2018, 21:07

Hay algo que me inquieta... Cuando en pantalla hay 2 ó más sprites, y además estos pueden colisionar, hay que tener un buffer del background COMPLETO, ¿nor? Pienso que así por lo siguiente: si sólo guardo el trozo de background donde tengo mis sprites, entóns, cuando un sprite se vaya a mover a un cuadro donde haya otro sprite, ¿qué fondo guardo ahora?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Zx Spectrum: rutina en ensamblador para manejar SPRITES

Mensajepor Namek » 08 Dic 2018, 10:49

Bubu escribió:Hay algo que me inquieta... Cuando en pantalla hay 2 ó más sprites, y además estos pueden colisionar, hay que tener un buffer del background COMPLETO, ¿nor? Pienso que así por lo siguiente: si sólo guardo el trozo de background donde tengo mis sprites, entóns, cuando un sprite se vaya a mover a un cuadro donde haya otro sprite, ¿qué fondo guardo ahora?
Ya te explique esto en un post anterior, primero se guardan todos los fondos sin ningún sprite pintado.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados