Rebotes de sprites

Si tienes alguna duda y crees que alguien podría resolverla, ponla aquí. || If you have any doubt about programming, post it here.

Moderador: CEZ

Responder
Ñuño Martínez
16 bits
16 bits
Mensajes: 65
Registrado: 12 Ene 2009 16:45
Ubicación: Ciudad Catedral, Españistán

Rebotes de sprites

Mensaje por Ñuño Martínez »

Esto es para MSX, pero tengo mis dudas de que tenga que ver con el problema.

Resulta que tengo los dos típicos rombos rondando por la pantalla y cuando chocan, rebotan (invierten sus velocidades). Fácil, ¿no? Pues no: resulta que en vez de rebotar se quedan trabados entre sí. Primero lo intenté en ensamblador, y al no funcionar lo he intentado hacer en BASIC, donde el comportamiento no es exactamente igual, pero se parece bastante (resbala uno bajo el otro hasta que se separan y no vuelven a juntarse jamás). Muy raro todo ](*,) .

Lo que más me mosquea es que estoy siguiendo el "Curso assembler rápido para MSX" y por más vueltas que le doy no veo qué diferencias tiene mi código con el del vídeo (y mosquea que BASIC también falle, ¿pero por razones distintas?).

Dejo el código BASIC. El ensamblador no, pero si alguien lo pide lo paso también.

Código: Seleccionar todo

10 DEFINT A-Z: SCREEN 2
20 LINE (1, 1)-(108, 128), 1, BF
30 SPRITE$(0)=CHR$(&h18)+CHR$(&h3C)+CHR$(&h7E)+CHR$(&hFF)+CHR$(&hFF)+CHR$(&h7E)+CHR$(&h3C)+CHR$(&h18)
40 X1=35:Y1=35:V1=1:W1=1
50 X2=60:Y2=60:V2=1:W2=-1
60 ON SPRITE GOSUB 150: SPRITE ON
70 PUT SPRITE 1, (X1, Y1), 15, 0
80 PUT SPRITE 2, (X2, Y2), 8, 0
90  X1 = X1 + V1: IF (2 > X1) OR (X1 > 100) THEN V1 = -V1
100 Y1 = Y1 + W1: IF (2 > Y1) OR (Y1 > 120) THEN W1 = -W1
110 X2 = X2 + V2: IF (2 > X2) OR (X2 > 100) THEN V2 = -V2
120 Y2 = Y2 + W2: IF (2 > Y2) OR (Y2 > 120) THEN W2 = -W2
130 IF INKEY$="" THEN 70
140 END
150 V1=-V1:V2=-V2:W1=-W1:W2=-W2
160 RETURN
No sé qué estoy haciendo mal en los cálculos o el funcionamiento. Si alguien se le ocurre algo lo agradeceré.

Y no sé si tendrá algo que ver, pero estoy usando OpenMSX en Xubuntu 18.04.3 con BIOS robadas de fMSX (Phillips NMS 8250).

luisito
8 bits
8 bits
Mensajes: 1
Registrado: 19 Oct 2019 18:49

Re: Rebotes de sprites

Mensaje por luisito »

Hola

No se nada de msx ni sobre sprites, pero por lo que parece, es un tema de la deteccion de colision y de como funciona.

No se exactamente cuando salta la rutina de deteccion, asumo que despues de un put sprite, y tambien supongo que el return retorna donde lo dejo (o sea, al segundo putsprite, que probablemente vuelva a hacer saltar la rutina, anulando el cambio).

Una de dos, o bien modificas el codigo para que una vez que haya colision (y modifiques, a la vez, ambos vectores de ambos sprites), esperes unos frames (o a que esten fuera de su bounding box), o bien te asegures de que una vez actualizados los vectores, se redibujen los sprites "separados" entre si para que no vuelva a saltar la rutina de colision.

Todo esto es teoria, por supuesto, pero a ver si te da alguna pista.

Ñuño Martínez
16 bits
16 bits
Mensajes: 65
Registrado: 12 Ene 2009 16:45
Ubicación: Ciudad Catedral, Españistán

Re: Rebotes de sprites

Mensaje por Ñuño Martínez »

Tiene lógica. He hecho unas pruebas desactivando y activando la detención de la colisión de sprites (SPRITE ON/OFF) en diferentes estados, y el comportamiento ha cambiado. Ahora ya no se traban tanto, aunque aún lo hacen de vez en cuando. Para mi que el problema está en que BASIC comprueba las colisiones una vez por fotograma y quizá el programa no sea tan rápido (lo cierto es que BASIC es muy lento actualizando sprites, en cuanto hay que actualizar más de dos se vuelve casi injugable).

El problema que veo es que ensamblador la cosa es muy diferente. La detección de colisiones no se hace vía interrupción como en BASIC, sino que se lee un registro del procesador de vídeo para saber si hay o no colisión.

Voy a re-escribir por completo el código desde cero, siguiendo escrupulosamente lo que veo en el vídeo del tutorial, a ver si logro encontrar qué es lo que he cambiado. :-k

Ñuño Martínez
16 bits
16 bits
Mensajes: 65
Registrado: 12 Ene 2009 16:45
Ubicación: Ciudad Catedral, Españistán

Re: Rebotes de sprites

Mensaje por Ñuño Martínez »

Vale, creo que he dado con el problema: OpenMSX no funciona bien. Me explico:

Después de haber hecho varias pruebas con el depurador de OpenMSX me he dado cuenta de que este depurador no actualiza el estado del VDP en todos los fotogramas, sino que parece hacerlo en uno de cada cuatro. Me he dado cuenta después de poner varios breaks y ejecutar instrucción por instrucción el bucle principal y varias subrutinas.

He estado mirando todos los controles de Catapult y no veo ninguno que le diga al emulador que se comporte así.

[edit] He creado otro hilo sobre el emulador, por si se aclara.

Responder