1
Desarrollo / Re:Problemas con scroll suave a toda pantalla
« en: Diciembre 02, 2018, 08:24:17 »
Bueno Dashiad, lo prometido es deuda... Sobre lo de dar mas libertad de movimientos al
personaje principal te cuento algo que hice en el Amiga y que puede resultarte.
Yo hice algo parecido a lo que tu buscas añadiendo al control del scroll un par de "flags". Un "flag" para
detectar el principio del mapa y otro para cuando llegas al final del mismo. Pseudograficamente seria asi :
(lo hago asi de "chapuza" porque me ha sido imposible subir un grafico, ¡me daba error!)
TAMAÑO DE LA PANTALLA DEL C-64 (PIXELS)
0 160 320
_____________________________________________________________________
| | |
|-----------------------------------------------------------------------------------------------|
| |
| DATOS DEL MAPA....... DATOS DEL MAPA ................... |
| |
| "" "" "" "" "" "" |
| O |
| "" "" "" | "" "" "" |
| /\ |
|____________________________________________________________________|
| SPRITE |
LIMITE MIN XPOS = 40 ------------------------------------- LIMITE MAX XPOS (230)
La forma que hice en su momento (creo recordar) era dar libre movimiento al personaje (que
aqui asumo que es un sprite) hasta que llegara a los limites (en este ejemplo min posx=40 y
max posx=230. Por supuesto los flags estan "reseteados" (por asi decirlo) al principio.
Cuando se llegaba a esos limites activaba el flag correspondiente (de "0 a 1" por ejemplo). La
rutina de scroll, antes que nada, chequeaba dicho flag. Si estaba a "1" (activo) saltaba al final
de la rutina, es decir, no efectuaba el scroll correspondiente. En ese momento, el joystick
(o teclado) pasaria a controlar el desplazamiento del personaje.En caso de que estuviera a "0"
ejecutaba el scroll sin problemas. Codigo ejemplo para tope minimo (x) del mapa:
Scroll_left Lda lefttop_flag ; Chequea the flag de limite minimo del map (mapx=0)
bne noScroll_left ; Esta a 1? entonces no hacer mas scroll.
jsr do_ScrollLeft ; Hacer scroll
noScroll_left rts ; Salir
Naturalmente, ese mismo flag (u otro que definas) puede controlar que el sprite se desplace
o se quede quieto (en ese momento exacto, el desplazamiento corresponderia a las rutinas
que efectuan el scroll.
Otro efecto de los valores que he puesto en el ejemplo es que como el sprite principal nunca
llega a 255 no tienes que preocuparte por controlar el X-MSB ($d010). Ademas creo que topes
maximos de 40 y 230 que tiene el ejemplo son bastante holgados para dar una gran libertad
de desplazamientos al personaje..
No se si esto te puede servir para lo que quieres hacer. Ya te dije que lo hice en el Amiga que
obviamente tiene un manejo de graficos muy diferente pero creo que la escencia es la misma.
En fin, cuentame que te parece la idea...
personaje principal te cuento algo que hice en el Amiga y que puede resultarte.
Yo hice algo parecido a lo que tu buscas añadiendo al control del scroll un par de "flags". Un "flag" para
detectar el principio del mapa y otro para cuando llegas al final del mismo. Pseudograficamente seria asi :
(lo hago asi de "chapuza" porque me ha sido imposible subir un grafico, ¡me daba error!)
TAMAÑO DE LA PANTALLA DEL C-64 (PIXELS)
0 160 320
_____________________________________________________________________
| | |
|-----------------------------------------------------------------------------------------------|
| |
| DATOS DEL MAPA....... DATOS DEL MAPA ................... |
| |
| "" "" "" "" "" "" |
| O |
| "" "" "" | "" "" "" |
| /\ |
|____________________________________________________________________|
| SPRITE |
LIMITE MIN XPOS = 40 ------------------------------------- LIMITE MAX XPOS (230)
La forma que hice en su momento (creo recordar) era dar libre movimiento al personaje (que
aqui asumo que es un sprite) hasta que llegara a los limites (en este ejemplo min posx=40 y
max posx=230. Por supuesto los flags estan "reseteados" (por asi decirlo) al principio.
Cuando se llegaba a esos limites activaba el flag correspondiente (de "0 a 1" por ejemplo). La
rutina de scroll, antes que nada, chequeaba dicho flag. Si estaba a "1" (activo) saltaba al final
de la rutina, es decir, no efectuaba el scroll correspondiente. En ese momento, el joystick
(o teclado) pasaria a controlar el desplazamiento del personaje.En caso de que estuviera a "0"
ejecutaba el scroll sin problemas. Codigo ejemplo para tope minimo (x) del mapa:
Scroll_left Lda lefttop_flag ; Chequea the flag de limite minimo del map (mapx=0)
bne noScroll_left ; Esta a 1? entonces no hacer mas scroll.
jsr do_ScrollLeft ; Hacer scroll
noScroll_left rts ; Salir
Naturalmente, ese mismo flag (u otro que definas) puede controlar que el sprite se desplace
o se quede quieto (en ese momento exacto, el desplazamiento corresponderia a las rutinas
que efectuan el scroll.
Otro efecto de los valores que he puesto en el ejemplo es que como el sprite principal nunca
llega a 255 no tienes que preocuparte por controlar el X-MSB ($d010). Ademas creo que topes
maximos de 40 y 230 que tiene el ejemplo son bastante holgados para dar una gran libertad
de desplazamientos al personaje..
No se si esto te puede servir para lo que quieres hacer. Ya te dije que lo hice en el Amiga que
obviamente tiene un manejo de graficos muy diferente pero creo que la escencia es la misma.
En fin, cuentame que te parece la idea...