Programando NewPong. Parte 1A

Como comenté en un artículo anterior vamos a ir programando y comentando el listado en MSX Basic de NewPong hasta conseguir el juego completo.

De momento en la primera parte hemos dibujado el campo de juego, dos palas y una pelota. En esta primera versión solamente se pueden mover las palas por sus campos y la pelota va rebotando por el campo, pero todavía no se ha incorporado la detección de la pelota por parte de las palas (esto lo haremos en la parte 2).

Las palas se mueven con los mandos del cursor y/o joysticks. Las variables P1 y P2  de la línea 200  eligen entre los valores:

0 –> Cursor

1 –> Joystick 1

2 –> Joystick 2

que luego se pasan como parámetros de las órdenes STICK() en las líneas 380 y 470.

Iniciamos con la definición de las variables utilizadas:

X,Y –> Posición (x,y) de la pelota en pantalla.

AX,AY –> Posición (x,y) de la pala A (jugador 1).

BX,BY –> Posición (x,y) de la pala B (jugador 2).

PUNT1$,PUNT2$ –> Puntuación del jugador 1 y jugador 2.

VEL –> Velocidad del movimiento de la pelota.

VELP –> Velocidad de movimiento de las palas.

IX –> Movimiento positivo (1) o negativo (-1) en el eje X de la pelota.

IY –> Movimiento positivo (1) o negativo (-1) en el eje Y de la pelota.

A continuación se hace un salto a la línea 570 para anotar marcadores en pantalla, dibujar el campo de juego y definir los sprites de la pala y la pelota.

Finalmente en la línea 220 se inicia el Bucle del juego, que de momento consta del movimiento automático y de rebote de la pelota y las palas con los mandos del cursor/joystick en sus campos correspondientes.

Seguiremos con más en el siguiente artículo…

Listado NewPong1.bas

10 ‘################
20 ‘# NEWPONG #
30 ‘# JOSE DELGADO #
40 ‘# ENERO 2013 #
50 ‘################
60 CLEAR
70 SCREEN 2,2
80 OPEN»GRP:»AS#1
90 GOSUB 630
100 GOSUB 740
110 ‘=============
120 ‘ INICIALIZAR
130 ‘=============
140 X=10:Y=10
150 IX=1:IY=1
160 AX=40:AY=90
170 BX=200:BY=90
180 PUNT1$=»00″:PUNT2$=»00″
190 VEL=8:VELP=8
200 P1=0:P2=1
210 GOSUB 570
220 ‘=================
230 ‘ BUCLE DEL JUEGO
240 ‘=================
250 ‘——–
260 ‘ PELOTA
270 ‘——–
280 PUT SPRITE 0,(X,Y)
290 IF (IY=1 AND Y<185-8) THEN IY=1 ELSE IF IY=1 THEN IY=-1
300 IF (IY=-1 AND Y>7) THEN IY=-1 ELSE IF IY=-1 THEN IY=1
310 IF (IX=1 AND X<251-8) THEN IX=1 ELSE IF IX=1 THEN IX=-1
320 IF (IX=-1 AND X>7) THEN IX=-1 ELSE IF IX=-1 THEN IX=1
330 X=X+(IX*VEL)
340 Y=Y+(IY*VEL)
350 ‘———–
360 ‘ JUGADOR 1
370 ‘———–
380 D=STICK(P1)
390 IF (D=1 AND AY>7) THEN AY=AY-(1*VELP)
400 IF (D=5 AND AY<(185-16)) THEN AY=AY+(1*VELP)
410 IF (D=3 AND AX<(128-12-VELP)) THEN AX=AX+(1*VELP)
420 IF (D=7 AND AX>5) THEN AX=AX-(1*VELP)
430 PUT SPRITE 1,(AX,AY)
440 ‘———–
450 ‘ JUGADOR 2
460 ‘———–
470 D=STICK(P2)
480 IF (D=1 AND BY>7) THEN BY=BY-(1*VELP)
490 IF (D=5 AND BY<(185-16)) THEN BY=BY+(1*VELP)
500 IF (D=3 AND BX<(256-12-VELP)) THEN BX=BX+(1*VELP)
510 IF (D=7 AND BX>128) THEN BX=BX-(1*VELP)
520 PUT SPRITE 2,(BX,BY)
530 GOTO 220
540 ‘
550 ‘
560 ‘
570 ‘===================
580 ‘ ANOTAR MARCADORES
590 ‘===================
600 PSET(20,20),4:PRINT#1,PUNT1$
610 PSET(220,20),4:PRINT#1,PUNT2$
620 RETURN
630 ‘==================
640 ‘ DIBUJAR PANTALLA
650 ‘==================
660 LINE(0,0)-(256,7),15,BF
670 LINE(0,185)-(256,192),15,BF
680 LINE(0,0)-(5,50),15,BF
690 LINE(0,142)-(5,192),15,BF
700 LINE(251,0)-(256,50),15,BF
710 LINE(251,142)-(256,192),15,BF
720 LINE(128,8)-(128,185),15
730 RETURN
740 ‘=================
750 ‘ DEFINIR SPRITES
760 ‘=================
770 FOR I=1 TO 8
780 READ A$
790 B$=B$+CHR$(VAL(«&B»+A$))
800 NEXT I
810 SPRITE$(0)=B$
820 DATA 00000000
830 DATA 00011000
840 DATA 00111100
850 DATA 01111110
860 DATA 01111110
870 DATA 00111100
880 DATA 00011000
890 DATA 00000000
900 FOR I=1 TO 16
910 READ A$
920 C$=C$+CHR$(VAL(«&B»+LEFT$(A$,8)))
930 D$=D$+CHR$(VAL(«&B»+RIGHT$(A$,8)))
940 NEXT I
950 SPRITE$(1)=C$+D$
960 SPRITE$(2)=C$+D$
970 DATA 0000011111100000
980 DATA 0000011111100000
990 DATA 0000011111100000
1000 DATA 0000011111100000
1010 DATA 0000011111100000
1020 DATA 0000011111100000
1030 DATA 0000011111100000
1040 DATA 0000011111100000
1050 DATA 0000011111100000
1060 DATA 0000011111100000
1070 DATA 0000011111100000
1080 DATA 0000011111100000
1090 DATA 0000011111100000
1100 DATA 0000011111100000
1110 DATA 0000011111100000
1120 DATA 0000011111100000
1130 RETURN

