Karoshi MSX Community
05 de Julio de 2021, 08:15:24 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 11730 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #15 : 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
En línea
SapphiRe_MSX
Visitante
« Respuesta #16 : 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.
En línea
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #17 : 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?
En línea
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #18 : 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?.
 
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #19 : 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!
« Última modificación: 19 de Julio de 2009, 08:30:16 am 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 #20 : 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.
En línea
Dioniso
Visitante
« Respuesta #21 : 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.
En línea
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #22 : 19 de Julio de 2009, 09:53:35 pm »

Gracias Dioniso, eso era lo que necesitaba saber. Mañana lo pruebo.
En línea
Tragamanzanas
Karoshi Fan
**
Mensajes: 71


« Respuesta #23 : 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.
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #24 : 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Ã
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 #25 : 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.
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #26 : 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. Wink
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!