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
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).