En este post se va a tratar el movimiento de los jugadores usando BASIC para experimentar la velocidad y ver si se continua con este lenguaje o bien se hace la programación en ensamblador.
El programa en BASIC
Se corre el juego sin ningún problema en alta velocidad:
Se inicializa la interfaz en serie, como se vio en el post anterior:
60 POKE 65387,30
70 POKE 65386,11
Además programamos dos subrutinas para el envio y recepción de datos:
800 A=PEEK(65385)
810 B=A AND 8
820 IF B=0 THEN 800
830 D$=CHR$(PEEK(65384))
840 PRINT "RECIBE: " + D$
850 RETURN
860 REM ESCRITURA DEL PUERTO SERIE
870 A=PEEK(65385)
880 B=A AND 16
890 IF B=0 THEN 870
900 POKE 65384,ASC(A$)
910 PRINT "ENVIA: " + A$
920 RETURN
Para sincronizar el inicio de la comunicación entre las dos computadoras, cada una de ellas manda un mensaje con el caracter "N" y al mismo tiempo lo espera recibir. Esto nos permite correr el juego de manera asíncrona y no importa que computadora empiece primero:
80 REM MANDA LA SEÑAL DE SINCRONIZACION
90 A$="N":GOSUB 870
100 REM ESPERA LA SEÑAL DE SINCRONIZACION
110 GOSUB 800
120 IF D$<>"N" THEN 90
Como nuestro juego es "punto a punto" y cualquiera de las dos computadoras puede correr primero su programa; hacemos un sorteo para elegir que jugador va usar cada uno de ellos:
140 A$=CHR$(RND(10)+47)
150 PRINT "RESULTADO: " + A$
155 REM ENVIA NUESTRO NUMERO ALEATORIO
160 GOSUB 870
165 REM ESPERA RECIBIR EL NUMERO ALEATORIO DE NUESTRO CONTRINCANTE
170 GOSUB 800
175 REM SI EMPATARON, VUELVE A HACER EL SORTEO
180 IF A$=D$ THEN 140
280 IF ( A$>D$) THEN 320
290 FX=0:FY=100
300 GX=0:GY=50
310 GOTO 340
320 FX=0:FY=50
330 GX=0:GY=100
Ahora nos vamos a ocupar de las animaciones de nuestros jugadores. Me basé en una técnica que aprendí del libro "Gráficos y sonidos para el Dragón" de K y S Brain ; Justamente cuando era niño. Consiste en primero dibujar a los jugadores y obtener una copia de la representación en memoria de sus movimientos por medio de la orden GET para después durante el juego copiar esa memoria durante el juego con la orden PUT.
El código que dibuja los movimientos de los jugadores y los guarda en memoria es el siguiente:
Ya con todas las inicializaciones, podemos dibujar la "cancha" y a los jugadores:
340 FOR LI=105 TO 110 STEP 5:LINE(0,LI)-(255,LI-50),PSET:NEXT LI
350 GET(FX,FY)-(FX+16,FY+15),F0,G
360 PUT(FX,FY)-(FX+16,FY+15),F1,OR
370 GET(GX,GY)-(GX+16,GY+15),G0,G
380 PUT(GX,GY)-(GX+16,GY+15),G1,OR
El movimiento del jugador local se a través del teclado:
400 IF A$="" THEN 560
410 PUT(FX,FY)-(FX+16,FY+15),F0,PSET
420 IF A$="P" THEN FX=FX+16
430 IF A$="O" THEN FX=FX-16
440 IF A$="Q" THEN FY=FY-16
450 IF A$="A" THEN FY=FY+16
460 REM DIBUJAMOS LA NUEVA POSICION DEL JUGADOR LOCAL
470 GET(FX,FY)-(FX+16,FY+15),F0,G
480 PUT(FX,FY)-(FX+16,FY+15),F2,OR
490 PUT(FX,FY)-(FX+16,FY+15),F0,AND
500 PUT(FX,FY)-(FX+16,FY+15),F1,OR
Para simplificar la programación, en lugar de hacer un sistema de mensajes, simplemente se envia la tecla presionada al otro jugador:
Se revisa si el jugador remoto presionó alguna tecla y se procesa de la misma forma que para el jugador local:
610 PUT(GX,GY)-(GX+16,GY+15),G0,PSET
620 IF D$="P" THEN GX=GX+16
630 IF D$="O" THEN GX=GX-16
640 IF D$="Q" THEN GY=GY-16
650 IF D$="A" THEN GY=GY+16
655 REM DIBUJAMOS LA NUEVA POSICION DEL JUGADOR REMOTO
660 GET(GX,GY)-(GX+16,GY+15),G0,G
670 PUT(GX,GY)-(GX+16,GY+15),G2,OR
680 PUT(GX,GY)-(GX+16,GY+15),G0,AND
690 PUT(GX,GY)-(GX+16,GY+15),G1,OR
Finalmente, repetimos el ciclo:
Conclusiones de esta parte
En el siguiente video, podemos apreciar el funcionamiento del programa:
Como podemos ver, aún para ser un programa en BASIC la velocidad es razonable; sobretodo para juegos de turno como los de cartas y ajedrez. En realidad la velocidad esta limitada por la velocidad de las instrucciones gráficas, por lo que un juego en baja resolución funcionaria muy rápido para juegos de acción. Si se va usar alta resolución para un juego de acción, lo conveniente es usar pocos efectos gráficos o bien programarlo en ensamblador.
Muchas Gracias a mi hermano por la interpretación de la música de fondo del video.
