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
|
|
« Respuesta #1 : 23 de Mayo de 2009, 09:03:36 pm » |
|
Me da que no sincronizas las cosas . 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
|
|
|
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
|
|
« Respuesta #3 : 20 de Junio de 2009, 06:21:25 pm » |
|
Desde aquí mis amino a tragamanzanas, se como se siente 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
|
|
« 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 . 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 . 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
|
|
« Ú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
|
|
« 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í: ; 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
|
|
« 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
|
|
« 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
|
|
|
En línea
|
|
|
|
Jon_Cortazar
|
|
« 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 Tranquilo, socio, ya me lo suponía. Tu, a lo tuyo, ya nos contarás
|
|
|
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 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
|
|
|
En línea
|
|
|
|
OKI09
|
|
« 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"
|
|
|
|