Scrolles

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 7:39 pm

Hay un truco muy bueno para hacer scrolles que es el que usa Cobra (también experimenté con él cuando probaba mis rutinas de sprites) que consiste en sincronizarte con la primera línea de pantalla (cuando se acaba el borde superior), más o menos sobre el ciclo 14300. Esta sincronización se hace leyendo le puerto $FF hasta encontrar un valor distinto de $FF.

Pues bien, una vez estés sincronizado lanzas tu rutina de scroll. Tiene que ser código de duración fija, hay que pintar las líneas en el mismo orden en que ocurre el raster y lo más importante, tienes que ser igual de rápido o un pelín más lento que el haz de electrones para asegurarte de que siempre escribes detrás de él. Una vez has pintado es scroll lanzas tus rutinas de pintado de sprites que seguro que no tendrás parpadeos. Si reduces el tamaño de pantalla scrollable lo suficiente (50% del área total) puedes conseguir 50fps sin problemas.
Ultima edición por antoniovillena el Mar May 06, 2014 7:45 pm, editado 1 vez en total
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 7:45 pm

Aquí está la demo que te comentaba, no tiene scroll pero se genera el fondo completo en cada frame. Va a 50fps y se pueden mover 12 sprites por pantalla.

http://www.mojontwins.com/mojoniaplus/v ... 4&start=10
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor wilco2009 el Mar May 06, 2014 8:02 pm

¿Y no se puede utilizar ese método teniendo una segunda pantalla a modo de shadow screen (sin serlo) y pintar los sprites sobre esa shadow?

Luego se lanza la rutina de pintado sincronizada con el barrido de pantalla y listo.
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 8:19 pm

Se puede pero no ganas nada. Tardas el doble de tiempo porque primero tienes que pintar el scroll, luego los sprites y finalmente volcar a la pantalla principal.
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor wilco2009 el Mar May 06, 2014 9:15 pm

Sí puedes ganar si no pretendes ir a 50 fps, ya que tienes tiempo de pintar muchos más sprites sin agobiarte por el parpadeo.
Avatar de Usuario
wilco2009
Freddy Hardest
 
Mensajes: 542
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 9:28 pm

Este método es para que lo que pintes no se vea en pantalla, por eso pintamos detrás del haz de electrones. Lo que buscas volcando el buffer es todo lo contrario, que lo que pintemos se vea. En este caso el lugar de sincronizar en el ciclo 14300 es mejor (y más fácil) hacerlo en el ciclo cero, te vale con un HALT (o una interrupción IM2). Eso sí, si la rutina de volcado es muy lenta te puede alcanzar el haz de electrones (empiezas con 14300 ciclos de ventaja).
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor climacus el Mar May 06, 2014 9:52 pm

antoniovillena escribió:Hay un truco muy bueno para hacer scrolles que es el que usa Cobra (también experimenté con él cuando probaba mis rutinas de sprites) que consiste en sincronizarte con la primera línea de pantalla (cuando se acaba el borde superior), más o menos sobre el ciclo 14300. Esta sincronización se hace leyendo le puerto $FF hasta encontrar un valor distinto de $FF.

Pues bien, una vez estés sincronizado lanzas tu rutina de scroll. Tiene que ser código de duración fija, hay que pintar las líneas en el mismo orden en que ocurre el raster y lo más importante, tienes que ser igual de rápido o un pelín más lento que el haz de electrones para asegurarte de que siempre escribes detrás de él. Una vez has pintado es scroll lanzas tus rutinas de pintado de sprites que seguro que no tendrás parpadeos. Si reduces el tamaño de pantalla scrollable lo suficiente (50% del área total) puedes conseguir 50fps sin problemas.


Buff!! Algo de esto he leido en WOS pero con el ingles no me enteraba mucho.

Lo de pintar el fondo siguiendo el raster tiene pinta de ser complicadillo...
Y la rutina de pintado de sprites superrapida. Sabes si Cobra usa sprites prerrotados?
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php
Avatar de Usuario
climacus
Sabreman
 
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 10:02 pm

Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor susso el Mar May 06, 2014 10:19 pm

Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization



Enviado con Tapatalk
susso
Jack The Nipper
 
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: Scrolles

