01 octubre 2014

Un mini-juego en BASIC de Amstrad CPC (7: elementos en el fondo,varias vidas, joystick, intro, dibujar)

28. Más elementos en el fondo

Vamos a hacer que los elementos del juego sean parte del fondo. Como necesitaremos líneas nuevas entre las ya existentes, vamos a comenzar por renumerar, dejando un espacio de 50 entre cada par de líneas:
RENUM 1000, 1, 50
En primer lugar, podríamos modificar el mapa, para que incluya los obstáculos (que podríamos representar con una "x"), los premios (una "o", por ejemplo) e incluso los enemigos ("e") y nuestra propia posición de partida ("A):
4300 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
4350 DATA PP-o--PPP----o---PPPP-o------PP
4400 DATA PP---xPPP---x----PPPP---x----PP
4450 DATA PP----PPP--e-----PPPP--------PP
4500 DATA PP----PPPPP------PPPP--------PP
4550 DATA PP--PPPPPPPPPP--PPPPP----PPPPPP
4600 DATA PP---PPPPPPPP--PPPPPPPP----PPPP
4650 DATA PPP-A--PPPPP---PPPPPPPPP---PPPP
4700 DATA PP----------------x---e-----PPP
4750 DATA PPP------------------------PPPP
4800 DATA PPPPP-----------PPPPPPPPP----PP
4850 DATA PPPPPP--e--------PPPPPP---P--PP
4900 DATA PPP----x--------------PPP-PP-PP
4950 DATA PP--------------x--o-----PPPPPP
5000 DATA PP-o------------------------PPP
5050 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
Así, necesitaremos un array para el fondo, pero también uno de enemigos, para que se muevan independientemente del fondo. (No será necesario array de obstáculos ni de premios). El análisis del mapa va a ser bastante más complejo que antes.
Por ejemplo, la lectura y análisis de los DATA, guardando en el mapa de pantalla las paredes y los obstáculos podría ser
1850 FOR fila = 1 TO 16
1900   READ linea$
1950   FOR columna = 1 TO 32
2050     IF MID$(linea$,columna,1) = "P" THEN pantalla$(fila+2, columna+4)=pared$
2060     IF MID$(linea$,columna,1) = "x" THEN pantalla$(fila+2, columna+4)=obstaculo$
2100   NEXT columna
2150 NEXT fila
De igual modo, podríamos obtener nuestra posición desde el mapa:
2070     IF MID$(linea$,columna,1) = "A" THEN y=fila+2: x=columna+4
Y la información sobre los premios, incluyendo un contador que nos ayude a saber cuándo hemos superado esta pantalla (cuando ya no quede ningún premio por recoger):
2080     IF MID$(linea$,columna,1) = "o" THEN premios = premios+1: pantalla$(fila+2, columna+4)=premio$
Y la información de los enemigos la trasladaríamos a los arrays correspondientes:
1850 FOR fila = 1 TO 16
2090     IF MID$(linea$,columna,1) = "e" THEN enemigos = enemigos+1: yE(enemigos)=fila+2: xE(enemigos)=columna+4: velocE(enemigos)=1
Y podríamos dibujar la pantalla a partir del contenido del array:
2162 FOR f = 1 TO 25
2164   FOR c = 1 TO 40
2166     LOCATE c, f
2168     IF pantalla$(f,c) = pared$ THEN PEN colorPared: PRINT pared$;
2170     IF pantalla$(f,c) = obstaculo$ THEN PEN colorEnemigo: PRINT obstaculo$;
2172     IF pantalla$(f,c) = premio$ THEN PEN colorPremio: PRINT premio$;
2174   NEXT c
2176 NEXT f
Como este proceso es relativamente lento, podemos avisar al usuario para que no se desespere...

A la hora de comprobar el teclado, antes de movernos a una posición deberemos comprobar si no es una pared:
2550 IF INKEY(arriba) <> -1 AND pantalla$(y-1,x)<>pared$ THEN y=y-1
2600 IF INKEY(abajo) <> -1 AND pantalla$(y+1,x)<>pared$ THEN y=y+1
2650 IF INKEY(derecha) <> -1 AND pantalla$(y,x+1)<>pared$ THEN x=x+1
2700 IF INKEY(izqda) <> -1 AND pantalla$(y,x-1)<>pared$ THEN x=x-1
Y lo mismo deberán hacer los enemigos:
2850 FOR n = 1 TO enemigos
2860    ' Avanzar si no es pared; dar la vuelta si lo es
2870    IF pantalla$(yE(n),xE(n)+velocE(n)) <> pared$ THEN xE(n)=xE(n)+velocE(n) ELSE velocE(n)=-velocE(n)
3000 NEXT n
Pero también hay premios y obstáculos: si el enemigo pasa por encima de ellos, se borrarán de la pantalla; deberemos redibujarlos... o simplemente no permitir que pueda pasar por encima, sino que rebote también en ellos:
2865 obj$=pantalla$(yE(n),xE(n)+velocE(n))
2870 IF obj$<>pared$ AND obj$<>premio$ AND obj$<>obstaculo$ THEN xE(n)=xE(n)+velocE(n) ELSE velocE(n)=-velocE(n)
Si la posición a la que llegamos es un premio, debemos borrarlo y sumar puntos:
3100   IF pantalla$(y,x) = premio$ THEN puntos=puntos+10: premios=premios-1: pantalla$(y,x) = " "
Si la posición a la que llegamos es un obstáculo, se acabó la partida:
3150 IF pantalla$(y,x) = obstaculo$ THEN terminado = 1
Y lo mismo si es uno de los enemigos:
3350 FOR n = 1 TO enemigos
3400   IF x=xE(n) AND y=yE(n) THEN terminado = 1
3450 NEXT n
Y no hace falta redibujar las paredes, ni los obstáculos, ni los premios, sólo el personaje, los enemigos y el marcador:
3550 PEN colorPremio: LOCATE x,y: PRINT jugador$
3950 PEN colorEnemigo: FOR n = 1 TO enemigos:LOCATE xE(n),yE(n):PRINT enemigo$:  NEXT n
4200 LOCATE 15,22: PRINT "Puntos "; puntos ; "   "
Con todo esto, la apariencia resultante sería

Y el fuente completo por ahora quedaría
1 ' Laberinto 2014
2 ' Ejemplo de juego en BASIC de CPC
3 ' Desarrollado paso a paso por Nacho
1000 ' 
1010 ' Inicializacion
1020 '
1030 ' -- Colores de pantalla --
1050 MODE 1: INK 0,0: INK 1,20: INK 2,6: INK 3,25: PAPER 0: PEN 1
1060 colorPared=1: colorEnemigo=2: colorPremio=3
1090 ' -- Definicion de caracteres --
1100 SYMBOL 240, &X11111100, &X11111100, &X11111100, &X0, &X11001111, &X11001111, &X11001111, &X0
1150 SYMBOL 241, &X11000, &X101100, &X1000110, &X10000011, &X10000011, &X1000110, &X101100, &X11000
1200 SYMBOL 242, &X10000, &X10010010, &X1010100, &X111000, &X11111111, &X111000, &X1010100, &X10010010
1250 SYMBOL 243, &X10111101, &X1111110, &X11011011, &X11111111, &X11100111, &X11011011, &X1100110, &X11000011
1300 pared$=CHR$(240): premio$=CHR$(241): obstaculo$=CHR$(242): enemigo$=CHR$(243): jugador$=CHR$(248)
1310 ' -- Teclas ---
1320 arriba=0: abajo=2: derecha=1: izqda=8: salir=63
1350 ' -- Datos del juego --
1400 terminado=0
1450 puntos=0
1455 premios=0: enemigos=0
1460 ' -- Lectura del mapa desde DATA --
1550 DIM xE(10), yE(10), velocE(10)
1600 DIM pantalla$(25,40)
1650 LOCATE 15,22: PRINT"Generando..."
1810 ' Vamos a vaciar el array, para evitar basura
1820 FOR f = 1 TO 25: FOR c = 1 TO 40: pantalla$(f,c)=" ": NEXT c: NEXT f
1840 ' Y a rellenar los datos reales
1850 FOR fila = 1 TO 16
1900   READ linea$
1950   FOR columna = 1 TO 32
2050     IF MID$(linea$,columna,1) = "P" THEN pantalla$(fila+2, columna+4)=pared$
2060     IF MID$(linea$,columna,1) = "x" THEN pantalla$(fila+2, columna+4)=obstaculo$
2070     IF MID$(linea$,columna,1) = "A" THEN y=fila+2: x=columna+4
2080     IF MID$(linea$,columna,1) = "o" THEN premios = premios+1: pantalla$(fila+2, columna+4)=premio$
2090     IF MID$(linea$,columna,1) = "e" THEN enemigos = enemigos+1: yE(enemigos)=fila+2: xE(enemigos)=columna+4: velocE(enemigos)=1
2100   NEXT columna
2150 NEXT fila
2160 ' -- Dibujado de la parte estatica del mapa --
2162 FOR f = 1 TO 25
2164   FOR c = 1 TO 40
2166     LOCATE c, f
2168     IF pantalla$(f,c) = pared$ THEN PEN colorPared: PRINT pared$;
2170     IF pantalla$(f,c) = obstaculo$ THEN PEN colorEnemigo: PRINT obstaculo$;
2172     IF pantalla$(f,c) = premio$ THEN PEN colorPremio: PRINT premio$;
2174   NEXT c
2176 NEXT f
2200 ' ----- Bucle de juego -----
2250 WHILE terminado = 0
2300   ' -- Borrar personaje y enemigos de su posicion anterior --
2350   FOR n = 1 TO enemigos:LOCATE xE(n),yE(n):PRINT" ": NEXT n
2400   LOCATE x,y: PRINT " "
2500   ' -- Comprobar teclas --
2550   IF INKEY(arriba) <> -1 AND pantalla$(y-1,x)<>pared$ THEN y=y-1
2600   IF INKEY(abajo) <> -1 AND pantalla$(y+1,x)<>pared$ THEN y=y+1
2650   IF INKEY(derecha) <> -1 AND pantalla$(y,x+1)<>pared$ THEN x=x+1
2700   IF INKEY(izqda) <> -1 AND pantalla$(y,x-1)<>pared$ THEN x=x-1
2750   IF INKEY(salir) <> -1 THEN terminado=1
2800   ' -- Mover enemigos, entorno --
2850   FOR n = 1 TO enemigos
2860      ' Avanzar si no es pared; dar la vuelta si lo es
2865      obj$=pantalla$(yE(n),xE(n)+velocE(n))
2870      IF obj$<>pared$ AND obj$<>premio$ AND obj$<>obstaculo$ THEN xE(n)=xE(n)+velocE(n) ELSE velocE(n)=-velocE(n)
3000   NEXT n
3050   ' -- Colisiones, perder vidas, etc --
3100   IF pantalla$(y,x) = premio$ THEN puntos=puntos+10: premios=premios-1: pantalla$(y,x) = " "
3150   IF pantalla$(y,x) = obstaculo$ THEN terminado = 1
3350   FOR n = 1 TO enemigos
3400     IF x=xE(n) AND y=yE(n) THEN terminado = 1
3450   NEXT n
3500   ' -- Dibujar en nueva posicion --
3550   PEN colorPremio: LOCATE x,y: PRINT jugador$
3950   PEN colorEnemigo: FOR n = 1 TO enemigos:LOCATE xE(n),yE(n):PRINT enemigo$:  NEXT n
4200   LOCATE 15,22: PRINT "Puntos "; puntos ; "   "
4250 WEND
4300 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
4350 DATA PP-o--PPP----o---PPPP-o------PP
4400 DATA PP---xPPP---x----PPPP---x----PP
4450 DATA PP----PPP--e-----PPPP--------PP
4500 DATA PP----PPPPP------PPPP--------PP
4550 DATA PP--PPPPPPPPPP--PPPPP----PPPPPP
4600 DATA PP---PPPPPPPP--PPPPPPPP----PPPP
4650 DATA PPP-A--PPPPP---PPPPPPPPP---PPPP
4700 DATA PP----------------x---e-----PPP
4750 DATA PPP------------------------PPPP
4800 DATA PPPPP-----------PPPPPPPPP----PP
4850 DATA PPPPPP--e--------PPPPPP---P--PP
4900 DATA PPP----x--------------PPP-PP-PP
4950 DATA PP--------------x--o-----PPPPPP
5000 DATA PP-o------------------------PPP
5050 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 

29. Varias vidas

Nuestra partida acaba en cuanto chocamos con un enemigo o un obstáculo. Quizá eso sea demasiado exigente. Es habitual en los juegos tener varias vidas, o energía que se va perdiendo poco a poco. No es algo difícil de hacer: cuando haya una colisión, deberemos restar una de esas vidas y eliminar lo que causó la colisión (para no perder todas las vidas de golpe), por ejemplo devolviendo todos los elementos a su posición inicial, o al menos nuestro personaje.
Crear las vidas es fácil:
1450 puntos=0: vidas=3
En los bloques que comprueban colisiones, cambiaríamos "terminado" por una nueva variable "chocado":
3150 IF pantalla$(y,x) = obstaculo$ THEN chocado = 1
3400 IF x=xE(n) AND y=yE(n) THEN chocado = 1
Y si hemos chocado deberemos perder una vida, recolocar al personaje y quizá terminar:
3460 IF chocado = 1 THEN vidas = vidas-1: chocado = 0: y = yInicial: x = xInicial
3470 IF vidas = 0 THEN terminado = 1
Antes tendremos que haber memorizado esas coordenadas iniciales, claro...
2070 IF MID$(linea$,columna,1) = "A" THEN y=fila+2: x=columna+4: yInicial=y: xInicial=x
Y no estaría de más que avisáramos al usuario de cuántas vidas le quedan:
4210 LOCATE 15,23: PRINT "Vidas "; vidas
El juego completo estaría quedando:
1 ' Laberinto 2014
2 ' Ejemplo de juego en BASIC de CPC
3 ' Desarrollado paso a paso por Nacho
1000 ' 
1010 ' Inicializacion
1020 '
1030 ' -- Colores de pantalla --
1050 MODE 1: INK 0,0: INK 1,20: INK 2,6: INK 3,25: PAPER 0: PEN 1
1060 colorPared=1: colorEnemigo=2: colorPremio=3
1090 ' -- Definicion de caracteres --
1100 SYMBOL 240, &X11111100, &X11111100, &X11111100, &X0, &X11001111, &X11001111, &X11001111, &X0
1150 SYMBOL 241, &X11000, &X101100, &X1000110, &X10000011, &X10000011, &X1000110, &X101100, &X11000
1200 SYMBOL 242, &X10000, &X10010010, &X1010100, &X111000, &X11111111, &X111000, &X1010100, &X10010010
1250 SYMBOL 243, &X10111101, &X1111110, &X11011011, &X11111111, &X11100111, &X11011011, &X1100110, &X11000011
1300 pared$=CHR$(240): premio$=CHR$(241): obstaculo$=CHR$(242): enemigo$=CHR$(243): jugador$=CHR$(248)
1310 ' -- Teclas ---
1320 arriba=0: abajo=2: derecha=1: izqda=8: salir=63
1350 ' -- Datos del juego --
1400 terminado=0:chocado=0
1450 puntos=0: vidas=3
1455 premios=0: enemigos=0
1460 ' -- Lectura del mapa desde DATA --
1550 DIM xE(10), yE(10), velocE(10)
1600 DIM pantalla$(25,40)
1650 LOCATE 15,22: PRINT"Generando..."
1810 ' Vamos a vaciar el array, para evitar basura
1820 FOR f = 1 TO 25: FOR c = 1 TO 40: pantalla$(f,c)=" ": NEXT c: NEXT f
1840 ' Y a rellenar los datos reales
1850 FOR fila = 1 TO 16
1900   READ linea$
1950   FOR columna = 1 TO 32
2050     IF MID$(linea$,columna,1) = "P" THEN pantalla$(fila+2, columna+4)=pared$
2060     IF MID$(linea$,columna,1) = "x" THEN pantalla$(fila+2, columna+4)=obstaculo$
2070     IF MID$(linea$,columna,1) = "A" THEN y=fila+2: x=columna+4: yInicial=y: xInicial=x
2080     IF MID$(linea$,columna,1) = "o" THEN premios = premios+1: pantalla$(fila+2, columna+4)=premio$
2090     IF MID$(linea$,columna,1) = "e" THEN enemigos = enemigos+1: yE(enemigos)=fila+2: xE(enemigos)=columna+4: velocE(enemigos)=1
2100   NEXT columna
2150 NEXT fila
2160 ' -- Dibujado de la parte estatica del mapa --
2162 FOR f = 1 TO 25
2164   FOR c = 1 TO 40
2166     LOCATE c, f
2168     IF pantalla$(f,c) = pared$ THEN PEN colorPared: PRINT pared$;
2170     IF pantalla$(f,c) = obstaculo$ THEN PEN colorEnemigo: PRINT obstaculo$;
2172     IF pantalla$(f,c) = premio$ THEN PEN colorPremio: PRINT premio$;
2174   NEXT c
2176 NEXT f
2200 ' ----- Bucle de juego -----
2250 WHILE terminado = 0
2300   ' -- Borrar personaje y enemigos de su posicion anterior --
2350   FOR n = 1 TO enemigos:LOCATE xE(n),yE(n):PRINT" ": NEXT n
2400   LOCATE x,y: PRINT " "
2500   ' -- Comprobar teclas --
2550   IF INKEY(arriba) <> -1 AND pantalla$(y-1,x)<>pared$ THEN y=y-1
2600   IF INKEY(abajo) <> -1 AND pantalla$(y+1,x)<>pared$ THEN y=y+1
2650   IF INKEY(derecha) <> -1 AND pantalla$(y,x+1)<>pared$ THEN x=x+1
2700   IF INKEY(izqda) <> -1 AND pantalla$(y,x-1)<>pared$ THEN x=x-1
2750   IF INKEY(salir) <> -1 THEN terminado=1
2800   ' -- Mover enemigos, entorno --
2850   FOR n = 1 TO enemigos
2860      ' Avanzar si no es pared; dar la vuelta si lo es
2865      obj$=pantalla$(yE(n),xE(n)+velocE(n))
2870      IF obj$<>pared$ AND obj$<>premio$ AND obj$<>obstaculo$ THEN xE(n)=xE(n)+velocE(n) ELSE velocE(n)=-velocE(n)
3000   NEXT n
3050   ' -- Colisiones, perder vidas, etc --
3100   IF pantalla$(y,x) = premio$ THEN puntos=puntos+10: premios=premios-1: pantalla$(y,x) = " "
3150   IF pantalla$(y,x) = obstaculo$ THEN chocado = 1
3350   FOR n = 1 TO enemigos
3400     IF x=xE(n) AND y=yE(n) THEN chocado = 1
3450   NEXT n
3460   IF chocado = 1 THEN vidas = vidas-1: chocado = 0: y = yInicial: x = xInicial
3470   IF vidas = 0 THEN terminado = 1
3500   ' -- Dibujar en nueva posicion --
3550   PEN colorPremio: LOCATE x,y: PRINT jugador$
3950   PEN colorEnemigo: FOR n = 1 TO enemigos:LOCATE xE(n),yE(n):PRINT enemigo$:  NEXT n
4200   LOCATE 15,22: PRINT "Puntos "; puntos ; "   "
4210   LOCATE 15,23: PRINT "Vidas "; vidas
4250 WEND
4300 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
4350 DATA PP-o--PPP----o---PPPP-o------PP
4400 DATA PP---xPPP---x----PPPP---x----PP
4450 DATA PP----PPP--e-----PPPP--------PP
4500 DATA PP----PPPPP------PPPP--------PP
4550 DATA PP--PPPPPPPPPP--PPPPP----PPPPPP
4600 DATA PP---PPPPPPPP--PPPPPPPP----PPPP
4650 DATA PPP-A--PPPPP---PPPPPPPPP---PPPP
4700 DATA PP----------------x---e-----PPP
4750 DATA PPP------------------------PPPP
4800 DATA PPPPP-----------PPPPPPPPP----PP
4850 DATA PPPPPP--e--------PPPPPP---P--PP
4900 DATA PPP----x--------------PPP-PP-PP
4950 DATA PP--------------x--o-----PPPPPP
5000 DATA PP-o------------------------PPP
5050 DATA PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 

30. Uso de joystick

Permitir que un juego de CPC funcione con joystick no es difícil. Existen dos formas de acceder al estado del joystick. La más sencilla es usar la misma función INKEY que estamos empleando para comprobar el teclado, y que tiene códigos especiales reservados para el joy:
1330 joyArriba=72: joyAbajo=73: joyDerecha=75: joyIzqda=74
De modo que sólo tendremos que añadir un caso extra a cada comprobación de teclas:
2550 IF (INKEY(arriba)<>-1 OR INKEY(joyArriba)<>-1) AND pantalla$(y-1,x)<>pared$ THEN y=y-1
2600 IF (INKEY(abajo) >-1 OR INKEY(joyAbajo)<>-1) AND pantalla$(y+1,x)<>pared$ THEN y=y+1
2650 IF (INKEY(derecha)<>-1 OR INKEY(joyDerecha)<>-1) AND pantalla$(y,x+1)<>pared$ THEN x=x+1
2700 IF (INKEY(izqda)<>-1 OR INKEY(joyIzqda)<>-1) AND pantalla$(y,x-1)<>pared$ THEN x=x-1
El código del botón de disparo principal (que no usamos en este juego, pero quizá te resulte útil en algún otro) es el 76, y el disparo secundario es el 77.

31. Una pantalla de presentación

Crear una pantalla de bienvenida para nuestro juego es fácil: basta escribir algo (o, dentro de poco, dibujar algo) antes de entrar al bucle de juego.
1265 ' -- Pantalla de bienvenida --
1270 LOCATE 10,4: PEN colorPared: PRINT "Bienvenido al laberinto"
1272 LOCATE 10,7: PEN colorPremio: PRINT "Recoge los premios: "; premio$
1274 LOCATE 10,9: PEN colorEnemigo: PRINT "Esquiva los obstaculos: "; obstaculo$
1276 LOCATE 10,11: PRINT "Y evita a los enemigos: "; enemigo$
1278 LOCATE 4,20: PEN colorPared: PRINT "Pulsa una tecla para empezar... ";
1300 WHILE INKEY$="":WEND: 'Pausa
1305 CLS

Incluso es fácil hacer que se vuelva a ella al terminar una partida:
4260 LOCATE 12,10: PEN colorPremio: PRINT " Partida terminada! "
4275 WHILE INKEY$="":WEND: 'Y esperamos una tecla
4290 GOTO 1265
Eso sí, deberíamos tener un par de precauciones: hacer que se vuelva a leer desde el principio de los DATA (con RESTORE) y destruir esos arrays que hemos creado (con ERASE) y que se intentarían volver a crear si saltamos al principio del programa sin ninguna precaución. Además, como puede que el usuario estuviese pulsando una tecla al terminar la partida, deberíamos esperar a que deje de pulsar el teclado, bien esperando un cierto tiempo, o esperando hasta que ninguna tecla esté pulsada o las dos cosas:
4260 LOCATE 12,10: PEN colorPremio: PRINT " Partida terminada! "
4265 FOR i=1 TO 500: NEXT i: 'Pausa por tiempo
4270 WHILE INKEY$<>"":WEND: 'Vaciamos buffer del teclado
4275 WHILE INKEY$="":WEND: 'Y esperamos una tecla
4280 CLS: RESTORE: ERASE xE, yE, velocE, pantalla$
4290 GOTO 1265
¿Y no hay opción de terminar la partida y volver al sistema operativo? No. No se trata de una característica que fuera habitual en los equipos de los años 80, en los que bastaba con pulsar el interruptor de apagado o incluso desconectar el cable de alimentación. No existían técnicas como la escritura diferida en disco duro que pudieran provocar problemas si apagábamos el equipo. Bastaba con esperar a que se apagase el LED que indicaba que la unidad de disco estaba activa... si es que el equipo tenía unidad de disco (cosa que ocurría en los CPC664 y CPC6128, pero no en el primer modelo, el CPC464). Por eso, nuestro juego no tendrá una opción "Salir".

32. Dibujar puntos y líneas

Los Amstrad CPC no distinguen entre modo gráfico y modo de texto. En cualquier momento podemos dibujar líneas y puntos en pantalla. Además, es algo fácil de hacer: la orden PLOT dibuja un punto (indicando las coordenadas X e Y) y la orden DRAW dibuja una línea hasta otro punto (también a partir de sus coordenadas X e Y). El color a usar se indica en un tercer parámetro, que es opcional tanto para PLOT como para DRAW. Por ejemplo, podemos dibujar un marco de doble línea alrededor de la pantalla así:
1280 PLOT 0,0,colorPremio: DRAW 639,0: DRAW 639,399: DRAW 0,399: DRAW 0,0
1285 PLOT 5,5,colorPared: DRAW 634,5: DRAW 634,394: DRAW 5,394: DRAW 5,5

Las coordenadas de la pantalla van desde la (0,0), que es la esquina superior izquierda, a (639,399), que es la esquina inferior derecha, independiente del modo gráfico que se utilice. Las imágenes se verán más definidas en MODE 2 y menos en MODE 0, pero los tres modos responden exactamente al mismo sistema de coordenadas.
No tenemos órdenes para dibujar rectángulos, ni polígonos, ni círculos, sino que deberíamos crear estas figuras a base de líneas. Lo mismo ocurre para cualquier otra figura compleja. Tampoco existe una orden que permita rellenar figuras en toda la gama CPC (sí existe en los CPC664 y 6128, pero no en los CPC464).
Dentro de poco veremos también como incluir pantallas de carga, que muestren imágenes prediseñadas, que podremos haber creado con un equipo moderno o incluso capturado con una cámara digital o un scanner.