Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: x1pepe en 15 de Enero de 2006, 12:52:29 pm



Título: Una de SPRITES
Publicado por: x1pepe en 15 de Enero de 2006, 12:52:29 pm
Tengo la pretensión de visualizar un SPRITE en la pantalla. He realizado el diseño con TinySprite http://jannone.org/msx/tinysprite.html,de los cuatro SLOTS disponibles, he utilizado en mi dibujo el nº3 y nº4, luego he exportado en BASIC y el resultado lo he copiado al programa de prueba en BASIC. No me da ningun error pero no se ve nada en la pantalla sólo el fondo azul.

Código:
10 SCREEN 2,0
20 FOR I=1 TO 32
30 READ A$
40 A=VAL("&H"+A$)
50 S$=S$+CHR$(A)
60 NEXT I
70 SPRITE$(1)=S$
80 PUT SPRITE1, (128,96),1,1
90 GOTO 90
100 REM COLOR 1
110 DATA
...
120 REM COLOR 8
130 DATA
...
140 REM COLOR 13
150 DATA
(no he incluído los datas)

Llevo un buen rato haciendo todo tipo de combinaciones raras  cmptr:) y no doy con el fallo. Me podéis dar una ayudita?



Título: Re: Una de SPRITES
Publicado por: pitpan en 15 de Enero de 2006, 01:17:58 pm
Hay un problema de partida básico: al hacer SCREEN 2,0 indicas que los sprites sean de 8x8 y, sin embargo, estás copiando 32 bytes, por lo que entiendo que definiste un sprite de 16x16. Prueba a usar SCREEN 2,2 para indicar sprites de 16x16.

Además, te recomiendo que copies los datos a VRAM con VPOKE en lugar de usar la chapuza de las cadenas de caracteres y el comando SPRITE$(n). Simplemente, tendrías que sustituir el código por

Código:
10 SCREEN 2,2
20 FOR I=0 TO 31
30 READ A$
40 A=VAL("&h"+A$)
50 VPOKE 14336+I,A
60 NEXT
70 PUT SPRITE 0,(128,96),1,0
80 GOTO 80
90 DATA ....

Como verás, he movido los índices para que empieces con el patrón de sprites número 0. Si los DATAs están bien, no tendrás ningún problema. De todos modos, plantéate pasarte al ensamblador tan pronto como puedas :)


Título: Re: Una de SPRITES
Publicado por: Darth_Fistro en 15 de Enero de 2006, 01:34:14 pm
Edu siempre tan duro con los usuarios de basic  ;D En cuanto huele a lenguaje de alto nivel ya te quiere pasar al lado oscuro  ;D

x1pepe,pienso que si eres capaz de esbozar un algoritmo con cierta tranquilidad, igual te viene mejor pasar directamente al basic. El hacer gráficos y sonido ya es cuestión de aprenderse tablitas y cómo funciona el vdp y demás, pero teniendo los fundamentos, eso es cuestión de documentación.

Ahora, si no tienes ni papa de programar, entonces veo el asm muy "heavy" para los comienzos.

Como bien te ha dicho Robsy, a partir de 14336 comienza la tabla de sprites tanto en screen 1 como en 2. Si son sprites de 8x8 (con el comando screen ,0) el sprite 0 estará en 14336, el 1 en 14344 y así de 8 en 8. Si es de 16x16 (con screen ,2), ocupará cada uno 32 bytes y por tanto en 14336 el número 0, en 14368, etc. Tienes hasta la 16383, o sea que si usas sprites de 8x8 podrías meter hasta 256, y 64 en caso de usar sprites de 16x16 (ocupa cuatro veces los de 8x8).

Y sigue la recomendación de escribir en vram directamente con el comando vpoke.

for i=1 to "número de sprites x8 o x32 según el caso"
read a
vpoke i,a
next

Sencillito y directo.  ;)