Notapor climacus el Mar May 06, 2014 10:24 pm

antoniovillena escribió:Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.


Ya decia yo que iba muy deprisa todo! Ya me has picado para hacer una rutina de sprites prerrotados. :)

Creo que el raster va linea a linea de izquierda a derecha. Osea, que en vez de pintar tile a tile completo hay que pintar el primer scan del tile de la izquierda, el primer scan del de su derecha y asi sucesivamente, no?

Pero creo recordar que en Cobra se vuelca el fondo a base de PUSHes, por lo que el proceso es a la inversa...
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php
Avatar de Usuario
climacus
Sabreman
 
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Notapor susso el Mar May 06, 2014 10:26 pm

Del video estoy viendo líneas de tiles igual a la anterior, no se si lo habrás implementado, sería interesante que haya una rutina que según la posición del mapa compruebe eso, entonces en vez de mirar los datas del mapeado duplique directamente de vram la línea de tiles repetidos a la línea de abajo,


Enviado con Tapatalk
susso
Jack The Nipper
 
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: Scrolles

Notapor antoniovillena el Mar May 06, 2014 10:28 pm

susso escribió:Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization


Interesante. Pero podrían optimizar esto:

Código: Seleccionar todo
foo:
  ld hl, data
  call bar      ; Run routine once
  call bar      ; .. twice
  call bar      ; .. three times
bar:
  ld a, (hl)    ; .. fourth and final time
  inc l
  and $0F
  out (c), a
  ret


Por esto otro:
Código: Seleccionar todo
foo:
  ld hl, data
  call bar1
bar1:
  call bar2
bar2:
  ld a, (hl)
  inc l
  and $0F
  out (c), a
  ret
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1162
Registrado: Dom Ene 09, 2011 9:55 am

Re: Scrolles

Notapor susso el Mar May 06, 2014 10:37 pm

Pues si, el tuyo es anidado, esa es la lógica de C. XD


Enviado con Tapatalk
susso
Jack The Nipper
 
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: Scrolles

Notapor susso el Mar May 06, 2014 10:39 pm

Espera, espera.. Tienes más saltos y más returns. Hay más ciclos.


Enviado con Tapatalk
susso
Jack The Nipper
 
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: Scrolles

Notapor zx81 el Mar May 06, 2014 10:44 pm

climacus escribió:
antoniovillena escribió:Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.


Ya decia yo que iba muy deprisa todo! Ya me has picado para hacer una rutina de sprites prerrotados. :)

Creo que el raster va linea a linea de izquierda a derecha. Osea, que en vez de pintar tile a tile completo hay que pintar el primer scan del tile de la izquierda, el primer scan del de su derecha y asi sucesivamente, no?

Pero creo recordar que en Cobra se vuelca el fondo a base de PUSHes, por lo que el proceso es a la inversa...


El raster va, efectivamente, de izquierda a derecha y de arriba a abajo. Para pintar sin que se vea, puedes ir por detrás del raster, o si te da tiempo, aprovechar momentos en medio. Una línea de raster dura 224 t-estados de CPU en el 48k (228 en los demás). El primer pixel se pinta en pantalla 14336 t-estados después de la interrupción. Antes de eso está el borde, lo mismo que tras 57248 t-estados, que es donde empieza el borde inferior (recuerda, todo lo que digo son timings del 48k). Un frame completo son 69888 t-estados.

Cada línea de raster necesita los primeros 128 t-estados de los 224 que dura, así que al final de cada una te quedan 96 t-estados, difíciles de aprovechar, pero posible en teoría. Para hacerlo por PUSH, podrías esperar al estado 57248 y así tendrías 26976 t-estados para actualizar (gestión de la interrupción aparte).

El arkanoid, por ejemplo, dibuja la bola alrededor del t-estado 400 y la borra sobre los 57000. De esa forma, el movimiento de la bola es absolutamente suave.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator
zx81
Freddy Hardest
 
Mensajes: 592
Registrado: Vie Dic 28, 2007 3:14 pm
Ubicación: Valencia

PrevioSiguiente

Volver a Programación y nuevos desarrollos

¿Quién está conectado?

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