Fin Listado NewPong1.bas

Descargar newpong1.bas

Descargar newpong1.dsk

Recuerda compartir el artículo

4 comentarios en «Programando NewPong. Parte 1A»

  1. Comprensible. Facil de entender, sin embargo, para darle un poquito mas de velocidad(ya que sabemos que el BASIC no es demasiado rapido) podrias usar logica booleana. Me refiero a eliminar sentencias IF/THEN, y sustituirlas por sentencias ON VARIABLE. Si VARIABLE es distinta de 0, entonces cumplira la siguiente orden. Con esto ahorras tokens BASIC y de paso, aumentaras algo de velocidad. Estudialo, veras como merece la pena 😉

    P.D. Yo estoy muy oxidado en BASIC, pero si tengo un rato copiare el texto e intentare hacer alguna prueba 😉

    Responder
    • Hola,

      Efectivamente he valorado la claridad, para empezar, de las sentencias condicionales… pero la velocidad es un factor crítico en el bucle y de hecho ya se nota, y por ello que haya que mover los sprites de 8 en 8 pixels para tener una velocidad razonable… 🙂
      Lo probaré (aunque seguro que mejora el coste temporal)…
      La verdad es que volver a programar el MSX es volver a tener que pensar cosas que ya no miramos tanto en las máquinas actuales…

      Muchas gracias por tu comentario y espero que me sigas echando una mano 🙂 que se agradece…

      Responder
      • Viendo un poquito mas por encima encima el listado, veo que usas Screen 2. La verdad es que el modo grafico puede ser mas versatil a la hora de dibujar, sin embargo, ya que vas a trabajar con Sprites para las paletas y la pelota, casi es recomendable usar Screen 1. Puedes pintar el campo con 4 caracteres, y los desplazamientos puedes hacerlos igual. Tambien te ahorrara mucho tiempo de proceso imprimiendo los caracteres en modo grafico, ya que hay que «pintarlos».

        Falta la rutina de colision, el famoso «ON SPRITE GOSUB», el cual puedes definir de modo que cambie simplemente la direccion de la pelota.

        Para hacerlo mas realista al PONG original, yo no permitiria el movimiento atras-adelante. Te ahorras problemas a la hora de detectar colisiones, y puedes poner un condicional en caso de que la pelota «rebase» los limites, redirigiendo a una subrutina que detecte donde ha rebasado, y dé el punto al jugador correcto.

        Hoy la verdad es que no he tenido mucho tiempo mas que para transcribir parte del listado, pero creo que se puede hacer mas eficiente sin liarlo demasiado 😉

        Saludos!

        Responder
      • Nuevamente gracias por tus comentarios.

        Lo de utilizar SCREEN1 también lo pensé, pues recordaba que hace casi 28 años cuando programé este juego al final terminé en modo carácter por cuestiones de velocidad. Tema que también probaré nuevamente… 🙂

        En la siguiente parte (ahora tengo lio, pero cuanto que pueda lo haré) la idea es incorporar las colisiones con la pelota y los «goles», para en una tercera versión meter un menu y poder elegir entre varios parámetros incluidos varias modalidades del juego (como bien comentas, incluso la que yo prefería que era la de dos palas cada jugador y en la cual la del «portero» solo se movía de arriba a abajo)… en fin a ver si dispongo de tiempo y poco a poco lo voy haciendo…

        Puedes descargarte el programa en versión .bas o .dsk directamente del post…

        Si vas probando versiones diferentes, por favor, si quieres me las haces llegar y las vamos subiendo al Blog y así entre todos avanzamos más… 🙂

        Responder

Deja un comentario

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continúas navegando estás aceptando y dando tu consentimiento a nuestra política de cookies

ACEPTAR
Aviso de cookies