Karoshi MSX Community
05 de Julio de 2021, 12:57:11 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: ¿Mejor forma de restaurar background después de un COPY?  (Leído 5965 veces)
0 Usuarios y 1 Visitante están viendo este tema.
AxelStone
Karoshi Newbie
*
Mensajes: 36



« : 07 de Enero de 2015, 03:24:24 pm »

Lo explicaré con una imagen, es más fácil:



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?
En línea

MSX Still alive!
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #1 : 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
« Última modificación: 07 de Enero de 2015, 06:26:06 pm por assembler » En línea
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #2 : 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 :-(.
En línea

MSX Still alive!
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #3 : 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

En línea
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #4 : 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  Wink
En línea

MSX Still alive!
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #5 : 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  Huh
En línea
Imanok
Karoshi Hero
*****
Mensajes: 626


« Respuesta #6 : 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  Huh

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)
En línea
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #7 : 17 de Enero de 2015, 08:44:21 pm »

Sí señor ha funcionado, se dispone de ese espacio adicional.
En línea

MSX Still alive!
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #8 : 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.
En línea
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #9 : 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.
En línea

MSX Still alive!
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #10 : 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?
En línea

MSX Still alive!
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« Respuesta #11 : 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.
En línea
AxelStone
Karoshi Newbie
*
Mensajes: 36



« Respuesta #12 : 26 de Enero de 2015, 06:33:49 pm »

Que va no es eso, pongo captura de lo que ocurre:



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?
En línea

MSX Still alive!
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!