APRENDE 4 PROGRAMAR
ANIMACIÓN
Diseño: Cooper West Edición: Nigel Cawthorne Programas: Marcus Milton David Rosam Programas MSX Angel García García Ilustraciones: Gerard Brown
Traducción: Angel García García
El traductor desea expresar su agradecimiento a Gustavo Flores Maza por su colaboración en este libro
Queda prohibida la reproducción total o parcial de la presente obra bajo cualquiera de sus formas, gráfica o audiovisual, sin la autorización previa y escrita del editor, excepto citas en revistas, diarios o libros, siempre que se mencione la procedencia de las mismas.
Título original: COMPUTER ANIMATION
O 1985, Aladdin Books Ltd.
O 1986, de la edición española, E. G. Anaya. Villafranca, 22. 28028 Madrid.
I.S.B.N.: 84-7525-361-X.
Depósito legal: M. 20984-1986
Impreso por: Edime, S. A. Calle D, esquina a F. Polígono Industrial Arroyomolinos. Móstoles (Madrid) Impreso en España - Printed in Spain.
APRENDE A PROGRAMAR
ANIMACIÓN
Marcus Milton
ANAYA
AS
Introducción
Los gráficos por ordenador encierran muchas más sorpresas de las que te puedes imaginar. En lugar de limitarte a Jugar o ilustrar tus juegos puedes incluso escribir una historia, y construir tu propio programa lleno de color y gráficos tanto estáticos como animados. El programa se da para el sistema MSX y para el Spectrum y cuenta la historia de la Casa Encantada.
El programa ha sido dividido en bloques lógicos, y un texto paralelo explica cómo funciona cada sección. Escribir un programa en bloques lógicos no sólo lo hace más sencillo de entender tanto para ti como para otras personas; también reduce las posibilidades de error del mismo. Al finalizar determinadas secciones puedes probar lo que acabas de teclear; ten en cuenta que incluso el error más pequeño puede hacer que el programa no funcione. Si algo falla repasa los listados cuidadosamente. Asegúrate de que tu programa coincide con el del libro. Los siniestros acontecimientos que tienen lugar en la Casa Encantada emplean técnicas muy útiles de programación de gráficos. Por ejemplo, con un cuidadoso diseño de determinados caracteres definidos por el usuario en el Spectrum es fácil conseguir, mediante un programa en BASIC, un movimiento muy suave de las figuras.
A
Contenido
Gráficos MSX
Gráficos Spectrum
El escenario
10 12
PROGRAMA DE CONTROL E INICIALIZACION 13 MSX 14 SPECTRUM , 16 DIA 19 MSX 20
SPECTRUM
En I=LEN $ RETURN (R$)
HEN VB y $= ?* GOSUB 1500. TS(R$, 3),
Gráficos MSX
EL BASIC del MSX permite animar figuras de una manera muy simple mediante el uso de sprites. Estos son caracteres cuya forma podemos definir y mover por la pantalla. Podemos definir cuatro tipos de sprites: 8x8, 8x8 aumentado, 16x16 y 16x16 aumentado, según el número de pixels (puntos de la pantalla) y el tamaño de éstos.
Veamos sobre un ejemplo cómo definir un sprite y cómo moverlo por la pantalla.
SCREEN 2,2 FOR I=1 TO 32:READ N:A$=A9$+CHR$ (N) : NEXT
SPRITES (1)=4$
FOR J=240 TO 1 STEP -1:PUT SPRITE 1,(J,1):
FOR I=1 TO 50:NEXT: NEXT
GOTO 46
DATA 0,0,0,112,120,60,30,127,255,255,127,1,0,0,0,0, 0,9,9,4,14,30,62,254,255,255,254,254,240,120,60,28
O 06000
O
La línea 10 selecciona el modo de pantalla 2 —modo gráfico de 192x256 pixels— y los sprites de tipo 16x16. En las líneas 20 y 30 definimos el sprite leyendo los 32 datos necesarios (pues para el sprite de 16x16 necesitamos 32 bytes) y asignando una cadena de caracteres a la variable SPRITE $. El argumento de esta variable (1 en este caso) selecciona el plano de definición de ese sprite. Para entenderlo imaginemos la pantalla del monitor o televisor compuesta por una serie de capas (PLANOS). Las imágenes en los planos más cercanos al observador —planos inferiores— parecen pasar por delante de las de los que se encuentran en planos posteriores. La línea 40 se encarga de mover el sprite por la pantalla; para ello indicaremos, en este orden, de qué sprite se trata, sus coordenadas y el color en que queremos que se imprima.
Después de los planos de sprites se encuentra el “plano multicolor”. En él es donde aparecen las imágenes creadas por manejo de textos y los comandos gráficos usuales PRINT, DRAW, LINE... No obstante podemos modificar las imágenes que aparecen en este plano para crear figuras más sofisticadas como los árboles que veremos en la Casa Encantada.
Para ello hay que acceder directamente a la memoria de vídeo del ordenador. El proceso es relativamente complejo y aquí sólo pretendemos dar una idea general del mismo. Toda imagen en la pantalla viene definida por las posiciones de memoria de la VRAM
(memoria de vídeo). En el modo 2 (gráfico) ésta se divide en cinco bloques: tabla de patrones, que nos da la definición de cada carácter en la pantalla de forma análoga a la de los sprites; tabla de nombres, que nos indica para cada posición de pantalla dónde se encuentra en la tabla de patrones la definición de dicha posición; tabla de colores, que nos da el color de fondo y de primer término de cada byte —8 pixels horizontales— de la tabla de patrones; tabla de patrones de sprites, sobre la que podemos actuar directamente para definir los sprites y, por fin, la tabla de atributos de sprites, que nos da la posición, color y número de patrón de cada sprite.
Veamos el proceso que hay que seguir para crear una imagen en el plano de fondo. En primer lugar definiremos en la tabla de patrones la figura que pretendemos obtener de una forma análoga a la de definición de sprites. A continuación indicaremos en la tabla de nombres para las posiciones de carácter que pretendemos que tengan esa forma que el patrón se encuentra a partir de un lugar determinado de la tabla de patrones. Por último, si queremos, podemos modificar el color de cada carácter actuando sobre la tabla de colores.
Aunque el proceso pueda parecer bastante complejo, si lo manejamos con cuidado podemos llegar a obtener resultados sorprendentes. No obstante conviene acudir a un libro especializado para profundizar debidamente en el tema.
LA BASE DE LA DEFINICIÓN DEL SPRITE DE 16x16
SON CUATRO CUADRADOS DE 64 PIXELS
AA E OA Gráficos Spectrum
La forma usual de animar un cáracter desde el BASIC en el Spectrum es imprimir la figura, borrarla y volverla a imprimir en una posición contigua. Generalmente el efecto de movimiento no es muy bueno, pues la figura parece moverse a saltos. Y lo que es peor, las figuras no pueden moverse uno o dos pixels cada vez (deben localizarse en filas y columnas). No obstante, si imprimimos tres o cuatro formas apropiadas en el espacio de dos caracteres podemos crear la ilusión de que la figura se está moviendo sólo unos pocos pixels cada vez. Podemos conseguir un movimiento suave, libre de saltos, repitiendo este proceso sobre posiciones sucesivas de la pantalla.
Prueba este programa.
FOR A=65348 TO 65439 ¿READ D: POKE A,D: NEXT A 20 DATA 24,12,134,255,255,134,12,24: REM (A)
30 DATA 0,0,09,240,240,0,0,0: REM (B)
40 DATA 6,3,33,63,63,33,3,6:2 REM (0)
50 DATA 0,0,128,252,252,128,0,0:REM (D)
50 DATA 1,0,8,15,15,8,0,1: REM (E)
70 DATA 128,192,96,255,255,96,192,128: REM (F)
86 DATA 0,0,2,3,3,2,0,0: REM (6)
90 DATA 95,48,24,255,255,24,48,96: REM (H)
100 DATA 0,6,0,192,192,0,0,0:REM (1)
$ O
66
O
10
FOR F=6 TO 28 FRINT AT 2,P3” AB": PAUSE 3 FRINT AT 2,5". CD" PAUSE =
FRINT AT 2,P5" EF": PAUSE 3 PRINT AT 2,P53" GHI": PAUSE 3 NEXT P
Las líneas 110 a 160 mueven el avión suavemente por la pantalla. El secreto es que en realidad hay cuatro gráficos que parecen iguales, excepto porque están situados en posiciones diferentes. Cada gráfico se construye con dos o tres caracteres definidos por el usuario (líneas 120 a 150). La figura que se imprime en la línea 130 está localizada dos pixels a la derecha de la figura impresa en la línea 120; la figura de la línea 140 está situada dos pixels a la derecha de la de la línea 130, y así sucesivamente. El lazo entre las líneas 110 y 160 mueve el avión por la pantalla. El conjunto de caracteres definidos por el usuario que se imprimen en las líneas 120 a 150 es como una minisecuencia animada (al imprimir rápidamente la secuencia de gráficos de avión conseguiremos que éste parezca moverse incluso dentro de un sólo carácter). El lazo se limita a presentar en pantalla esta minisecuencia animada en cada carácter de la línea. El carácter que imprimimos justo antes de cada grupo de caracteres borra la última parte de la cola del avión, que de no ser así quedaría atrás según se mueve éste por la pantalla.
EL MOVIMIENTO DEL AVIÓN
SE CONSIGUE ¡MPRIMIENDO LA SERIE DE GRÁFICOS DE LA DERECHA. TODAS LAS FIGURAS SON IGUALES PERO ; COLOCADAS EN UNA POSICIÓN DIFERENTE
el
El escenario
Antes de comenzar con el programa tenemos que elaborar el argumento o guión de nuestra historia. El programa da vida a una casa encantada y comienza por dibujar la imagen de una casa antigua rodeada de un bosque fantasmagórico. Cae la noche... un rayo atronador despierta a los murciélagos del campanario y una vieja bruja sobrevuela la casa en su escoba. Mientras vuela en la noche caen más rayos y relámpagos, que alcanzan la casa y provocan el fuego en una de las torres. Las llamas se extienden y la casa entera se derrumba. Como dramática conclusión de la historia una tétrica calavera se alza sobre sus ruinas. La secuencia dura unos minutos. Conviene dibujarse un guión como el de abajo en un papel, de forma que puedas dividir el argumento en escenas y sucesos separados.
CASA ENCANTADA
LA CASA SE DERRUMBA
LA CASA ARDIENDO
APARECE LA CALAVERA
EL PROGRAMA DE CONTROL Y LA INICIALIZACION
Una vez que hayas planeado la historia puedes escribir el programa de control. Este te permite estructurar tu programa, dividiendo cada sección en una serie de bloques más pequeños y manejables. Esto lo conseguirás mediante el empleo de subrutinas. La primera sección te muestra cómo escribir el programa de control y preparar el ordenador para el comienzo de la animación.
rrroreno oe ts CCT AAA AEREA GAIA,
ACA PAR recio, OC er As RCA ras
La estructura del programa de control se ajusta al argumento. La mayoría de las subrutinas se utilizan una sola vez, como las empleadas para dibujar el castillo y los árboles. Las únicas subrutinas que se repiten son las llamadas en las líneas 100 y 110. Con ellas conseguimos mover el murciélago y la bruja por la pantalla.
REM Casa Encantada
CLEAR 200, 61482!
SCREEN 2,2:COLOR 1,3,1:0L5 GOSUB £500:REM Inicializar GOSUB 20668:REM Fondo
GOSUB 2500:REM Castillo GOSUB 45006:REM Arboles GOSUB 590%: REM Oscuridad N=4:GOSUB 1500:REM Rayo M=17300
FOR XB=9 TO 254 STEP 2 GOSUR 500:REM Murcielago GOSUB 1000:REM Bruja
IF XB=254 THEN FUT SPRITE 2,(0,209) NEXT XB
N=4:GOSUB 15060: REM Rayo GOSUB 5500:REM Fuego GOSUB £6006:REM Calavera END
0000000
El programa de control se limita a llamar consecutivamente a una serie de subrutinas para conseguir el dibujo en la pantalla. En la línea 70, antes de llamar a la subrutina Rayo establecemos el valor de N que será empleado por ésta para determinar el número de relámpagos. Asimismo la línea 80 actúa sobre la variable M necesaria en la subrutina Murciélago. Es conveniente trabajar de esta forma con las subrutinas, pues así se hacen mucho más flexibles.
REM Inicializar
FOR 1=61483' TO £1508!
READ N$:FOKE I,VAL("2£H"+N$) 2 NEXT DEFUSR=61 4323!
FOR I=BASE(12) TO BASE(12)+15: READ VFOKE (14+44096),N: NEXT
FOR I=BASE(12? TO BASE(12)+15:READ
O
VFOKE (14+4352),N: NEXT
FOR I=BASE(12) TO BASE(12)+15:READ VPOKE (1+4409),N: NEXT
FOR I=BASE (14)+32 TO BASE (14)+191:READ N: VPOKE I,N: NEXT RETURN
00
6
Ni
N:
N:
60000
14
7600
7010
702
7030
7040
7050
70656
70670
7086
345000000000
La subrutina Inicializar comienza en la línea 6500. Las líneas 6510 y 6520 se encargan de leer los datos necesarios para configurar un programa en código máquina que emplearemos para cambiar instantáneamente los colores de la pantalla. La línea 6530 fija la dirección a donde queremos llamar al comando USR. Las líneas 6540 a 6560 establecen la definición del árbol accediendo a la tabla de patrones y actuando sobre la misma. La línea 6570 modifica las posiciones correspondientes a la tabla de patrones de sprites generando así los correspondientes al murciélago (dos), la bruja, la luna y la llama.
Antes de continuar adelante graba el programa en cinta o disco, ya que un error en esta etapa puede bloquear por completo el
ordenador.
e.
DATA DB,79,21,00,20,0E,99,ED,69,ED,61,21,00,00,7E, 14,D3,98,23,7C,FE, 18,C2,39,F0,C9:REM Cod. maquima
DATA 16,129,73,40,16,80,48,9,128,32,74,134,164,683, 204,30,5,:38,178,27,31,15,3,3,48,96,192,192,194,244 io z 128, 1d. 1133. 3 7 0d 315172. 172172) 1209120, 128 1,224,252: REM Arbol
DATA 0,0,0,16,56,125,235,63,15,3,2,0,0,0,0,0,0,0,0 ,3,28,190,255,252,240,192,564,0,0,0,0,0: REM Murc. 1
DATA 0,0,0,0,0,13,31,673,63,67,26,24,8,0,0,0,0,0,0, 0,0, 1765,248,2532, 252, 252,88,24,16,0,0,0:REM Murc. 2
DATA 7+1,0,0,0,1,3,13979, 207,239 173,127) 1510,0,0, 12
,192,96,96,224,192,192,224,240,255, 192,128, 128,192 ,9,0:REM Bruja
DATA 3,14,28,56, 122,120,254,255,2535,248,248,96,1092 135,31,3,0,0,0,0,128,0,0,128, 128,0,0,4,12,152,248, 240: REM Luna
DATA 0:32. 32+34, 30331) 31,127,123, 236,2281100,33, 3
371710,0,17,1/,49,115,227,167,167,191,186,164,200, 268,224,224: REM Llama
DATA 521,535,5460,547,550,562,565,570,580,592,600,
610,637,646,657,661,667,636,691,696,700:
REM Posicion arboles
DATA 177,48,169,64,1479,84,91,84,71,64,63,48:
REM Posicion llamas
Ed 5 LoS ARBOLES SE
ACCEDIENDO
15
060000000000
DIR
UJAN DIRECTAMENTE AM
La estructura del programa de control se ajusta al guión. La mayoría de las subrutinas se emplean una sola vez, como la usada para dibujar el castillo y los árboles. Las únicas subrutinas que se repiten son llamadas en las líneas 100 y 110 dentro del bucle FOR... NEXT constituido por las líneas 90 a 130. Estas subrutinas mueven el murciélago y la bruja unos pocos pixels cada vez que son ejecutadas.
REM e RR RA
REM casa encantada
REM 18 bytes de codigo mequima alma linea 5
GO SUB 5500:
GO SUB 2006:
SO SUB 2500:
GO SUB 4500:
GO SUR 5006:
LET n=5: GO SUB 1500:
LET m=133%0
FOR b=6 TO 29
GO SUE 506: REM murcielago
GO SUB 10660: REM bruja
IF b=292 THEN FRINT AT 1,2903"
NEXT b
LET n=S: €O0 SUB 1506:
GO SUB 5506: REM fuego
GO SUB 4066: REM calavera
STOP
REM inicializar REM fondo
REM castillo
REM arboles
REM oscuridad
REM rayo
REM rayo
600000060
Como puedes observar en la línea 70 establecemos el valor de la variable n antes de entrar en la subrutina que dibuja el rayo. El valor de n nos dará el número de rayos a dibujar en esa subrutina (ver página 35). Es una buena técnica de programación escribir de esta forma las subrutinas que vamos a emplear bastante en el programa, ya que serán mucho más flexibles y versátiles. La línea 80 establece el valor de la variable m a su valor inicial antes de ser empleada en el bucle que mueve el murciélago y la bruja. Se ha preferido establecer su valor aquí en lugar de en la subrutina de inicialización para distinguir a qué parte del programa pertenece. La línea 120 se limita a imprimir tres espacios; éstos se emplean para borrar la bruja cuando esta alcanza la última posición de su trayectoria.
REM inicializar
FOR a=65368 TC £5527: REM introducir codigo REM de la linea 5
FOR i=23760 TO 223777: RETURN
READ di POKE ad: NEXT a maquina en la sentencia
READ d: NEXT i
POKE i,d:
16
700% DATA 16,129,77,40,16,80,48,9: REM arbol (A) 7010 DATA 128,32,74,134,164,68,204,306: REM arbol (B) 7020 DATA 5,38,178,27,31,15,3,3: REM arbol (0)
7030 DATA 48,96,192,192,192,244,152,128: REM arbol (D) 7040 DATA 1,1,1,3,3,7,31,51: REM arbol (E)
7056 DATA 192,192,192,128,128,128,224,252: REM arbol (F) 7060 DATA 8,16,48,32,96,96,233,224: REM luna (6)
7070 DATA 240,254,127,1173,48,54,31,6: REM luna (H)
00
35000
La línea 6500 es el comienzo de la subrutina de inicialización. La línea 6510 lee los datos dados en las líneas 7000 a 7190 y los sitúa en las direcciones especiales reservadas para caracteres definidos por el usuario. Las letras entre paréntesis que hay detrás de cada línea de datos te indican en qué letra en modo gráfico se ha guardado cada carácter. La línea 6530 lee los datos de las líneas 7510 y 7520 y los emplea para crear una pequeña rutina en código máquina. Este programa nos permite cambiar instantáneamente determinados colores de la pantalla cuando se necesita cambiar la escena de día a noche. Una vez que hayas tecleado hasta la línea 7540 comprueba con mucho cuidado lo que acabas de escribir, ya que cualquier error en esta etapa puede bloquear el ordenador al intentar rodar el programa. Lo único que puedes hacer si esto ocurre es desconectarlo y comenzar de nuevo. De ahí que sea conveniente guardar el programa en cinta al finalizar esta etapa, LOS ARBOLES SE DIBUJAN A BASE de modo que simplemente debas cargarlo de nuevo en lugar de DE CARACTERES DEFINIDOS volverlo a teclear si algo ha fallado. POR E USUAnIa
7030 DATA 1,2,6,230,19,255,17,226: REM bruja (1) 7090 DATA 0,6,0,128,240,128,0,06: REM bruja (J) 7106 DATA 9,0,1,57,4,31,4,56: REM bruja (K)
71106 DATA 64,129, 128,150,252,224,64,128: REM bruja (L) 7120 DATA 04,0,0,14,1,7,1,14: REM bruja (M)
7136 DATA 16,32,796,164,63,248,16,32: REM bruja (N) 7146 DATA 0,0,0,3,0,1,0,3: REM bruja (0)
7150 DATA 4,8,24,154,79,254,68,136: REM bruja (F) 7160 DATA 9,0,0,0,192,0,0,0: REM bruja (0)
7170 DATA 9,0,0,66,36,24,24,0: REM murcielago (R) 7186 DATA 0,0,0,0,0,235,24,6: REM murcielago (S) 7190 DATA 8,128,65,2,150,68,20,40: REM llamas (T) 7300 REM datos codigo maquina
7510 DATA 62,06,33,0,88,6,24,197,6,32
3209 DATA 119,35,16,252,193,16,245,201
7330 REM datos posicion ventanas
7340 DATA 10,22,8,23,14,19,14,127,10,79,8,8
Ó0O0000O
17
SD O >
Algunos de los caracteres del programa son creados empleando varias figuras; así, los árboles están constituidos por seis sentencias DATA que definen seis caracteres definidos por el usuario, como se muestra en la página anterior. La bruja, sin embargo, consta de nueve caracteres en total, ya que es animada empleando la misma técnica que la del avión en la página 10.
Puedes animar la forma que quieras empleando un programa similar y dibujando el gráfico en un diagrama como el que se muestra a continuación, imprimiendo las figuras en diferentes posiciones.
TT] LA BRUJA ES ANIMADA IMPRIMIENDO
FRTETTE MALE E LE
A eacramenre La misma PIsURa MIT ITTTItI] EN cuaATRO POSICIONES
a aaa ela
LIGERAMENTE DIFERENTES, EMPLEANDO MUEVE CARACTERES DEFINIDOS POR EL USUARIO
Es E ba bid E bd E Ll] 1 d
q Ej | || Ed | | A + OL E neo q
[E pl pd ES pd E] $ a E En E A
Es E: ES mM |] A E E] Dn 4 +
Ñ q $ E [E PER E
Ed i
7] E E E E o a |
E Ll] dl E
HH E
ES 111 7 ba E
apra
¡ 8 ES $e ES 3 7] a E 7] 5
SNA)
N rn A 7 | É V-4E =3
% ———_—_—_—_—_—— o
DIA
Esta sección del programa establece el escenario de fondo de día, la casa y el bosque fantasmagórico. También explica las subrutinas del programa de control incluida la sección que dibuja los árboles.
19
función seno.
2060 20160 ZO25 2070 2040 2050 2060 26760 2080 2090 2100 2110
2120
Esta subrutina dibuja el cielo y el primer plano, así como el camino que conduce a la puerta del castillo. La línea 10 del programa principal había establecido el color de fondo a verde y había borrado la pantalla. El bucle entre las líneas 2010 a 2030 dibuja 100 puntos negros situados en coordenadas aleatorias y simulan las piedras sobre el suelo. El cielo lo dibujaremos a base del carácter gráfico “MW” (no empleamos el comando PAINT pues puede dar problemas al cambiar los colores con el programa en código máquina). Es necesario emplear el comando OPEN “GRP:” para imprimir dicho carácter, ya que estamos trabajando en modo 2 —modo gráfico—. Las líneas 2050 a 2070 son dos bucles anidados que se encargan de dibujar el cielo, comenzando desde la esquina superior izquierda y terminando en el límite impuesto a las piedras del suelo. Las líneas 2080 a 2110 dibujan el camino. Este se consigue trazando una serie de líneas horizontales cada vez más anchas que comienzan en puntos dados por una
REM Fondo
FOR R=1 TO 1896
X=INT (RND(13x*255): Y=130+INT (RND(1)x66) FSE EX. Yi Ls MEJOT
OFEN "GRF:" AS $1: COLOR S
FOR Y=98 TO 120 STEF 8: FOR X=0 TO 248 STEF 8 FRESET (X,Y):FRINTH1,"N"
NEXT X:NEXT Y
I=15
FOR F=6%2 TO O STEF -2
XL IB ES IMEI) SO Z ESLINE (X.Y CAFE, YO 1 T=1+1.S: NEXT
RETURN
20
SES,
00
REM Castillo Xx1=80:Y1=72: X2=158: Y2=120:LAD= GOSUB REM Bloque frontal x1=64:Y1=40: xX2=80: Y2=80:LAD=79: GOSUE 3669: REM Torre izquierda
E $
Xx1i=158:Y1=40:xX2=184: Y2=80:LAD=709:
GOSUB 3600:REM Torre derecha
xX3=75: YS=8:50S5UB 35300:REM Tejado izquierdo Xx3=186: Y5=8: GOSUB 3500:REM Tejado derecho FOR Y=6£08 TO 72
ILENE 189, Y =CL6Z SY) 006
NEXT
008 00
$ 6
El castillo lo dibujamos mediante la subrutina que comienza en la línea 2500. Consta de tres volúmenes principales que se consiguen mediante la subrutina Bloque que explicaremos posteriormente. Antes de entrar en la misma es necesario establecer los parámetros que le servirán para determinar los límites de cada bloque. Las líneas 2510 a 2530 definen la posición de cada UTINA Edd , a LA SUBRUT! volumen así como el valor de la variable LAD (que emplearemos OQUE NECESITA | para simular el enladrillado) y llaman a dicha subrutina. A BL E PARÁMETROS continuación las líneas 2540'y 2550 actúan de forma parecida C/ERT DIBUJAR CADA sobre la subrutina Segmento encargada de dibujar los tejados de PA ÚGULO las dos torres laterales; establecen el valor del vértice de cada una REC y llaman a la subrutina. El bucle FOR... NEST entre las líneas 2560 y 2580 dibuja el tejado principal mediante unas líneas horizontales entre las dos torres. Para dibujar las seis ventanas emplearemos también otra subrutina —que comienza en la línea 4000— y que, como las anteriores, necesita de dos parámetros que indiquen la posición de cada ventana. Por fin la línea 2660 dibuja la puerta a base de líneas negras de anchura creciente hasta que alcanzan un máximo y lo mantienen.
2600 X=68: Y=47: GOSUB 40009
2610 X=76:Y=67:GOSUB 4006
26206 X=182: Y=47:GOSUB 4000
2630 X=174: Y=67:GOSUE 4000
2640 X=96: Y=83:G0SUB 4000
2650 X=154: Y=83: GOSUB 4090
2660 FOR Y=104 TO 127: 1F Y:2112 THEN LINE (232-Y,Y)-(24+Y,Y),1: NEXT ELSE LINE (120,Y)-(136,Y), 1: NEXT RETURN
S O
O ¡$
S
S O
21
6 REM Bloque
6 FOR Y=Y1 TOD Y2 STEF 8:FOR X=X1 TO X2 STEP 3 6 COLOR 79:PRESET (X,Y):FRINT $1,"B"
036 NEXT X:NEXT Y
3046 FOR Y=Y1 TO Y2+7 STEF 2
LINE (X1,Y)-(X2+7,Y>,1
NEXT Y
2076 COLOR 1:FOR M=1 TO LAD
A=INT (RND(1)x (X2-X1+7)+X1)2
B=INT (RND(1)*(Y2-Y1+7)+Y1):FSET (A,B),1 3090 NEXT M E
RETURN
SS 6060
e lod NS] ¿3
6 Le y
O
NS 4 e > O
La subrutina Bloque es la encargada de dibujar el frente del castillo y las dos torres. El efecto de enladrillado se consigue en tres etapas. En primer lugar se dibuja un fondo rojo. Para ello es necesario conocer los límites del rectángulo a dibujar; éstos vienen dados por X1, X2, Y1 e Y2 y son actualizados antes de entrar en la subrutina. Los bucles anidados entre las líneas 3010 y 3030 se encargan de dibujar el rectángulo base. La segunda etapa consiste en dibujar una serie de líneas negras horizontales sobre el rectángulo —líneas 3040 a 3060—; hasta ahora lo que tenemos es
un rectángulo rayado en rojo y negro. Para terminar el efecto de AL ¡MPRIMIR PUNTOS enladrillado dibujaremos una serie de puntos negros sobre el NEGROS ALEATORIOS bloque —líneas 3070 a 3090—. Las coordenadas de estos puntos soBRE El PO no deben rebasar los límites del muro. Los puntos negros sólo se RAYAS coNsES
: A : FECTO verán cuando estén sobre rayas rojas. es ENLADRILLADO La subrutina Segmento —línea 3500— dibuja una serie de radios de circunferencia de centro XS, YS —parámetros asignados antes de entrar en la subrutina— y simula el tejado de las torres laterales. Por fin las ventanas son dibujadas mediante la subrutina que comienza en la línea 4000 por un procedimiento análogo al de la puerta.
3500 REM Segmento 39106 R=38
3520 FOR T=1698 TO 200 STEP 2
35306 A=Tx3.14/180: X==RXASIN(A) : Y=RAxCOS(A)
Za ILTNE (XS. 1SI= ASF As VO= Ye 6
2550 NEXT 25056 RETURN
SS
O S
4000 REM Ventana 4610 I=5
40620 FOR J=Y TO Y+17:1F J<Y+S THEN
LTNE (X4L/Z,. dd) CX6=1/2.0)0 13 11-12 NEXT
EESE LINE (Xd) Ext: ds LONEXT
RETURN
2
43506 REM Arboles
4510 DIM A(Z21)
4520 FOR J=1 TO 21: READ N:A(J)=N:2NEXT
4536 FOR J=i TO 21
4540 I=BASE(10)4+A1J>
230 VRFOKE (1)¿09VEOKE (I+1), 1SVPOKE (I+327.4325 VFOKE (1423) ,33:VPOKE (1+64),64: VPOKE (1+65),65
4566 NEXT J
457% R=153066: GOSUB 300
526 RETURN
6080808 00060
O S
Sólo queda añadir los árboles para completar la escena. Esto lo lleva a cabo la subrutina que comienza en la línea 4500. El proceso ya se ha indicado en la introducción. En primer lugar hay que definir la forma de los árboles accediendo a la tabla de patrones (ésto ya lo hicimos en la subrutina de inicialización, líneas 6540 a 6560). A continuación hay que indicar en la tabla de nombres, en cada posición de pantalla que queremos que contenga parte del árbol, dónde se encuentra la información que define dicha porción. Una vez hecho esto aparecerá el árbol en pantalla.
En primer lugar la línea 4510 DIMensiona la matriz que va a contener las posiciones de pantalla correspondientes a la esquina superior izquierda de cada árbol. El bucle 4520 asigna a esta matriz los valores correspondientes. A continuación el lazo constituido por las líneas 4530 a 4560 se encarga de alterar las posiciones oportunas de la tabla de nombres para indicar dónde se encuentra la definición de cada porción de árbol. La línea 4570 introduce un retardo que lleva a cabo la subrutina que comienza en la línea 300 —un simple bucle FOR... NEXT que cuenta de laR.
Con esta subrutina has completado la parte del programa encargada de dibujar el escenario de la acción.
23
Debes tener mucho cuidado al proyectar cualquier clase de gráficos en el Spectrum, ya que éste no te permite usar mas que un color para el fondo y otro para la tinta en cada carácter. La subrutina Fondo, que comienza en la línea 2000 borra la pantalla y la pasa a color verde (PAPER 4). Un bucle FOR...NEXT elige 100 coordenadas aleatorias en la mitad inferior de la pantalla y dibuja un punto negro en cada una. Estos puntos simulan rocas, y ayudan a romper la monotonía del suelo. El cielo se dibuja cambiando el color a cyan (PAPER 5) y usando dos bucles FOR... NEXT anidados para imprimir una serie de espacios coloreados en la mitad superior de la pantalla. La línea 2080 pasa la tinta a color negro para dibujar la línea del horizonte que separará tierra y cielo. A continuación se fija el valor de la variable i a cuatro antes de entrar en otro bucle que se encarga de dibujar el camino. Este lo conseguiremos trazando una serie de líneas horizontales cada vez más anchas que comienzan en puntos dados por una función seno. La anchura creciente se consigue incrementando el valor de la variable i que nos da el número de pixels que debe contener cada línea horizontal. La subrutina
finaliza en la línea 2130.
20608 REM fondo PAPER 4: INK 62 TLS FOR r=i TO 160 LET x=INT (RND*255): NEXT ri: FPAFER S FOR y=98 TO 12: FOR PRINT IAT Y." U: NEXT x: NEXT y INE O ELOT 6,72: DRAW 255,6: FOR p=39 TO 6 STEF -2 PLOT 130*SIN (p/30),p: NEXT p RETURN
LET y=INT
x=6 TO REM espacio
(RNDx80): FLOT x,y
SL LET 1=4
DROW 1,0: LET i=i+2
24
25006 REM castillo
2510 LET x1i=102: LET x2=21:2 LET yi=16: LET y2=16: LET lad=4006: GO SUB 3600: FEM bloque frontal
2320 LET x1=8: LET x2=162 LET yi=6: LET y2=11:
S O
O LET lad=106: GO SUB 3606: REM bloque torre izda. 2330 LET.x1=21: LET.x2=231 LEFT yi=6: LET y2=11: LET lad=100: GO SUB 20602 REM bloque torr= dcha.
Ss E G LET ys=159: R E R
2340 LET xs=75:1 90: REM segmento tejado torre izda. 25590 LET xs=179: LET ys=159: GO SUB 35006: REM segmento tejado torre dcha. FOR r=88 TO 163
2570 PLOT 88,r: DRAW 79,0 2580 NEXT r
SIMS O
La subrutina castillo, que comienza en la línea 2500, se encarga de dibujar el edificio. No obstante es la subrutina bloque —línea 3000— la que consigue dibujar el enladrillado del frente y las dos torres laterales. Las variables x1, x2, yl, e y2 establecen la posición del bloque que debe ser rellenado de ladrillos, y se estudiarán con detalle en la página siguiente al describir la subrutina bloque. Las líneas 2540 y 2550 establecen los vértices de los tejados de las torres antes de llamar a la subrutina 3500 que se encarga de dibujarlos. Un bucle FOR.... NEXT entre las líneas 2560 y 2580 dibuja el tejado principal mediante una serie de líneas horizontales entre las dos torres. La línea 2590 imprime una serie de cuadrados para representar las almenas de la parte frontal. El símbolo 8 entre las comillas indica que debes poner el ordenador en MODO GRAFICO (pulsa CAPS SHIFT y 9) y pulsar la tecla 8. A continuación se dibujan seis ventanas mediante la subrutina 4000. Como antes las líneas 2600 a 2650 definen la posición de cada ventana antes de entrar en la subrutina que se encarga de dibujarlas. Por último la línea 2660 emplea el carácter gráfico 8 para imprimir una puerta. Esta consta de cuatro caracteres de este tipo.
23570 FOR b=12 TO 206 STEP 2:
FRINT AT 14,.b3"8”"s NEXT 63 SEM (€) LET x=68: LET y=162: GO SUE 4066 ¿2616 LET x=76: LET y=88: GO SUB 46060 2620 LET x=182: LET y=102: GO SUB 4000 LET x=174:2: LET y=88: GO SUB 4600 2640 LET x=96: LET y=56: 60 SUB 46900 LET x=157: LET y=56: €O0 SUB 4006 FRINT AT 15,153"38"34T 15,15;”88": REM 18), 1875 68), (8)
RETURN
oo 060808
6 bh o dl >
O NA So 58 O
e t) o 3
S
25
3000 REM bloque ¿30109 FOR y=y2 TO y1 STEP -—1: FOR x=x1 TO
3030 NEXT x: NEXT y
3059 FOR y=y2 TO y1 STEP -2
306
7076 NEXT y 2080 FOR m=1 TO lad 3096 LET a=INT (RND*(x2=x1+7)+x 1):
SS
LA o
NEXT m RETUEN
Ss
La subrutina bloque se emplea para dibujar el frente de la casa y las dos torres laterales. Veamos cómo conseguir el efecto de un muro de ladrillos. En primer lugar se dibuja una serie de espacios en rojo (PAPER 2) entre los límites dados por las coordenadas mediante los bucles FOR... NEXT en las líneas 3010 a 3030. De esta forma conseguimos la base del muro. Sobre ésta se dibuja una serie de líneas negras horizontales comenzando en pixels alternados a lo largo del eje y mediante el bucle entre las líneas 3050 y 3070. Hasta ahora lo que tenemos es un rectángulo rayado en rojo y negro. Para transformarlo en un muro enladrillado dibujaremos una serie de puntos negros situados al azar en dicho rectángulo. La variable lad contiene el número de puntos a distribuir. PLOT a,b, se encarga de dibujar dichos puntos en la posición x,y. Estas coordenadas se calculan de modo que se encuentren siempre dentro de los límites del muro. Los puntos negros sólo se verán cuando se dibujen sobre líneas rojas. De esta forma se completa el efecto de enladrillado. La subrutina segmento —-que comienza en la línea 3500— se limita a dibujar un sector de círculo de radio 39 pixels y de centro las coordenadas xs, ys para conseguir los tejados de las dos torres laterales. Las ventanas se dibujan en la subrutina que comienza en la línea 4000 mediante un lazo que traza una serie de pequeñas líneas negras horizontales.
A————_—_—_—_9==============_——_——
33900 REM segmento 3310 LET r=2309:2: INE 3 55206 FOR t=156 TO 200
3946 FLOT xs,ys: DRAW x,y 23350 NEXT +t
35966 RETURN
409 REM ventana
5011 NEXT w 4020 RETURN
060000
He
3020 FAPER 2: FRINT AT y,x3" "2: REM espacio 3040 LET x1=x1%8: LET x2=x2*8: LET yi=y1*8: LET y2=y2x*8
3050 INK 0: PLOT x1,168-y: DRAW (x2-x1)+7,0
LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b
2036 LET a=txP1/186: LET x=rx*SIN (a): LET Y=r*COS (a)
4018 INE 0: FOR w=y TO y+10: FLOT x,w: DRAw E,
O
”
SS
SE)
MURO A NCADRILLADO sE ] cowvsIGUE DISTRIBUYEND PUNTOS NEGROS ALEATORIOS SOBRE LOS TRES RECTÁNGULOS EN ROJO LY NEGRO QUE CONSTITUYEN
LA CASA
30000
26
4360 REM arboles
4519 FAFER 4: INK 0: OVER 1
4520 FOR t=1 TO 30
4530 LET x=INT (RND*293: LET y=13+INT (RND*7>
1540 1F (x>8 AND x<22 AND yx17) THEN GO TO 4536
4556 FRINT AT y,x3"AB"3AT y+1,x3"CD"30T y+2,x3 "EF": REM (8), 1B)3 0). (D)3 tE), (F)
4566 NEXT t
4576 OVER 0: FAUSE 200
245806 RETURN
O O
SO SS
O O
Sólo queda añadir el bosque siniestro para completar la escena de día. La subrutina de la línea 4500 dibuja 30 árboles en posiciones aleatorias sobre la hierba. Cada árbol tiene un color verde de fondo (PAPER 4); de ahí que sea necesario asegurarse de que no se va a imprimir en el cielo —línea 4530— ni sobre la casa
—línea 4540.
Cada árbol se compone de seis caracteres, agrupados de dos en dos, en tres bloques (línea 4550). La instrucción OVER 1 en la línea 4510 tiene el efecto de hacer un carácter transparente, de modo que al imprimirlo sobre otro se vean ambos. Cuando parte de un árbol se imprime sobre otro es posible ver a través del que está en primer plano. Una vez que se han dibujado todos los árboles, la instrucción OVER 0 en la línea 4570 recobra la impresión normal.
Tras una pequeña pausa la subrutina finaliza con una instrucción RETURN y se devuelve el control al programa principal. Una vez que hayas añadido esta subrutina al programa habrás completado todas las rutinas que dibujan la escena.
27
Prueba tu programa
Antes de continuar introduciendo la siguiente parte del programa conviene guardarlo en cinta (“salvarlo”). Encontrarás las instrucciones oportunas en el manual del usuario. Puedes, no obstante, probar lo que llevas hecho hasta ahora siguiendo las instrucciones de abajo. Si no has cometido ningún fallo al introducir el programa verás aparecer el fondo, el castillo y los árboles. Si hay algún error repasa tus listados y compáralos con los del libro.
MSX : TECLEA 55
GOTO 55 Y PRUEBA EL PROGRAMA.
PULSA CTRL-STOP UNA VEZ HAYAS COMPROBADO QUE EL PROGRAMA FUNCIONA CORRECTAMENTE. BORRA LA LINEA 55 ANTES DE CONTINUAR CON LA SIGUIENTE SECCION
SPECTRUM: TECLEA 55 GOTO 55, Y PRUEBA EL PROGRAMA. PULSA LAS TECLAS CAPS SHIET Y BREAK UNA VEZ HAYAS COMPROBADO QUE EL PROGRAMA FUNCIONA CORRECTAMENTE.
-| BORRA LA LÍNEA 55 ANTES DE CONTINUAR CON LA SIGUIENTE SECCION
28
A estas alturas conviene dibujar sobre el papel todos los efectos que vayas a introducir. Conoces las dimensiones de la casa, de forma que puedes distribuir todas las secuencias animadas a su alrededor. Plantéalo todo sobre el papel,.así podrás estudiar si alguno de los caracteres colisiona con otro, o si se desplaza a algún lugar que no deba. Ten cuidado de no borrar los gráficos que ya has dibujado imprimiendo encima de ellos.
5050 REM Gscuridad
5610 FRINT USR(G)
Soz20 FUT SFRITE 4, (15,8,160 5907306 R=1606: GOSUB 2300
5046 RETURN
Para pasar de día a noche debes cambiar alguno de los colores de la pantalla. El BASIC del MSX no lo permite con un comando directo, de ahí que haya sido necesario introducir un programa en código máquina —mucho más rápido— que lo realice. El funcionamiento de este programa es muy simple; se limita a cambiar todas las posiciones de memoria de la VRAM
500 REM Rayo 1510 FOR I=1 TO N
1520 FSET (240,0):DRAW "C1163ZR16631"” 1530 POKE 61498!',2H1F:PRINT USRCO) 1540 R=200:GOSUB 200
1550 POKE 61498!,2£H14:PRINT USR(09) 15606 PSET (240,0):DRAW "C1632R16631" 1570 R=400:GOSUB 2090
1580 NEXT 1
15909 RETURN
306aSs
300
O
sr
correspondientes a la tabla de colores e introducir en ellas el mismo valor, de forma que casi instantáneamente la rutina consigue que todos los colores de fondo pasen a azul oscuro y los correspondientes a primer término pasen a negro. No obstante puedes cambiar estos colores alterando la posición de memoria 61498 que contiene el valor a introducir en las posiciones de memoria anteriores, como luego veremos.
La línea 5010 pasa el control a esta rutina en código máquina, a continuación se imprime la luna en color amarillo colocando el sprite 4 en la posición oportuna. Por fin la línea 5030 introduce un nuevo retardo basado como antes en la subrutina 300.
La subrutina Rayo produce un relámpago y dibuja un rayo cuatro veces seguidas —tantas como indique el parámetro N—. El rayo se consigue mediante la línea 1520, que dibuja una línea quebrada amarilla. A continuación la línea 1530 altera la posición de memoria que contiene los códigos de colores para la rutina en código máquina haciendo que el fondo pase a ser blanco —de código de color F— (15 en hexadecimal)— y el primer término negro —de código de color 1—; tras ésto se llama a la rutina en máquina. Después de un pequeño retardo la línea 1550 restablece los colores iniciales y la 1560 borra el rayo dibujándolo de nuevo
en negro.
FONDO AZUL OSCURO
| ' ' | |
ESOO
PRIMER | TERMINO | NEGRO
AS
FONDO BLANCO
LA SUBRUTINA EN CODIGO MÁQUINA SE ENCARGA DE CAMBIAR INSTANTÁNEAMENTE LOS COLORES DE
LA PANTALLA
PRIMER TERMINO NEGRO
3l
REM Murcielago
IF Mí50 THEN XM=XM+2:G0TO 5730
M=M-15: A=M43. 14/1859: XM=120+ INT (40x*SIN(A)): Yi=30+ INT” (23x*CD05S(00))
PUT SFRITE 1, (XM,YM, 13
R=96:GOSUB 300:FUT SPRITE 1, (6,209)
RUT SERTTE 2, (XM, YM), 13
R=20:GOSUB 3002: PUT SPRITE 2,(0,209)
RETURN
0000
El movimiento de la bruja y el murciélago lo controlan las líneas 80 a 130 del programa principal. La subrutina Murciélago —línea 500— emplea la variable M para calcular la trayectoria entre las dos torres. Inicialmente vale 1300 —línea 80— y cada vez que se ejecuta esta subrutina se decrementa 15.unidades. Cuando M supera cierto valor la línea 520 calcula sus coordenadas, que corresponden a las de una elipse, y actualiza el valor de M. Si no lo supera, la línea 510 habrá modificado XM para que el murciélago siga a la bruja. La línea 530 coloca el sprite 1 —murciélago con las alas abiertas— en dicha posición y tras un retardo la línea 540 lo borra de la pantalla haciendo que su posición vertical valga 209. A continuación se repite el mismo proceso con el murciélago con las alas cerradas —líneas
550 y 560.
1000 REM Bruja
1010 YB=32+24x*SIN(XB*2x3. 14/2549) 1020 PUT SPRITE 3,(XB,YB),3 1030 RETURN
El movimiento de la bruja es más simple pues su coordenada horizontal es incrementada de dos en dos en la línea 90 y su coordenada vertical se calcula en la línea 1010 de forma que trace una sinusoide en la pantalla. La línea 1020 coloca el sprite correspondiente en su posición. Cuando la bruja llega al final de la pantalla, la línea 120 del programa principal lo detecta y la hace desaparecer.
Para dibujar el fuego en la casa podríamos haber optado por definir el mismo sprite (llama) en diferentes planos y haber colocado estos sprites por toda la casa, teniendo en cuenta que no puede haber más de cuatro en la misma línea. No obstante se ha elegido un procedimiento más ingenioso, ya que con un sólo sprite podemos dar la sensación de que el fuego se extiende y la casa entera arde.
En primer lugar la línea 5510 DIMensiona la matriz que va a contener las coordenadas x e y de cada llama (estas son tales que
5506 REM Fuego
3310 DIM FC(2,6)
55920 FOR G=1i TC 4
55306 READ X,Y:F(1,6)=X:F (2,6)=Y 5540 NEXT G
5550 N=0
95664 FOR T=1 TC 4 5570 N=N+1
5380 FOR D=1 TO 3 35539% FOR J=1 TON SEDO FUT SPRITE a (FU. EZ ds dl 5610 FUT SPRITE 5, (0,209)
620 NEXT J:NEXT DINEXT T
5630 FOR Y= 8 TO 96 STEF 8:FOR X=56 TO 200 STEF 8 5640 COLOR 1:FRESET (X,Y):PRINT*1,"LC"
5650 NEXT X:NEXT Y
o
06000000
el fuego parece salir de las ventanas). Las líneas 5520 a 5540 rellenan dicha matriz con los datos de la línea 7080. A continuación, tres bucles anidados se encargan de animar la escena. El fuego se imprime en amarillo en las posiciones dadas por F(1,j) y F(2,j) en la línea 5600, y la línea 5610 lo borra; ésto se repite 30 veces, de forma que las llamas titilan. Según aumenta N,
J va tomando distintos valores, lo que hace aparecer una nueva llama en otra ventana, hasta que el fuego alcanza la última.
La casa se derrumba mediante el bucle 5630 a 5650, que imprime un rectángulo negro sobre la misma.
O
6645 REM Calavera
é6615 COLOR 15
60206 CIRCLE (123,40),36,15,0,3.1457:FSET (92,738): DRAW"M+20, 56R32M+20,-36"”
60636 CIRCLE (112,40) ,8: CIRCLE (144,460),8
606340 PSET(116,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U 8R4D1264L 4U41L.4D4L 41/41 4D4L 4U41 4D41L 4H4U 12"
6056 FSET (126,944): DRAW "Di6H9M+4,-12"
6660 FSET (12306,44):DRAW "Di£6 ESM-4,-12"
5070 PAINT (128,5),15,15
6680 R=3000: GOSUB 2300
6676 CLOSE +1
£1006 RETURN
SO
08
La fantasmagórica calavera que se cierne sobre las ruinas de la casa se consigue mediante la subrutina Calavera. Gracias al macrolenguaje gráfico que posee el sistema MSX podemos crear cualquier figura con facilidad. Así, la línea 6020 dibuja el contorno. Este se compone de un semicírculo y tres líneas rectas que unen sus extremos; todo se dibuja en color blanco (15). La línea 6030 dibuja los dos ojos y la 6040 la boca a base de una poligonal cerrada. Por último, las líneas 6050 y 6060 se encargan de trazar dos triángulos que simulan la nariz La sentencia PAINT (línea 6070) elige un punto interior a la figura y pinta el interior de la misma de blanco. Tras un retardo, la línea 6090 cierra el fichero que abrimos al principio del programa, mediante una sentencia
CLOSE.
300 REM Retardo 310 FOR K=1 TO R2NEXT 3206 ¿RETURN
Unicamente queda analizar la subrutina Retardo que, como habíamos apuntado, se limita a contar de 1 a R, con lo que el tiempo que tardará en ejecutarse será proporcional al valor de esta variable.
e AI E 7
S
TURN
REM oscuridad
POKE 23761,1: RANDOMIZE USR 2376%
PAFER 602 INK 6: PRINT AT 3,33"G":308T 4,353"H": REM (6): (1H)
PAUSE 1060
RETURN
(A A]
in 2
Para pasar de día a noche hay que cambiar algunos colores de la pantalla. El BASIC del Spectrum no lo permite, de ahí que haya que emplear el código máquina que habíamos introducido. El programa en código máquina se activa en la línea 5010; todos los pixels correspondientes a tinta se cambian a azul oscuro, y los correspondientes a papel a negro. RANDOMIZE USR significa “ejecuta el programa en código máquina” que comienza en la dirección de memoria indicada. La línea 5020 imprime la luna en color amarillo y, tras una pequeña pausa, la subrutina finaliza.
El programa de control llama ahora a la subrutina rayo que comienza en la línea 1500. Una serie de instrucciones PLOT y DRAW dibujan una línea negra quebrada desde la esquina superior derecha de la pantalla. El rayo no se ve hasta que la línea 1530 llama al programa en código máquina, que cambia los pixels del rayo a blanco (POKE 23761,7). El código máquina cambia el color de la luna, de ahí que la línea 1540 la imprima de nuevo en amarillo. Esto ocurre tan rápidamente que la luna parece no
cambiar de color. Después de una pequeña pausa en la línea 1545 la rutina en máquina vuelve a cambiar el color de la tinta a azul. La línea 1560 restablece la luna en amarillo y el rayo se borra imprimiéndolo de nuevo en negro. Tras una pequeña pausa se repite el bucle otras cuatro veces, ya que habíamos fijado la variable n a cinco.
REM rayo
FOR 1=1 TO nm
INK 6: FLOT 255,176: DRAW -27,-4%€: DRAN 10,0: DRAW -29,-40
POKE 23761,7: RANDOMIZE USR 23/69
INK 6: FRINT AT 3,35"6"30T 4,3 5H": REM (635 (H) FAUSE $
6 POKE 23761,1: RANDOMIZE USR 23/66
INK 6: PRINT AT 3,35"G"30T 4,33"8H": REM
INK 62: FLOT 255,176: DRANWN -39,-40: DRÁN
DRÁAW -29,-406
FAUSE 1
NEXT 1
RETURN
$)
pe pa pos
sm
Y
Cn cn CA ji 5
S
Oo
60868
900
006
Oo
REM murcielago
IF m<150 THEN LET xm=xm+1: 60 TO 5230
LET m=m-8: LET a=m*P1/180:
LET xm=16+I1NT (4.5*SIN (a))
LET ym=4+INT (3.5*C0S la))
FAFER 0: INK 7: FRINT AT ym,xm3"R":* REM (R) PAJSE 3 . FRINT AT ym,xmi3"S"2 REM (5)
PAUSE
FRINT AT ym,xmi3" "2: REM esp
RETURN
Si analizas las líneas 90 a 130 del programa de control (que corresponden a un bucle FOR... NEXT), verás que el murciélago y la bruja son animados simultáneamente. La subrutina murciélago, que comienza en la línea 500, emplea la variable m para calcular las coordenadas de la trayectoria elíptica que sigue el murciélago entre las dos torres.
Sin embargo, antes de realizar ningún cálculo, la línea 510 estudia el valor de m. Si éste es menor que 150 el murciélago deja de dar vueltas y parece intentar cazar a la bruja. Si m no es menor que 150, la subrutina salta a la línea 520, donde se emplean las funciones SENO y COSENO para dibujar el camino espiral. A continuación se imprime el murciélago batiendo sus alas alternando los caracteres R y S.
La bruja se anima de distinta forma al murciélago mediante la subrutina que comienza en la línea 1000. Esta subrutina opera de la misma forma que la rutina que animaba el avión al comienzo del libro, mediante diferentes caracteres definidos por el usuario impresos consecutivamente en cada posición de carácter a través de la pantalla.
Antes de imprimir cada grupo de caracteres correspondientes a la bruja se llama a la subrutina murciélago. De esta forma conseguimos que el movimiento de aquella sea mucho más suave, ya que mientras el murciélago se mueve un carácter la bruja sólo lo hace dos pixels. De no ser así el movimiento de la bruja sería mucho más brusco.
10006 REM bruja
1010 FAFER 02 INK 7
19206 PRINT AT 1,53" 1": GO SUB 560: REM esp, tt), (3) 1030 PRINT AT 1,b:” EL": GO SUB 500: REM esp, (K), (1) 1046 PRINT AT 1,03" MN”: GO SUB 500: REM esp, (M>, (N> 106506 PRINT AT 1,b5" OP": REM esp, (0), (P), (Q)
1060 RETUEN
55060 REM fuego
9910 DIM +4(2,5): INE 46: PAPER 6
2920 FOR g=1 TO 6
5930 READ y,x: LET ft1,g)=y2: LET 41(2,9)=x 5540 NEXT y
95950 LET n=09
5560 FOR t=1 TO 4
557% LET n=n+1
5586 FOR d=1 TO 230
55970 FOR j=1 TO n
5600 PRINT AT 4 (1,3), (2,j)3"T": REM (t) 56106 PRINT AT 4f(1,3),4(2,3)3" "2 REM espacio 3620 NEXT j: NEXT di NEXT t
3630 FOR y=2 TO 11: FOR x=7 TO 23
5640 FRINT AT y,x3" ": REM espacio
5650 NEXT x: NEXT y
5660 RETURN
35060000060
La animación de las llamas es bastante ingeniosa. Uno de los problemas es que el ordenador no puede tener más de un color de tinta y otro de papel en cada carácter. Para resolverlo haremos aparecer el fuego desde dentro del castillo, únicamente en las ventanas.
La línea 5510 DIMensiona una matriz, que guardará las posiciones de cada carácter correspondiente a una llama (T); estas posiciones se ajustan a las coordenadas de las ventanas. Las líneas 5560 a 5620 son tres bucles FOR... NEXT anidados. En primer lugar se imprime la llama en amarillo en la posición f(1,1) cuando j es igual a uno en la línea 5600. La línea 5610 imprime un espacio sobre el fuego. Este proceso se repite 30 veces haciendo vacilar la llama. Según aumenta n, j toma un nuevo valor, y el proceso se repite en cada ventana hasta que las llamas alcanzan la última
La casa se derrumba mediante dos bucles FOR... NEXT anidados en las líneas 5630 a 5650 que borran la casa con una serie de espacios en negro.
Go
60808
60
6060 REM calavera
6610 INK €
£0620 FOR 270 FO 430 STEFR =
60306 LET a=s*F1/180: LET x<=30x*SIN (23)
5040 LET y=40x*C0S (a: PLOT 127,135: DRAN x,y
6630 NEXT s: LET x1=67: LET x2=80 6066 FOR y=135 TO 27 STEP -1 5076 PLOT x1,y:2 DRAW x2,6:2: LET x1i=x1+.23s LET x2=x2-.4
6080 NEXT y 60970 FABER Os PRINT AT 65135" —"5AT 4,173" REM esp, esp:iesp,esp 6160 FRINT AT 8,155" ": REM espacio,espacio 6116 FRINT AT 10,143" "i REM espacio,espacio,espacio é61260 FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8 6130 IF FOINT (x,y)=1 THEN FAFER 6: INK INT (RND*(73)+1:2 FLASH 1: FRINT AT 22-y/3,x/8-13"6": FLASH 0: REM (6) NEXT x: NEXT y RETURN
54000000060
La fantasmagórica calavera que se cierne sobre la casa quemada se crea mediante la subrutina calavera. La parte superior es
un semicírculo que se dibuja en color negro (INK 0) mediante el lazo que comienza en la línea 6020, de forma que no se ve en esta etapa. El resto de la cara se consigue mediante otro lazo en las líneas 6060 a 6080 que dibuja una serie de líneas horizontales que se van haciendo cada vez más estrechas según nos acercamos a las ruinas de la casa.
La línea 6090 coloca los ojos con dos espacios en negro, y las líneas 6100 y 6110 hacen lo mismo con la nariz y la boca.
Recuerda que hasta ahora la cara es invisible, ya que está coloreada de negro sobre el cielo del mismo color. Para conseguir un efecto intermitente emplearemos la función POINT que estudia ciertos pixels sobre el área de la calavera. Si el pixel corresponde a tinta —en otras palabras, si POINT devuelve el valor 1— entonces se imprime el carácter gráfico 6 en esa posición con un color aleatorio y de forma intermitente (FLASH 1). La calavera parece emerger de las ruinas de la casa según el lazo la estudia desde la parte inferior hasta la más alta.
38
S0500050005
Almacena tus programas
A continuación se da el listado completo del programa tanto para MSX como para Spectrum. Compruébalos si aún tienes problemas. El listado MSX contiene líneas que no aparecen en el libro (las que terminan en 5). Estas se han añadido para conseguir efectos especiales en la ejecución del programa. Hacen que éste sea más tétrico y no lo retardan.
19 Lo 20 30 40 50 60 70 go 85 40 1006 110 120 130 146 130 1506 170 300 210 320 306 s10 SO
330 940 43 350 566 0 570 1000 1010 1020 oa 1500 13 1 1320 1230
15935
1340 1 15660 1570 1580 1590 20060 2010
Listados de los programas
REM Casa Encantada
CLEAR 260,61482!'
SUREEN 24 235 COLOR 1,3, 1: CL5
ON SFRITE GOSUE 8665: SPRITE ON GOSUBR £500:REM Inicializar
GOSUB 2600: REM Fondo
GOSUB 2500:REM Castillo
GOSUB 4506:REM Arboles
SOSUB 3000: REM Oscuridad
N=4:GOSUB 15060: REM Rayo
M=1300
BEEP
FOR XB=6 TO 254 STEP 2
GOSUR 5600:REM Murcielago
GOSUB 10006:REM Bruja
IF XAB=239% THEN FU SPRITE 3, 10, 209) NEXT XE
N=4: GOSUB 156006: REM Rayo
GOSUB 5500:REM Fuego
GOSUB 6600: REM Calavera
END
REM Retardo
FOR K=1 TO R:NEXT
RETURN
REM Murcielago
IF MíS506 THEN XM=XM+2:GOTO 530 M=M-1 3: A=M*73., 14/1809: XM=120+ INT (40*SIN(A)): YM=30+ INT” (23*C0S(A))
PUT. SPRATE da CAM, YM.
R=96: GOSUB 300: FUT SFRITE 1,(0,209) PLAY "T153L6458MS00016"
PUT SBPRLITE Ly (XML, YD A 1
R=20:GOSUB 300: PUT SPRITE 2,(0,209) PLAY "8"
RETURN
REM Bruja
YB=3 24 24xSIN(XBx24%, 14/2549)
PLUS SFRITE AB, YE), 2
RETURN
REM Rayu
FOR 1I=1 TO N
PFSET (240,6):DRAW "Ci1632R166G31" POKE 61498'*,2%H1F:FRINT USR(O)
SOUND 3%,€: SOUND 1,6: SOUND 2,6: SOUND 3,0: SOUND 4,06: SOUND 3,0: SOUND 6,31: SOUND 7,7: SOUND 8,146: SOUND 2, 16:SOUND 19,16: SOUND 11,6:SOUND 12,66: SOUND 13,0 R=200: GOSUB 2600
POKE 61493',2H14:PRINT USR (0)
PSET (240,0): DRAW "C16G32R16631" R=400: GOSUR 300
NEXT 1
RETURN
REM Fondo
FOR R=1 TO 106
Continuación MSX
2020 2030
2040 2050 2060
-— 2070
2030 2090 2100 21109 120 2300 210
300 20360 3046 3030 30560 2070 30890
2090 3100 35300 y IE Ed 3536 3540 do 35960 4000 4010 4020
4030 4300 4510 4520 4530 4340 4550
45409 4570 43286 5090 3010 5020 5030 50406 3300 33109
X=INT (RND(1)x255): Y=130+INT (RND(1)x050) PSET ¿Xs Y) ¿ 1ENEXT OPEN "GRP" AS +1: COLOR 5 FOR Y=06 TO 126 STEP 8:FOR X=0 TO 248 STEF 8 FPRESET (X,Y):FRINTH1,"N" NEXT X: NEXT Y I=16 FOR F=63 TO € STEP -2 X=138*SIN(P/60): Y=192-P:LINE (X,Y)-(X+I,Y),1 1=1+1.3:NEXT RETURN REM Castillo x1=80:Y1=72: xX2=158: Y2=120:LAD=300: GOSUBE 30606: REM Bloque frontal X1=64: Y1=40: X2=80: Y2=80:LAD=709: GOSUBE 30669: REM Torre izquierda xX1=158:Y1=40:x2=184: Y2=80:LAD=70: GOSUB 30606:REM Torre derecha XxS=75: YS=8:G0SUB 3500:REM Tejado izquierdo Xx3=180: YS=8:GOSUB 3560:REM Tejado derecho FOR Y=60 TO 72 LINE (89,VY)- (147, Y,56 NEXT X=68: Y=47:GOSUB 4009 X=75: Y=572: GOSUB 4506 x=182: Y=47:GOSUB 40590 x=174: Y=67:GOSUB 4000 Xx=96: Y=873:GOSUB 4600 x=154: Y=83: GOSUB 40960 FOR Y=104 TO 127: 1F Y<112 THEN LINE (232-W, Y)-(244+Y,Y),1: NEXT ELSE LINE (120,Y)-(136,Y),1:NEXT RETURN REM Bloque e FOR Y=Yi TO Y2 STEF 8:FOR X=X1 TO X2 STEP 8 COLOR 9:PRESET (X,VY):PRINT $€1,"p" NEXT X:NEXT Y FOR Y=Y1 TOD Y2+*7 STEP 2 LBNE 1X141I1=(X2387.W>.1 NEXT Y COLOR 1:FOR M=1 TO LAD A=SINT (RND(1)x(X2-X14+7)4X1)2 B=INT (RND(1)x*(Y2-Y1+7)+Y1):FSET (A,B)>,1 NEXT M RETURN REM Segmento R=38 FOR T=160 TO 200 STEP 2 A=T*3. 14/1806: Xx<=RxSIN(A) : Y=R*XCOS (A) LINE (XS,YS)-(XS+X, YS-Y),6 NEXT RETURN REM Ventana I=5 FOR J=Y TO Y+17:1F J<Y+S THEN LINE (X+1/2,3)-(X+6-1/2,3),1:1=1-1:NEXT ELSE LINE (X,J3)-(X+6,3),1: NEXT RETURN REM Arboles DIM A(21) FOR J=1 TO 21:READ N:A(J)=N:*NEXT FOR J=i TO 21 I=BASE (10)+A(J) VPOKE (1),0:VPOKE (1+1),1:VPOKE (1+32),32:7 . VPOKE (1433),33:VPOKE (1+64),64: VPOKE (1+45),65 NEXT J R=1000: GOSUB 300 RETURN REM Oscuridad PRINT USR(0) PUT SPRITE 4, (16,8),10 R=1000: GOSUB 300 RETURN REM Fuego DIM F(246)
Continuación MSX
3920
036 33040 3330 35060 3970 3380 3590 3600 3603
FOR G=1 TO 4
READ X,Y:F(1,6)=X:F (2,6)=Y
NEXT G
N=0
FOR T=1 TO 4
N=N+1
FOR D=1 TO 30
FOR J=i TON
PUT SPFRITE ue (Fl. Files), 11
FOR W=i TO INT(RND(-TIME>)%30):NEXT YW:
Z= INT (RND(-TIME)*150)+2:SDUND 6,Z: SOUND 1,15: SOUND 65,5:SOUND 7,£B10110110: SOUND 8, 16: SOUND : SOUND 13,4
PUT SPRITE 3, 10, 207)
NEXT J:NEXT D:¿NEXT T
FOR Y= 8 TO 96 STEF 8:FOR X=564 TO 206 STEF 8 COLOR 1:<PRESET (%X,Y)3FRINTH1,"L"
NEXT X:NEXT Y
REM Calavera
COLOR 15
CIRCLE (128,468),36,15,0,3. 19357%:PSET (92,38)3 DRAW"M+20, 56R32M+20,-S56"
CIRCLE (112,40),8: CIRCLE (144,460),8 PSET(110,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U 8R4D1 2G6G4L 4U4L 4D4L 4U4L 4D4L 4U4L 4D4L 4H4U12" PSET (126,44): DRAW "D146H4M+4,-12"
PSET (130,44):DRAW "D16 E4M-4,- 12"
PAINT (128, 0)+1302 12
S BEEP:FLAY "TI6S1MIGODOD1A/A8. A244072C8.D1B16BE8.A164
8.416A2"
R=:3000: GOSUB 300
CLOSE +1
RETURN
REM inicializar
FOR I=61483!' TO 61508!
READ N$:FOKE I1,VAL("2RH"+N$) 2: NEXT
DEFUSR=41 483!
FOR I=BASE(12) TO BASE (12)+15:READ N:
VPOKE (1+4096),N: NEXT
FOR I=BASE(12) TO BASE (12)+15:READ N:
VPOKRE (1+24332) . ME NEAT
FOR I=BASE(12) TO BASE(123)+13:READ N:
VPOKE (1+45089),N: NEXT
FOR I=BASE (14)+32 TO BASE (14)+191:READ N:
VPOKE 1,NsNEXT
RETURN
DATA DB,99,21,00,20,0E,979,ED,6579,ED,61,21,00,00,3JE, 14,03, 98,23, 70, FE,18,82,57+F0,L73REM Lod. maquina
DATA 16,129,7/3,40,16,80,49,9,128,321/4,154, 164,60,
204,30,5,38, 178, 27,31, 15,3,3, 48, 96,192,192,1794,242 ,152,128,1,1,1,3,3,7,31,31,192,192,192,128,128,128 12294,2092: REM Arbol
DATA 6,0,0,16,56,1235,239,63,153,3,2,0,0,0,0,9,0,0,0 ,8,28,190,255,252,240,192,64,0,0,0,0, dead Mura. 1
DATA o, 0,095,0,0,13,31» 63,63,67,26,724, 8,0,0,0,0,0,0s
0,0,175, 248, 252, 232,232 98,2%4,16,0,05 5 EEN Murc.2
DATA ES 1, Os o, o, 1,3,159, 207,255, 195,129, 140, 0,0, 120 ,192,96,96,224,192,192,224,240,255,192,128,128,192 19,0: REM Bruja
DATA 3,149,208) 504 122,120, 204.200 23931 218,2980,761, 1092 sd. 31. 310,1010,0, 12970,0,120, 120,0, 0,7% 12,152,248,
24012 REM Lunar
DATALOs ¿24 325. ds 0. 301,314 127,120, 2364 2208) LOW, y ul .72a7184,0,17/,17,1479,1139,227,167,1067,171,185,1069,2005
208,224, 224: REM Llama
DATA 521,535,5406,547,550,562,565,570,580,592,600,
610,637, 540, 5857,061+4657,068610671,6764 700:
REM Pasion Sas
DATA 177,48,169,64,1479,84,91,84,71,064,623,48:
REM Posicion llamas
FOR R=8S TO 256 STEP 155FOR T=1 TO 166 STEF 260: FOR A=1 TO T+15 STEP -15:SOUND 0,R-T:SOUND 1,8: SOUND 7,254: SOUND 8,16: SOUND 12,5:SOUND 13,1:
NEXT A:NEXT T:NEXT R:SPRITE OFF: BEEP: RETURN
SPECTRUM
E Y)
10 11
20 30 460 50 60 70 380 20 100 110 120 130 140 150 160 170 500 310
320
930 pi 340 545 3500 560 1000 1010 1070 1030 1046 1050 1065 1506 1510 1520 1305 15%0 1545 1553 1566 1570
15753 1580 1590 2000 2010 ZOZO ZOJFO 2040 2050 2660 2070 20809 20790 210060 21 2120 21360
2900
REM 4 e
REM casa encantada :
REM 18 bytes de codigo mequima almacenados en la linea 5
GO SUR 6360: REM inicializar
GO SUB 20606: REM fondo
GO SUB 250602 REM castillo
GO SUB 4500: REM arboles
GO SUB 5006: REM oscuridad
LET n=5: 60 SUB 1500: FEM rayo
LET m=1330
FOR b=6 TO 29
GO SUE 506: REM murcielago
GO SUB 10060: REM bruja
IF b=29: THEN PRINT. AT 1,295" "2 REM =sp,esp,esp
NEXT b
LET n=S: GO SUB 1506: REM rayo
GO SUB 5500: REM fuego
GO SUB £0006: REM calavera
Sue E
REM murcielago
IF m<150 THEN LET xm=xm+1: GO
LET m=m-89: LET a=mXxF1/180:
LET xm=16+INT (4.5*SIN (a))
LET ym=4+INT (3.S5*COS la))
PAFER 05 TM 7IIFPRIMT AT ym,xm3"R"+* REM (R)
PAUSE 3
PRINT AT ym,xm3"S"2z REM (5)
PAUSE 3
FPRINT AT ym,xm3" ": REM esp
RETURN
REM bruja
PAPER 0:
PRINT AT
FPRINT AT
PRINT AT
PRINT AT
RETURN
REM rayo
FOR i=1 TO mn
INK 62 FLOT 255,170: DRAW -39,-46: DRAW 10,0:
DRAW -29,-40
POFE 23761,7: RANDOMIZE USR 23760
INE 6: PRINF AT 3,355"6 380T.%,3 3. HS: REM (635 (H)
FAUSE 5
POKE 23761,1: RANDOMIZE USR 237660
INE £:, PRINT AT 3,33 "6 381 %,.303 HL REF 1633 CH
INK 602 FLOT 255,170: DRAW -39,-46: DRAW 19,0:
DRAW -27,-40
FAUSE 1
NEXT 1
RETURN
REM fondo
PAPER 43 INK 6: CLS
FOR r=i TO 100
LET x=INT (RND*255):2 LET y=INT (RND*80): FLOT x,y
MEXT FE PAPER
FOR y=09 TO 12: FOR x=06 TO 31
PRINT AT y,x3” ": REM espacio
NEXT x:3 NEXT y
INK 0
FLBT 6,2: DRA 2539, % LET. 1=4
FOR p=37 TO 6 STEP -2
PLOT i30*SIN (p/30),p: DRAW 1,0:
NEXT p
RETURN
REM castillo
LET uli=10: LET «2=21s LET yl=10: LET ye<-=161
LET lad=406: GO SUB 3600: FEM bloque frontal
LET x1=8: LET x2=16:2: LEY yi=6: LET y2=11:
LET lad=106: GO SUB REM blogue torre izdá.
LET xi=2l8 LET «a2=25%1 LET yi=682 LET y2=l1i:
LET lad=160: GO SUB 23060: REM bloque torre dcha. -
Ls dl e la
- -
14": 60 SUB 500 KL”": 60 SUB 500 o
¿ REM. SSP» la td)
: REM esp, (K), 11) MN": GO SUB 500: REM esp, (M), (N> OPC”? REM esps, (0), 1F)., 1010
4 A - - - -
po quo dr o
e u e]
Continuación Spectrum
LEÍ. NS=/01 LET ya=13%3 50 SUB 3500: REM segmento tejado torre LET xs=179: LET ys=159: GO SUB 3500: REM segmento tejado torre FOR r=88 TO 103 PLOT 88,5 DRAW 77,0 MEAT FOR b=12 TO ZO STEP <: PRINT AT. .11,4B5"S 5. NEAI Es REM 13. LEI *»=68:%: LET y=182: 60 SUR 40606 LET x=76: LET y=88: GO SUB 4000 LET x=182: LET y=i102: GO SUB 400060 LET x=174: LET y=88: GO SUB 46006 LET x=96: LET y=56: 60 SUB 4006 zZ630 LET Xx51572 LET y=56: 6D SUB 460060 26064 PFRINT AT 13,139”88 A ló,s,los 28: REM (87, (1D 19), 18) 267060 RETURN 3000 REM bloque SLO FOR vesye¿ TO yl STEF —15 POR x=:91 TO =2 3020 FAFER 2: PRINT AT y,x3" ": REM.espacio 000 MEXT ME NEXT y 20040 LE? xi=x1%58s2 LET. x2=x2*9s LET yi=y1*8: LET y2=y2*B5 030 FUR y=y2Z TO" yl: STEP =< 300 INE €s PLOT x1,168-y3 URAN (x2-x13+7,0 0706 NEXT y 2080 FOR m=1 TO lad 00 LEFT aS= INT (RND*t=2=x1+/)+81)5 LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b 31060 NEXT m 2110 RETUEN 32900 REM segmento 2010 LET r=3921 INK 3 35920 FOR t=166 TO 200 2536 LET a=txP1/186: LET x=r*SIN (a): LET y=r*C0S 3946 FLOT xs,ys: DRANW x.y 33990 NEXT t
356646 RETURN 4000 REM ventana
40168 INE 0: FOR w=y TO y+10: FLOT »x,w: DRAWN 23,0 2011 NEXT w 4020 RETURN 43600 REM arboles 4510 FAFER 4: INK (O: OVER 1 45920 FOR t=1 TO 3060 4936 LET x<=INT (RND*293: LET y=13+INT (RND*7> 340 1F t828 AND x<22 AND y17) THEN 60 TO 4530 43500 FRINT AT y,»3"AB"3A7 y+1,x3 "CD"paT SEZA E ERE REI 18), 1E9 3 Gs 1018 15). 15) 945366 NEXT t 4976 OVER 0: FAUSE 20060 586 RETURN 506060 REM oscurided 20160 POKE 2<3/61,1: RANDOGMIZE USRK 22766 JazoO PAPER Oy INE 6: PRINT AT 3,433"6"34A1 4.33 Hs REM (6G)3(H) : 5030 FAUSE 100 250496 RETURN 9500 REM fuego 910 DIM +t(2,6l3 INE 613 FAFES € 2o20 FOR g=1 TO 6 aa E ¿t LES Pt. =yi LET Fi. D)=xX 55490
5550
a Ae Suda TO 5600 ERINT AT A IN E AS 616 PRINT Al FllzsidetIcsJos Ss. REN espacio 3620 NEXT:335 MEAT d5 NEXT € 5630 FDR. ye2 TO 113 FOR s=7 10 Lo 5640 PRINT 47 y,x3" "3: REM espacio SOJO.NEAT «xs» NEXT y 5660 RETURN 60606060 REM calavera
Continuación Spectrum
66010 6020 60730 5040 66050 6666 5070 6080 6970
6100 6110 6120 6130
-6140 6150 6500 6510
52 A
550 65409 79005 7010 7020 70:30 7040 7050 70606 7070 7030 70790 7100 7110 7120 71:30 7140 TIOS 7160 7170 7180 7190 7300 7310 7320 73930 7540
INK 0
FOUR s=270 TO 450 STEP 2
LET a=s*F1/180: LET *=40*SIN (23) LET y=40LOS ta)? FLOT 12/,1353 NEXT s: LET x1=87: LET x2=806 FUR y=133 716 7 Se =1
PLOT xi,zys DRAW x2,02 LET xi=xi+.3: LET x2=x2-.4 NEXT y
PAPER UU; PRINTS” "¡AT 56,173”
REM esp, esp;esp,esp
FRINT AT 8,153" "2: REM espacio,especio
PRINT AT 10,143” ": REM espacio,espacio, espacio FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8 IF FOINT (x,y)=1 THEN FAFER 6:
INE INT (RND*(7))+1:2 FLASH 1:
PRINTER BD 10-15"6": FLASH-6: REM (6)
NEXT x:z WEXT y
RETURN
REM inicializar
FOR a=65368 TC £5527: READ de: FOKE a,d: NEXT a REM introducir codigo maquina en la sentencia REM de la linea S
FOR i=23760 TO 23777: READ d: FOKE i,d: NEXT i RETURN
DATA 16,129,773,40,15,80,48,79: REM arbol (A)
DATA 128,32,74,134,164,68,204,30: REM arbol (B) DATA SIB id. 22 REM arbol (0)
DRAN x,y
DATA 48,96,192,192,192,244,152,128: REM arbol (D)
DATA 1,1,1,3,3,742 2 605 REM arbol (E)
DATA 192,192,192, TRA IEA 120, 224, 2321 REM arbol tF) DATA 3,16,48,32,76,76,233, 224: REM luna (6) DATA 246,254,127,1173,48,54,31,6: REM luna (H) DISTA 1, 216:230,17,2313417,2253 REN bruja (P) DATA 0,6,6,128,240,179,0,0: REM bruja (3) DATA 9,0,1,57,4,31,4,506:2 REM bruja (1K)
DATA 64,128, 128,150, 252,224,64,128: REM bruja (L) DATA 06,0,0,14,1,7,1,14: REM bruja (M) : DATA 16,32,96,164,63,248,16,32: REM bruja (N)> DATA 0,9,0,3,0,1,0,3: REM bruja (0)
DATA 4,8,24,154,79,254,68, 136: FEM bruja (FP) DATA 9,0,9,60,192,0,0,0: REM bruja (0)
DATA 0,0,0,66,36,214,24,0: REM murcielago (R) DATA 0,0,0,0,0,2559,24,6: REM murcielago (S) DATA 8,128,65,2,150,68,40,40: REM llamas (T) REM datos codigo maquina
DATA 62,0,33,0,88,6,24,197,6,32
DATA 119,335,16,2352¿173,16, 206,201
REM datos posicion ventanas
DATA 10,22,8,23,14,19,14,12,10,9,8,8
SS ARA : . — ESTA » NUEVA SERIE Cl E CONSTITUYE LIN LUNA INTRODUCCIÓN AL ARTE DE PROGRAMAR ORDENADORES: CADA LIBRO
SMO ESTRUCTURAR EN PROGRAMA EN A A
% | A ENSEÑA C CÓN ES e RUTINAS. >S AL MISMO TIEMPO EXPLICA Da ANALIZA
SE ES PIDE AL ORDENADOR QUE HAGA E
e Lo QUE | POR QUÉ. : | E __— PEA . EEtE iy ADEMÁS E ES ONVERTIDO! CADA 1 LIBRO > CONTIENE E | como MÍNIMO UN WLIEGO. DE ORDENADOR, | _APASIONANTE Y ORIGINAL, ! ESTRUCTURADO [ DE a | TAL MODO QUE PUEDE AMPLIARSE O REDUCIRSE, E p DE ACUERDO CON EL NIVEL 0108! DESEOS DEL des | USARIO. > Lay e A 0 -_ is mn SS A 7 E S AN
e TÍTULOS DE LA SERIE
Gráficos - ici LÓ Iniciación al basic - El banco d o de datos
es Animació ] ión - Sonido - Gráficos móviles
000000000000 00090
APRENDE A PROGRAMAR
NIMACIÓN
Marcus Milton
ANAYA