Título: Re: Una de SPRITES
Publicado por: x1pepe en 15 de Enero de 2006, 04:48:45 pm
Muchas gracias por el ejemplo Robsy
Citar
De todos modos, plantéate pasarte al ensamblador tan pronto como puedas
, lo reconozco, el ASM es mucho más rápido y explota más el MSX, pero pienso que el BASIC es un buen comienzo para hacer un primer juego.

Citar
Edu siempre tan duro con los usuarios de basic  Grin En cuanto huele a lenguaje de alto nivel ya te quiere pasar al lado oscuro  Grin
Teneis razón, si salgo bién de ésta, puede que el próximo sea en ASM  ;)

El caso es que la cosa sigue sin ir. Quiza debería haber puesto el código entero, allá va:

Código:
10 SCREEN 2,2
20 FOR I=0 TO 15
30 READ A$
40 A=VAL("&h"+A$)
50 VPOKE 14336+I,A
60 NEXT
70 PUT SPRITE 0,(128,96),1,0
80 GOTO 80
90 DATA &HC0, &H60, &H38, &H0C, &H06, &H03, &H01,
 &H01, &H03, &H06, &H0C, &H18, &H30, &H60, &H40,
 &HC0, &H01, &H03, &H06, &H1C, &H30, &H60, &HC0,
&H80, &HC0, &H60, &H30, &H10, &H18, &H0C, &H06,
&H03

el dibujo es un X de color rojo. Los data deberían de estar bien, por lo menos los he pegado aquí directamente, pero en mi MSX no funciona.


Gracias de nuevo  :-[


Título: Re: Una de SPRITES
Publicado por: pitpan en 15 de Enero de 2006, 04:58:35 pm
Pues no me extraña que no te funcione  ;)

Estás tratando de cargar como sprites datos con la forma &h&h00, con lo cual el pobre MSX se hace un lío. Lo del VAL y el "&h" está muy bien cuando los datos los pones en los DATAs sin indicar &h. Si los DATAs ya tienen el prefijo adecuado, el programa es aún más sencillo:

Código:
10 SCREEN 2,2
20 FOR I=0 TO 31
30 READ A
40 VPOKE 14336+I,A
50 NEXT
60 PUT SPRITE 0,(128,96),1,0
70 GOTO 70
80 DATA &HC0, &H60, &H38, &H0C, &H06, &H03, &H01,&H01, &H03, &H06, &H0C, &H18, &H30, &H60, &H40,&HC0, &H01,&H03, &H06, &H1C, &H30, &H60, &HC0,&H80, &HC0, &H60, &H30, &H10, &H18, &H0C, &H06,&H03

Al loro con los cambios: para un sprite de 16x16 se usan 32 bytes y no 16, como ponías en tu código. Ahora sí te funcionará.


Título: Re: Una de SPRITES
Publicado por: x1pepe en 15 de Enero de 2006, 06:07:34 pm

Muchas gracias por vuestra paciencia  ;) , ahora sí que funciona  beer:)


Título: Re: Una de SPRITES
Publicado por: pitpan en 15 de Enero de 2006, 06:15:44 pm
Y aunque hace mucho que no hago nada en BASIC, algunos truquitos sí que recuerdo.

Prueba a hacer

0 DEFINT A-Z

Para ganar algo de velocidad. Y si quieres copiar muchos datos a VRAM rapidito, te conviene usar DEFUSR=&h41:A=USR(0) y DEFUSR=&h44:A=USR(0) para activar/desactivar la pantalla (o al revés, que no me lo sé de memoria).


Título: Re: Una de SPRITES
Publicado por: x1pepe en 15 de Enero de 2006, 06:27:43 pm
                                   
Gracias de nuevo.   ;)


Título: Re: Una de SPRITES
Publicado por: Jon_Cortazar en 16 de Enero de 2006, 10:35:15 pm
x1pepe, ánimo con el BASIC!!!

Te paso un ejemplo de cómo definir y mover caracteres en SCREEN 2 (era del antiguo foro, y lo he recuperado).

