Karoshi MSX Community
05 de Julio de 2021, 03:58:22 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] 2
  Imprimir  
Autor Tema: Como controlar la velocidad a la que se mueve un sprite  (Leído 11728 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« : 23 de Mayo de 2009, 03:43:39 pm »

Tengo un problema a la hora de controlar la velocidad a la que muevo un sprite. Es tan rápido que necesito ponerle un bucle de retardo, pero con este método se mueve a saltos y no es fluido.
Imagino que hay opciones mucho mejores, y una podría ser controlar el movimiento con el reloj del sistema, pero no sé si esto es demasiado para mi nivel ó es mas fácil de lo que creo.
¿Podéis darme ideas de como hacerlo?
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #1 : 23 de Mayo de 2009, 09:03:36 pm »

Me da que no sincronizas las cosas Wink. En ensamblador las cosas van más rápido de lo que parece, así que un HALT justo antes de retornar al bucle principal del juego suele venir bien (porque no te quiero liar con interrupciones y demás historias). Si ves que va a saltos es porque no está sincronizado. Prueba lo siguiente, que es muy fácil.

En lugar de hacer esto...

bucle:
CALL control_del_personaje
CALL pintar_sprite_en_vram
JP bucle


...trata de hacerlo así:

EI
bucle:
CALL control_del_personaje
HALT
CALL pintar_sprite_en_vram
JP bucle


HALT es una instrucción de ensamblador que lo que hace es detener la ejecución hasta que salte una interrupción. De esta forma estás asegurándote de que, si todo lo que haces ANTES del HALT es computable en un solo frame, tendrás tu juego sincronizado. Fíjate además que dejo los accesos a VRAM detrás del HALT: es lo más adecuado, ya que empezamos a pintar cuando el ultimo frame se ha pintado, así no nos pillará el barrido.

Esto es lo más simple para sincronizar un juego, usar la instrucción HALT. Otra cosa ya es entrar en las interrupciones y sus tipos, etc... pero para una sincronización sencilla esta es la forma. Eso si, asegurate de tener activadas las interrupciones antes de poner un HALT, que si no se te colgará forever (es decir, espera una interrupción, pero como no la hay, nunca retorna a la ejecución). Es el famoso "DI HALT" de SapphiRe, lol. Para activar las interrupciones, la instrucción es EI y para desactivarlas DI (por ello el EI que he puesto en el ejemplo anterior, para asegurarnos que tenemos las interrupciones activadas y que el HALT nos funcionará).

Espero que te sirva Tragamanzanas. Si el problema no es de sincronía, que es lo que parece, detállanos más la situación  Wink
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #2 : 19 de Junio de 2009, 03:45:14 pm »

Viejo_archivero, he estado off estas ultimas semanas y no he podido darte las gracias antes.
Ya tengo el movimiento mas sincronizado. Ahora que vuelvo a tener tiempo espero darle otro empujon al ensamblador. No es demasiado lo que he avanzado, pero ya no utilizo para nada el Basic, aunque no se si ahora al principio esto es bueno, ya que pierdo mucho tiempo en estructuras que no son lo que quiero aprender "por ahora", y en Basic las tendría en un momento.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #3 : 20 de Junio de 2009, 06:21:25 pm »

Desde aquí mis amino a tragamanzanas, se como se siente Smiley
No sabia esto del HALT viejo_archivero...muy util si señor. Y como no lo sabia, pues me informe de las interrups, la 38h, etc... y asi me he quedao.

Venga animo y a ver si vemos pronto cositas tuyas por aquí. ( Lo mismo me deberia decir a mi, jeje)
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #4 : 29 de Junio de 2009, 03:26:11 pm »

Tengo una duda sobre como poner la puntuación (cualquier variable) en pantalla. Cuando quiero poner el contenido de una variable en pantalla, me aparece el código ASCII de ese número, en vez del número.

De paso, si alguien me puede explicar como se ponen los sonidos (tanto de efectos como de musica de fondo) tambien estaria muy agradecido (os aviso que no tengo ni idea de musica).
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #5 : 29 de Junio de 2009, 08:27:25 pm »

Tengo una duda sobre como poner la puntuación (cualquier variable) en pantalla. Cuando quiero poner el contenido de una variable en pantalla, me aparece el código ASCII de ese número, en vez del número.

Pues eso es lo más normal, ya que es lo que haces, "vpokear" un dato 0-255 en una posición de la pantalla Wink. Para los marcadores, lo mejor es que utilices números BCD.

Robsy se hizo hace tiempo un tutorial en PDF y en español bastante bueno, que cubría todo lo relativo a números BCD e incluía rutinas para utilizar en ensamblador. La última vez que supe del robsy había subido en el vuelo 815 de Oceanic, así que si hay suerte y encuentra en uno de los bunkers de la iniciativa Dharma, tal vez se pueda conectar con algún MSX con obsonet que haya por allí y subir el PDF Grin. O si alguien lo tiene, sería muy interesante que lo pusiera aquí (yo lo tenía hace tiempo, pero no lo encuentro).


De paso, si alguien me puede explicar como se ponen los sonidos (tanto de efectos como de musica de fondo) tambien estaria muy agradecido (os aviso que no tengo ni idea de musica).

Para eso te recomiendo que utilices cualquier replayer que haya por ahí en ensamblador. Haces una música o sonido (o te lo hacen, que por aquí hay mucho fiera), y solo tienes que llamar desde el programa al replayer y la música sonará. Yo tiempo atrás, para entender como funciona el PSG me hice un pequeño replayer musical: aunque eso ya es otro cantar Wink
« Última modificación: 29 de Junio de 2009, 08:29:02 pm por Viejo_archivero » En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #6 : 03 de Julio de 2009, 01:18:23 pm »

He estado buscando por internet y no encuentro el tutorial de Robsy. Si alguien sabe donde puedo localizarlo, que me avise.
Lo que si he encontrado es como pasar un número a BCD, pero una vez que lo tenga pasado, si lo llevo a la pantalla tendré el mismo problema.

Sobre el tema del sonido, "Para eso te recomiendo que utilices cualquier replayer que haya por ahí en ensamblador", ya comenté que no tengo ni idea de este tema, si puedes especificar mas lo del replayer (un nombre por ejemplo) intenteré encontrarlo e investigaré/trastearé con el.
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #7 : 03 de Julio de 2009, 01:34:56 pm »

Lo que si he encontrado es como pasar un número a BCD, pero una vez que lo tenga pasado, si lo llevo a la pantalla tendré el mismo problema.

Pues una vez tengas el número en BCD (es decir, que cada nibble equivale a una cifra decimal), tienes que hacer una rutinilla para convertir cada nibble en un byte, para luego poder escribir en pantalla la cadena. En nuestra sección snippets, GuyveR800 posteó un snippet de código exactamente para eso: BCD2ASCII. Eso si, deberás reservar un espacio en RAM para que la rutina escriba los caracteres: luego tendrás que volcar los caracteres de esa posición a VRAM como tu quieras. Vuelvo a postear el código aquí:

Código:
; In:
; HL = Pointer to BCD string
; DE = Pointer to ASCII string
; B = Size of BCD string in bytes
BCD2ASCII:
ld a,30h
.loop:
rld
ld [de],a
inc de
rld
ld [de],a
inc de
rld
inc hl
djnz .loop
ret

De todas formas, el artículo de rosby acerca de la aritmética BCD estaba super bien, e incluia rutinas para hacer de todo bien comentadas en ensamblador. Es una pena que edu esté tan offline, le estoy mandando mails desde hace un par de semanas y ni siquiera me ha contestado: en fin, estará super liado con todo.
« Última modificación: 03 de Julio de 2009, 01:40:31 pm por Viejo_archivero » En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #8 : 03 de Julio de 2009, 01:38:56 pm »

Sobre el tema del sonido, "Para eso te recomiendo que utilices cualquier replayer que haya por ahí en ensamblador", ya comenté que no tengo ni idea de este tema, si puedes especificar mas lo del replayer (un nombre por ejemplo) intenteré encontrarlo e investigaré/trastearé con el.

Es que aquí es cuestión de gustos. Te pongo link al PT3 Player de Dioniso en el MRC, lo que no se es si estará actualizado, porque ha ido mejorándose poco a poco. Con este replayer podrás reproducir archivos PT3 en MSX, tienes el código asm en la descarga. Eso si, agradecería a Dioniso que matizara si es la última versión, que no se si en el MRC estará la descarga actualizada.
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #9 : 03 de Julio de 2009, 01:50:48 pm »

Me conecto para decir que sí estoy missing. Debo e-mails a todo el mundo, en breve tocará ración de Edu para compartir. Pero por el momento, silencio en las líneas y lectura de foros en la distancia  Sad
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #10 : 03 de Julio de 2009, 04:06:45 pm »

Me conecto para decir que sí estoy missing. Debo e-mails a todo el mundo, en breve tocará ración de Edu para compartir. Pero por el momento, silencio en las líneas y lectura de foros en la distancia  Sad
Tranquilo, socio, ya me lo suponía. Tu, a lo tuyo, ya nos contarás Malaika
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Metalbrain
Karoshi Fan
**
Mensajes: 92


Z80jutsushi


« Respuesta #11 : 03 de Julio de 2009, 06:06:00 pm »

Sobre el tema del sonido, "Para eso te recomiendo que utilices cualquier replayer que haya por ahí en ensamblador", ya comenté que no tengo ni idea de este tema, si puedes especificar mas lo del replayer (un nombre por ejemplo) intenteré encontrarlo e investigaré/trastearé con el.

Es que aquí es cuestión de gustos. Te pongo link al PT3 Player de Dioniso en el MRC, lo que no se es si estará actualizado, porque ha ido mejorándose poco a poco. Con este replayer podrás reproducir archivos PT3 en MSX, tienes el código asm en la descarga. Eso si, agradecería a Dioniso que matizara si es la última versión, que no se si en el MRC estará la descarga actualizada.

¿No es mejor usar el de SapphiRe?
http://z80st-software.blogspot.com/   (a la derecha, zona de descargas)
En línea
Dioniso
Visitante
« Respuesta #12 : 03 de Julio de 2009, 06:57:49 pm »

Es que aquí es cuestión de gustos. Te pongo link al PT3 Player de Dioniso en el MRC, lo que no se es si estará actualizado, porque ha ido mejorándose poco a poco. Con este replayer podrás reproducir archivos PT3 en MSX, tienes el código asm en la descarga. Eso si, agradecería a Dioniso que matizara si es la última versión, que no se si en el MRC estará la descarga actualizada.

La última que yo modifiqué es ésta, antes de dejar el tema. En el MRC no se preocuparon mucho por el tema. Les envié hace millones de años la versión corregida y pasaron de mi culo  Sad

La de Sapphire se ejecuta desde ROM y es algo más pequeña.
En línea
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #13 : 07 de Julio de 2009, 04:19:46 pm »

La solucion que habia encontrado para pasar un número a BCD solo valia para números menores de 20. Lo estuve pensando, y realmente un número en BCD es solo una "repesentación gráfica" del mismo (en decimal), así que si utilizo variables para las unidades,decenas,... y las "presento" en pantalla será lo mismo (seguramente con un mayor desperdicio de memoria, pero por el momento esa no es una de mis prioridades).
Así que con este pequeño listado puedo representar numeros hasta 100(y ampliarlo hasta 1.000,10.000,... es muy sencillo)
      LD A,[NUM]       ;unidades
      INC A
      CP 58               ;>9?
      JR NZ,SEGUIR
      LD A,[NUM+1]    ;decenas
      INC A
      LD [NUM+1],A
      XOR A LD A,48  ; 48=ascii 0
SEGUIR:
      LD [NUM],A

Por ahora con esto me basta, pero me gustaría que me comentaseis para un futuro, si esto un deroche de memoria ó si es solo una gota en la inmensidad del mar  Wink
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #14 : 07 de Julio de 2009, 09:38:34 pm »

Hecha un vistazo a este ejemplo, un contador de tiempo hacia atras (99-0) en un solo byte.


LD A,[TIME]    ; Cogemos el tiempo almacenado en la variable TIME
DEC A            ; Decrementamos el valor
DAA               ; Convertimos a BCD
LD [TIME],A    ; Volvemos a guardar el tiempo en la variable
PUSH AF         ; Guardamos el valor en la pila
AND F             ; Nos quedamos con los cuatro bits mas bajos
ADD 48           ; Sumamos 48 y obtenemos el codigo ASCII del numero
                     ; para operar con el como sea
........

POP AF            ; Recuperamos el valor de TIME
AND $F0          ; Nos quedamos con los cuatro bits mas altos
SRL A              ; Rotamos
SRL A
SRL A
SRL A
ADD 48           ; Sumamos 48 y obtenemos el codigo ASCII del numero
                     ; Operamos con el

Si sustituimos el "DEC A" por un "INC A" seria un contador ascendente.
Es facil ampliable a 4 cifras, seis o las que quieras y ocuparian 1, 2 o 3 bytes (y asi sucesivamente)
Espero te sea de ayuda.
      
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
Páginas: [1] 2
  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!