Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: AxelStone en 07 de Enero de 2015, 03:24:24 pm



Título: ¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 07 de Enero de 2015, 03:24:24 pm
Lo explicaré con una imagen, es más fácil:

(http://i58.tinypic.com/n48mls.png)

Tengo la figura de Cody caminando y para restaurar el fondo a su paso tengo que:
1.- Guardar el background original
2.- En una página de video no visible copio en este orden:
   1. El trozo de background que pisa Cody
   2. El muñeco de cody
3.- El resultado, lo traigo a la página visible.

Veo que estoy haciendo muchos copys y además necesito una página vacía para componer el resultado. Si no lo hago así, y pego directamente sobre la página 0 el trozo de background y después Cody tengo un efecto "parpadeo" en Cody muy feo. ¿Hay alguna forma de trabajar directamente sobre 0 sin tener parpadeo y así ahorro copys y VRAM?


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: assembler en 07 de Enero de 2015, 04:16:29 pm
Otra forma de hacerlo es:
-Tener dos páginas con el mismo fondo inicial.
-Con Sprite, me refiero a "Sprite Software", o "COPY"

Repetir
   -página visible 0, activa 1
   -Para cada sprite, recuperar el fondo que se copió de la página 1 (si no hay nada, por ser el primer frame en esta página, no hacemos nada)
   *En este momento, el fondo estará totalmente limpio, sin sprites, solo el fondo
   -Para cada sprite, hacer una copia del lugar donde va a ir colocado en página 1
   -Dibujar cada sprite usando una operacion logica, para que solo dibuje los pixeles que no sean cero, en página 1
   -cambio página visible 1, activa 0
   -Repetimos, pero cambiando páginas:
   -Para cada sprite, recuperar el fondo que se copió de la página 0 (si no hay nada, por ser el primer frame en esta página, no hacemos nada)
   *En este momento, el fondo estará totalmente limpio, sin sprites, solo el fondo
   -Para cada "Sprite" software, hacer una copia del lugar donde va a ir colocado en página 0
   -Dibujar cada sprite usando una operacion logica, para que solo dibuje los pixeles que no sean cero, en página 0
   -cambio página visible 0, activa 1
mientras sea necesario

En screen 5 hay hueco para 2 páginas visibles alternas, y otras dos para mantener los gráficos y zona de trabajo (dos por cada sprite en pantalla).
Eso limita bastante las posibilidades, sobre todo con sprites gigantes como Cody.


Ejemplo probado en BASIC:
Código:
10 SCREEN 5
20 SET PAGE 2,2
30 CLS
35 REM INICIALIZAMOS EL SPRITE, ASEGURANDO QUE LO QUE NO ES SPRITE, TIENE COLOR 0
40 LINE (0,0)-(15,15),0,BF
50 FOR A=0 TO 7
60 CIRCLE(7,7),A,A
70 NEXT
75 REM CREAMOS UN FONDO TO GUAPO
80 SET PAGE 0,0
90 FOR A=1 TO 100
100 LINE-(RND(1)*255,RND(1)*212),RND(1)*8+7
110 NEXT
115 REM Y LO COPIAMOS EN LA PAGINA 1
120 COPY (0,0)-(255,212),0 TO (0,0),1
130 REM INICIALIZAMOS LAS VARIABLES
140 P=0
150 XB(0)=-1:YB(0)=-1
160 XB(1)=-1:YB(1)=-1
165 REM EMPIEZA LO BUENO
170 SET PAGE 1-P,P
175 REM EN EL PRIMER FRAME DE CADA PAGINA, NO RESTAURAMOS EL FONDO
180 IF XB(P)<>-1 THEN COPY(16+16*P,0)-(31+16*P,15),2 TO (XB(P),YB(P)),P
185 REM LEEMOS EL CURSOR Y ACTUALIZAMOS X E Y EN CONSECUENCIA
190 D=STICK(0)
200 X=X-(D=2)-(D=3)-(D=4)+(D=6)+(D=7)+(D=8)
210 Y=Y-(D=4)-(D=5)-(D=6)+(D=8)+(D=1)+(D=2)
215 REM HACEMOS COPIA DEL FONDO
220 COPY (X,Y)-(X+15,Y+15),P TO (16+16*P,0),2
225 REM DIBUJAMOS EL SPRITE
230 COPY (0,0)-(15,15),2 TO (X,Y),P,TPSET
235 REM ACTUALIZAMOS LA X E Y DE COPIA DEL FONDO
240 XB(P)=X
250 YB(P)=Y
255 REM CAMBIAMOS LA PAGINA ACTIVA POR LA VISIBLE
260 P=1-P
265 REM PARA VER EL ESTADO DE LA PAGINA DE TRABAJO, CON ESPACIO
270 IF STRIG(0)=-1 THEN GOSUB 290
280 GOTO 170
290 SET PAGE 2
300 IF STRIG(0)=-1 GOTO 300
310 SET PAGE 1-P,P
320 RETURN


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 07 de Enero de 2015, 10:47:00 pm
  -Dibujar cada sprite usando una operacion logica, para que solo dibuje los pixeles que no sean cero, en página 1

Amigo, ¿qué operación es esa? Soy nuevo por estos lares ;-). La técnica que mencionas es doble buffer ¿verdad? La pega es que consumes 2 páginas para visualización y como dices con sprites grandes te quedas pronto sin memoria :-(.


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: assembler en 07 de Enero de 2015, 11:30:41 pm
La operacion Tpset se indica en el copy que dibuja el sprite. Es el de la linea 230 del ejemplo.
Si, eso seria doble buffer, y es lo mejor para evitar los parpadeos, y mas en basic, donde no tienes control de la interrupcion de dibujado de pantalla.
En el mrc explicaba kai lo que tuvo que hacer para montar los sprites del nuts: unificar graficos comunes de diferentes movimientos o dibujar en tiempo real las versiones reflejadas de los graficos...

Puestos a aprovechar, si no hay scroll, las paginas son de 256px de alto, aunque solo se ven 212, ahí tienes 44px muy chulos para usar de zona de trabajo



Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 08 de Enero de 2015, 01:40:18 pm
La operacion Tpset se indica en el copy que dibuja el sprite. Es el de la linea 230 del ejemplo.
Si, eso seria doble buffer, y es lo mejor para evitar los parpadeos, y mas en basic, donde no tienes control de la interrupcion de dibujado de pantalla.
En el mrc explicaba kai lo que tuvo que hacer para montar los sprites del nuts: unificar graficos comunes de diferentes movimientos o dibujar en tiempo real las versiones reflejadas de los graficos...

Puestos a aprovechar, si no hay scroll, las paginas son de 256px de alto, aunque solo se ven 212, ahí tienes 44px muy chulos para usar de zona de trabajo


Ah perdón, no te había entendido. Si, para que pinte las transparencias vamos. Mira lo de los 44px extras me parece genial, se pueden aprovechar para hacer ese trabajo de fondo. Gracias por la info  ;)


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: assembler en 08 de Enero de 2015, 04:06:42 pm
...acabo de probar a hacer un COPY fuera de la parte visible (en esas 44 lineas que te comenté), y machaca lo que no debe.
Supongo que no se podrá acceder a esa zona con el copy de basic  ???


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: Imanok en 09 de Enero de 2015, 11:57:43 pm
...acabo de probar a hacer un COPY fuera de la parte visible (en esas 44 lineas que te comenté), y machaca lo que no debe.
Supongo que no se podrá acceder a esa zona con el copy de basic  ???