Código:
10 REM Inicializo SC2
20 DEFINTA-Z:COLOR15,1,1:SCREEN2,2,0
30 REM Pongo 0 en toda la pantalla
40 FORN=6144TO6911:VPOKEN,0:NEXTN
50 REM Redefino caracteres 3 bancos
60 FORN=776TO879:READA:VPOKEN,A:VPOKEN+2048,A:VPOKEN+4096,A:NEXTN
70 REM Redefino colores 3 bancos
80 FORN=8968TO9071:READA:VPOKEN,A:VPOKEN+2048,A:VPOKEN+4096,A:NEXTN
90 REM * Descomprime y pinta maze *
100 FORN=0TO79:READA:A$=RIGHT$("0000000"+BIN$(A),8):FORM=1TO8
110 VPOKE6144+(N*8)+(M-1)+64,ASC(MID$(A$,M,M))+57:NEXTM:NEXTN
120 READX,Y:VPOKE6144+X+(Y*32),107
130 REM Inicia personaje
140 READP:D=5:PO=P:M=0
150 REM Control
160 A=STICK(0):L=0:V=0
170 IFA=1THEND=1:P=P-32:L=1
180 IFA=3THEND=3:P=P+1:L=1
190 IFA=5THEND=5:P=P+32:L=1
200 IFA=7THEND=7:P=P-1:L=1
210 M=M+1:IFM=2THENM=0
220 IFVPEEK(P)=106THENP=PO:L=0
230 IFVPEEK(P)=107THENV=1
240 VPOKEP,96+D+M:IFL=1THENVPOKEPO,0:PO=P
250 FORT=1TO10:NEXTT
260 IFV=1THEN GOTO 290
270 GOTO 160
280 GOTO280
290 REM Victoria
300 FORT=1TO10:FORM=0TO1:VPOKEP,108+M:FORN=1TO50:NEXTN:NEXTM:NEXTT:END
310 ' Patterns
320 DATA &h18,&h38,&h18,&h3C,&h5A,&h18,&h10,&h10,&h00,&h18,&h38,&h18,&h7E,&h18,&h08,&h08
330 DATA &h18,&h1C,&h18,&h38,&h3C,&h18,&h18,&h1C,&h00,&h18,&h1C,&h18,&h1E,&h18,&h24,&h36
340 DATA &h18,&h38,&h18,&h3C,&h5A,&h18,&h10,&h10,&h00,&h18,&h38,&h18,&h7E,&h18,&h08,&h08
350 DATA &h18,&h38,&h18,&h1C,&h3C,&h18,&h18,&h38,&h00,&h18,&h38,&h18,&h78,&h18,&h24,&h6C
360 DATA &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00
370 DATA &h81,&h7D,&hEE,&h7E,&hDC,&hFA,&hFE,&h6C,&hFF,&h81,&h81,&h81,&h81,&h81,&h81,&hFF
380 DATA &h18,&h38,&h99,&h7E,&h18,&h18,&h24,&h66,&h00,&h18,&h38,&h99,&h7E,&h18,&h24,&h66
390 ' Colors
400 DATA &h80,&h80,&hA0,&hC0,&hC0,&h40,&h40,&h60,&h60,&h80,&h80,&hA0,&hC0,&h40,&h40,&h60
410 DATA &h80,&h80,&hA0,&hC0,&hC0,&h40,&h40,&h60,&h80,&h80,&h80,&hA0,&hC0,&h40,&h40,&h60
420 DATA &h80,&h80,&hA0,&hC0,&hC0,&h40,&h40,&h60,&h60,&h80,&h80,&hA0,&hC0,&h40,&h40,&h60
430 DATA &h80,&h80,&hA0,&hC0,&hC0,&h40,&h40,&h60,&h80,&h80,&h80,&hA0,&hC0,&h40,&h40,&h60
440 DATA &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00
450 DATA &h60,&h90,&h90,&h90,&h90,&h80,&h80,&h60,&hF0,&hF0,&h70,&h70,&h50,&h50,&h40,&h40
460 DATA &h80,&h80,&hA0,&hC0,&hC0,&h40,&h40,&h60,&h80,&h80,&h80,&hA0,&hC0,&h40,&h40,&h60
470 ' Map
480 DATA &hff,&hff,&hff,&hff,&ha1,&h11,&h00,&h01,&hbd,&h15,&h7f,&hdd,&h81,&h15,&h40,&h55
490 DATA &hfd,&h14,&h5f,&h55,&h85,&h15,&hd1,&h55,&hf1,&h75,&h1d,&h05,&h9d,&h04,&h05,&hfd
500 DATA &h81,&hfd,&h7c,&h05,&h9f,&h11,&h41,&hfd,&hb0,&h57,&h5f,&h01,&h87,&hd0,&h50,&h7d
510 DATA &hfc,&h57,&hd7,&hc5,&h81,&hd0,&h14,&h15,&haf,&h07,&hd5,&hf1,&ha8,&h20,&h54,&h1f
520 DATA &haa,&hbf,&h05,&hc1,&hba,&ha5,&hfd,&h7d,&h82,&ha0,&h00,&h01,&hff,&hff,&hff,&hff
530 DATA 9,4,6241


