Título: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 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? Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 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 ;) Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: j4mk3 en 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) Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 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). Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 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 ;D. 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 ;) Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 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 (http://msxgamesbox.com/karoshi/index.php?topic=1074.msg14639#msg14639). 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 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 (http://www.msx.org/modules.php?op=modload&name=Downloads&file=index&req=visit&lid=597) 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: pitpan en 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 :(
Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 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 :malaika:Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Metalbrain en 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 (http://www.msx.org/modules.php?op=modload&name=Downloads&file=index&req=visit&lid=597) 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) Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Dioniso en 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 (http://www.msx.org/modules.php?op=modload&name=Downloads&file=index&req=visit&lid=597) 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 (http://www.geocities.com/dioniso072/PT3_Replayer_1696_bytes_long.zip), 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 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 ;) Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: OKI09 en 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. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 13 de Julio de 2009, 06:21:34 pm Bueno, ahora le toca el turno a las interrupciones. He estado mirando por el foro, y aunque algo he visto, no me queda claro como poner mi código "dentro" de ella.
En este ejemplo que he encontrado, la dirección de la nueva interrupción estará en INTERRUPTION_HANDLER. Al inicio del programa le tendré que asignar a INTERRUPTION_HANDLER una dirección que sea la de inicio del código que quiero que se repita cada X veces que se ejecute mi "trozo" de programa, pero lo que no sé es como asignar esa dirección a mi subrutina (no sé si me he explicado bien) INSTALL_INTERRUPTION: ; Install interrupt handler ;---------------------------------------------- ; Disable interrupts di ; Interrupt BIOS entry point ld hl,0FD9Fh ; Address of the new interruption routine ld bc,INTERRUPTION_HANDLER ; Instruction "CALL" ld [hl],0C3h ; Address stored inc hl ld [hl],c inc hl ld [hl],b ; Enable interrupts ei ; Done ret Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: SapphiRe_MSX en 13 de Julio de 2009, 06:27:44 pm En este ejemplo que he encontrado, la dirección de la nueva interrupción estará en INTERRUPTION_HANDLER. Al inicio del programa le tendré que asignar a INTERRUPTION_HANDLER una dirección que sea la de inicio del código que quiero que se repita cada X veces que se ejecute mi "trozo" de programa, pero lo que no sé es como asignar esa dirección a mi subrutina (no sé si me he explicado bien) Simplemente poniendo esa etiqueta a tu rutina. Citar ; Instruction "CALL" ld [hl],0C3h Eso es un JP, ya que CALL sería 0CDh. Está bien así, aunque yo lo haría: Código: INSTALL_INTERRUPTION: di ld hl,INTERRUPTION_HANDLER ld a,$C3 ld [$FD9F],a ld [$FDA0],hl ei ret que es más rápido y compacto. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 13 de Julio de 2009, 08:43:46 pm Gracias SapphiRe, ahora ya tengo el CONTROL de la máquina.
Supongo que esta rutina tiene que ser lo mas corta posible, para no interferir en la gestión del sistema, pero el tamaño como lo controlo, ¿a ojo? Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 18 de Julio de 2009, 09:13:22 pm Vuelvo al ataque. La verdad es que con las interrupciones he conseguido un mejor control de los eventos que se producen, pero cambiando de tema, ahora estoy con como detectar la colisión de sprites(lo que he visto es en Basic). Lo que quiero hacer es comprobar si X1-X2 es menor de 16 (sprites 16x16), luego Y1-Y2 y lo mismo sumandole 16 para tener la xy opuesta.
LD A,[X1] ;X del sprite1 LD B,A LD A,[X2] ;X del sprite2 SUB B ; no tengo claro si poniendo CP 16 sería lo mismo, siempre que solucione la pregunta de abajo. Ahora necesito el valor absoluto de A para saber si es 16 (las intrucciones aritmeticas no las termino de pillar) Seguro que hay otra forma de hacerlo que me interesa conocer, pero aun así ... ¿como consigo sacar el valor absoluto de A?. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 19 de Julio de 2009, 08:17:02 am Te digo como lo haría yo, pero no se si será la opción más óptima. Veamos, tras restar ámbas coordenadas a comprobar, tu rango de datos de si hay colisión o no va desde 15 a -16 (que en realidad es 240). Es muy fácil: si a esa resta le sumas 16, si el resultado va de 0 a 31 (o sea, IF A<32) es que tienes colisión, ¿no?. Pues yo haría lo siguiente (pseudo código al canto):
A=X1-X2+16 IF A>31 then GOTO NO_HAY_COLISION A=Y1-Y2+16 IF A>31 then GOTO NO_HAY_COLISION ; rem SI LLEGO AQUI ES QUE ; rem HAY COLISION EN X Y EN Y HAGO LO QUE SEA ret NO_HAY_COLISION: HAGO LO QUE SEA ret Ahora la buena es hacerse un buen loop que vaya apuntando a una lista con todas las coordenadas a comprobar, para no andar repitiendo código, pero bueno, que yo lo haría así. Espero que te sirva de algo! Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 19 de Julio de 2009, 11:46:22 am "IF A>31" yo lo que hago es CP 31 y actuar segun el resultado, pero si las coordenadas se incrementan/decrementan de una forma no constante, no me vale la comparación, ¿como se calcula si es mayor/menor un número?
Y no sé si le ha pasado a alguien mas, pero cuando programo (utilizo para ensamblar el asMSX) voy viendo lo que hago con openmsx, pero ayer intenté verlo con el nlmsx y un contador que tiene que aparecer en la tercera línea de la Vram e ir moviendose hacia la izquierda, aparecia unas 15 líneas mas abajo. Ademas el joystick no funciona en openmsx pero sí en nlmsx. Lo repetí con los dos pero con el mismo resultado. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Dioniso en 19 de Julio de 2009, 12:48:51 pm "IF A>31" yo lo que hago es CP 31 y actuar segun el resultado, pero si las coordenadas se incrementan/decrementan de una forma no constante, no me vale la comparación, ¿como se calcula si es mayor/menor un número? Si se activa el CARRY, menor; si no se activa, mayor o igual. CP 31 JR C,ES_MENOR JR NC,ES_IGUAL_O_MAYOR Aunque este último salto sería absurdo hacerlo, bastaría con poner la rutina ES_IGUAL_O_MAYOR, ya que si no salta a ES_MENOR, la única posibilida es IGUAL_O_MAYOR. No sé si he respondido a tu pregunta. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 19 de Julio de 2009, 09:53:35 pm Gracias Dioniso, eso era lo que necesitaba saber. Mañana lo pruebo.
Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 24 de Julio de 2009, 03:36:54 pm Tengo una pregunta/petición para Viejo_archivero.
Mirando por el foro he visto el tema "Los Archivos del Viejo Archivero" en el que sacabas a la luz los proyectos en desarrollo y hay una frase que me ha ilusionado : "o puede que le sirva a alguien para observar trucos de diseño que pueda aplicar en sus producciones... el caso es que, independientemente del tipo de utilidad que le podáis dar, lo cierto es que en mi ordenador poco ayudan a nadie, así que aquí los tenéis: ¡los Archivos del Viejo Archivero!" Mi petición es clara, podría obtener alguno de esos listados ya que he de reconocer que los pocos que he conseguido me han ayudado muchisimo para asimilar ciertas estructuras de programación. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Jon_Cortazar en 24 de Julio de 2009, 04:47:46 pm El caso es que esos diseños no pasan de eso, de ser diseños: no hay programación y por lo tanto no hay listados, son solo diseños gráficos previos a la programación, para ver como enfocar un proyecto. Si quieres listados de juegos completos, echa un ojo al foro de los juegos open source, [http://msxgamesbox.com/karoshi/index.php?board=13.0]aquí[/url], donde tienes un pong y un buscaminas, a ver si te sirven de ayuda!
Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: Tragamanzanas en 25 de Julio de 2009, 07:27:07 pm Lastima, ya que me vienen muy bien. El que me envió OKI09 del juego El Bola fue el primero que lo estudié de principio a fin y le estoy muy agradecido.
Los del pong y buscaminas tambien los tengo, pero me gustaría poder ver listados de juegos con mas acción. Título: Re: Como controlar la velocidad a la que se mueve un sprite Publicado por: OKI09 en 26 de Julio de 2009, 02:13:14 pm Citar El que me envió OKI09 del juego El Bola fue el primero que lo estudié de principio a fin y le estoy muy agradecido. De nada, para lo que te pueda ayudar, ya sabes donde estoy. ;) |