Te irá bien echar un ojo a este manual:

http://www.konamiman.com/msx/msx2th/kunesp.txt

Ahí va un extracto que te puede ayudar:

Citar
2.4.2 - Directiva #C

La directiva "#C" se utiliza para habilitar/desabilitar el ajuste de
coordenadas. Cuando se especifica "#C+", la coordenada (vertical) se ajusta
si le produce desborde. "#C-" suprime el ajuste. El valor por defecto es
"#C+".

Ejemplo:

     10 SCREEN 2
     20 REM #C-
     30 LINE (0,0)-(255,255)
     40 ' #C+
     50 LINE (0,0)-(255,255)


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 17 de Enero de 2015, 08:44:21 pm
Sí señor ha funcionado, se dispone de ese espacio adicional.


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: Mortimer en 21 de Enero de 2015, 10:27:17 am
Genial. Por cierto, ya puestos, lo mismo te interesa poner la pantalla a 192 líneas y ganar otras 20 para espacio, además de tener menos pantalla para rellenar durante el juego.


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 24 de Enero de 2015, 05:45:36 pm
Genial. Por cierto, ya puestos, lo mismo te interesa poner la pantalla a 192 líneas y ganar otras 20 para espacio, además de tener menos pantalla para rellenar durante el juego.

Jeje 192 o menos, hay muchos juegos que usan ese truco. Por ejemplo los juegos de Hertz (Psycho World, Hydefos) usaban pantalla reducida para conseguir un scroll envidiable.


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 25 de Enero de 2015, 11:00:31 am
Vaya pues rectifico, he seguido haciendo pruebas y algo raro pasa, se dibujan artefactos en pantalla, como si esa zona de VRAM estuviera sucia. Parecen sprites hardware y aunque los deshabilito con VDP(9) siguen pintándose artefactos.

¿A qué puede deberse?


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: samsaga2 en 26 de Enero de 2015, 09:34:02 am
A lo mejor no es el caso pero cuando restaures el fondo de la otra página has de tener en cuenta que las coordenadas no son las actuales. Son las del frame anterior.


Título: Re:¿Mejor forma de restaurar background después de un COPY?
Publicado por: AxelStone en 26 de Enero de 2015, 06:33:49 pm
Que va no es eso, pongo captura de lo que ocurre:

(http://i61.tinypic.com/jr749y.png)

Donde debería aparecer ese cielo negro aparece y desaparece "basura" a medida que avanzo con el personaje. Uso la técnica del doble buffer descrita poco arriba y he descubierto que solo ocurre con la zona extendida de las páginas 0-1 (las del doble buffer), si uso la zona extendida de las páginas 2-3 no se ensucia nada.

¿Qué pueden tener esas páginas de diferentes para que fallen al usar la zona extendida?