Título: Re: Una de SPRITES
Publicado por: Darth_Fistro en 16 de Enero de 2006, 10:48:44 pm
Ahora sí que tengo un buen motivo para publicar las tablas comparativas de velocidad en basic. ¡Truquitos para los basiqueros!  :D Tendré que ir "maquetando" la cosa  ;)


Título: Re: Una de SPRITES
Publicado por: x1pepe en 17 de Enero de 2006, 12:30:16 am
Muchísimas gracias, este código es música para mis ojos  beer:) .


Título: Re: Una de SPRITES
Publicado por: pitpan en 17 de Enero de 2006, 12:32:12 am
Pues yo hice lo contrario: una serie de programas de ejemplo para convencer a la gente de que había que usar ensamblador en lugar de BASIC. El más visual presentaba 32 sprites de 16x16 en pantalla en movimiento. En BASIC, incluso VPOKEando, se arrastraba. En ensamblador, la velocidad era brutal - de hecho, no se podían seguir con la vista si no se frenaba con algún HALT.

En ensamblador, ningún ordenador es lento.  ;D


Título: Re: Una de SPRITES
Publicado por: Jon_Cortazar en 17 de Enero de 2006, 10:02:37 am
Sin duda, el ensamblador es lo mejor.

Pero usando el BASIC de reentrada y vpokeando puedes habituarte a las direcciones que luego usarás en un futuro. Yo primero empecé con el BASIC y luego le pegué al ensamblador. Eso sí, un mapa de memoria de VRAM te vendría de perlas para agilizar esos PUT SPRITES y cambiarlos por simples vpokes.

Propongo: ¿que os parece un concursillo de progamas en BASIC? (MSX Basic 1.0, prohibido usar rutinas CM, max...)
¿os molaría?.

Espero respuesta para empezar a organizarlo!!! :)


Título: Re: Una de SPRITES
Publicado por: Harrison en 17 de Enero de 2006, 10:33:37 am
Pero sin copiar listados de revistillas eennn  cmptr:)


Título: Re: Una de SPRITES
Publicado por: Darth_Fistro en 17 de Enero de 2006, 03:23:36 pm
Magnífico, Jon, ¡me apunto!  :D

Ahhh... un lugar donde a los programadores en basic se nos respetase y no se nos dijese "hmmmm... ta mu bien, pero sería más rápido y tal...", jajajajaja  ;D


Título: Re: Una de SPRITES
Publicado por: jltursan en 17 de Enero de 2006, 03:33:29 pm
Citar
Espero respuesta para empezar a organizarlo!!!

Pues a la voz de ¡ya!. Seguro que se puede recopilar un montón de información interesante.  :)


Título: Re: Una de SPRITES
Publicado por: x1pepe en 17 de Enero de 2006, 09:49:46 pm
Espero no haber sido el responsable de este alboroto, pero estoy muy contento y MUY animado,  cmptr:) ARGHHHFF cmptr:) . Creo que vosotros podéis aportar mucho.

 :god: :god: :god: ANIMO!!!  :god: :god: :god: