Está en la página 1de 8
a“ {NICIACTON w GRAFICOS Y ANIMACION EN BASIC (1) dee, el Inclaso los graficos constiteyen, sin ingretiente Sundanental de a buen juego. auien no donine ef cédiga xdqaina, puede realizar aagnificos grificos en Basic. 9 este articulo os anos 2 explicar como. Verenos tanbien como realizar aninaciones sin abilizer para nada el cbdigo aéquina. En el Spectrum hay varias formas de realizar grificos en pantalla. La ads sencilla tal ver sea con el enpleo de las sentencias PLOT, DROW y CIRCLE. Se pueden hacer dibujos muy vistosos, pero resulta poco adecuado para crear personajes y bjetos en juegos. Tanbien es posible enplear los caracteres grificos pre-definidos (cédigos 128 al 143) aunque no brindan fuchas posibilidades. Por Gltino, nos queda 1a opcién de redefinir todo el juego de caracteres del ordenador. Los juegos conerciales suelen estar escritos en cédigo ‘équina y eaplear rutinas de aninacién de ‘sprites* para conseguir los efectos de moviaiento en pantalla. Sin duda, es la aejor forma de hacerlo, pero eso no quiere decir que sea inposible conseguir buenos grificos en Basic 2, incluso, hacer aninaciones. En este articulo os 10 vanos a denostrar. Pronetenas no eaplear ni una sola instruccién en cédigo adguina, Especenos por 1o facil La forma mis facil de hacer grSticas es definirlos en los és ("User Defined Grafics' 0 Gréficos Definides por el Usuario) que para eso estén. Todos los caracteres que utiliza el Spectrua estén quardados en 1a RON, excepto 10s que tienen cédigns 144 al 164 (anbos inclusive) cuya definicién esta almacenada en RAN y puede, por tanto, ser alterada. Cuando encendenos el ordenador, se copian las prineras letras aayisculas (de 1a *8* a 12 ‘U") en la zona de UDSs} por eso, si tecleanos una "A" en aodo grdfico obtendrenos una *A* aaylscula, Una ver redefinido el caractér, verenos 1a imagen que hayanos creado, hora, vaaes a ver coap se definen 10s U06s. Eapieza por coger un papel cuadriculado, Traza en él un cuadrado que tenga 8 cuaéros de alto y 8 de ancho. En esta reticula de 6§ cuatros es donde tenemos que definir nuestro caractér. Cada uno de los 64 cuadros puede estar en blanco 0 en negro} un cuaéro en blanco lo representanos por ‘O* y uno en ‘negra por "I", En princigio todos los cuadros estdn en blanco, asi que podenos representar 1a reticula de 1a siguiente foreat a0 son00905 000000 9s0060 a Es decir, con 64 ceros, A cada Linea horizontal de ceros 1a vaaos a llanar ‘scan* y a cada cero (0 unol lo vans a Taser ‘pixel’, Cada pixel queda, por tanto, representado por un bit (digito binario que puede valer "0" 441") y cada scan queda representado por un byte (conjunto de 8 bits). A estas alturas, ‘seguro que todos los lectores sabeis que en cada pasicién de ‘enoria del Spectrua cabe un byte (@ bits), asi que cada caractér nos cabe en @ posiciones de aesoria consecutivas. Luego verenos donde estan, de nosento, vanos intentar definir alguna inagen en nuestra reticula. Hira el siguiente conjunto de ceros y unas, y traslddalo al papel cuadriculado que has usado antes, de forsa que cada uno sea un cuadrito relleno de tints (0 lapiz) y cada cero sea un cuadrits en blancos sagaa0es aue080 90011000 aot1i190 smt1i08 10111161 oustiiis ngss90 Si ahora niras el papel desde cierta distancia, verds algo parecido & un sombrero. Ahora, vanos 2 ver como netenos el sombrero en el ordenador. Vanos a aeterlo en el grafico de la "4, No sabeaos 12 direccién de aesoria donde aleacenarlo, pero 1 ordenador nos 10 puede decir. Tecle PRINT USR *A* EL ndnero que obtienes es 12 direccién de nesoria donde estd aleacenada 1a definicién del grifico correspondiente 2 1a "At, es decir, del caracter con cédigo 144, fn realidad, un caracter ocupa B posiciones de negoria, asi que estar alaacenado en esta y en las siete siguientes. Yanos a sustituir a *A* por nuestro soabrero, Teclea el siguiente progranat 1 FORE USR 9" BIN saanseod 26 POKE USR *A%#1, BIN 60 ‘38 POKE USR *8%42, BIN BOBLL 4 PORE USR *A"+5,BIN 99111198 SPOKE USR *A*+4, BIN @O11160 (i PORE UR *aMS; BIN 1aLLLIeL 76 POKE BR *AY+5,BIN 1111118 6 POKE UR *A*+7,BIN BpOSEOD 98 PRINT CHR 148 Al ejecutar el prograna, verds que te aparece en pantalla un sonbrerite, Hens eapleado un sonton de lineas para generar tun sinple grafico, pero 10 heaos conseguido y eso es lo importante. Por supuesto, hay otras formas de introducir los gréficos en el ordenador, pero heaos dicho que ibasos a enpezar por lo facil. fora vanos a hacer algo un poco ads dificil, vamos a convertir cada grupo de 8 ceros y unos (cada scan) 2 un solo nénero expresado on decinal. Para ello, a cada bit le danos un @ valor y sunanos el valor de todos los que estén 2 "I" Los valores de los bits, eapezando por 1a izquierda, son: 128, 64, 32, 1b, 8, 4, 2 y 1. Los dos primeros scans son, logicanente, 8. El tercer scan est 164824, El cuarto y quinto son: 32H6tG+4=68, el sexto es: 12R452+16+G+4+1=187 el séptino est S4+52416¢Be442=126 y el dlting es cero. Por tanto, nuestra UDG puede quedar representado por los niseros: 6, 8, 74, 68, 8, 18%, 126 y 6. Al ordenador le d4 igual que le digaaos BIN 18111101 ¢ que Je diganos 189; para € es lo isn, asi que podrianos repetir el prograna anterior canbiando totes los BIN por su valor correspondiente, ero aspiranos a ser buenos progranadores, asi que harenos algo nejor, vanos a eaplear un bucle para no repetir instrucciones: 16 FOR i=8 107 26 READ 2 36 POKE USR “AY 2 40 NEXT i 50 DATA 0,9,24,68,68,189, 126,08 (66 PRINT CHRS 148 De nosento nos hesos ahorrado 3 lineas y el prograna queda bastante nis presentable, Results que 12s direcciones que ocupa fl grafico correspondiente a 1a "B" estén a continuacién de las que ocupa el de 1a "AY, asi que podenos definir dos graficos de una sola vert READ a pat NEXT i 38 DATA 0,8,24, 68,60, 169,176,6 46 DATA 8,28, 28,28, 62,127, 127,73 ‘58 PRINT CHRE 148;CHRE 145, Henos definido 10s gréficos de 1a bucle (esperanos que el lector pongs su aejor voluntad para ver un pequeto cohete en el grafico de 1a “B'). En realidad, 1a definicién de todos los BGs se encuentra en direcciones consecutivas por 1o que es posible definirlos todos con un solo bucles recuerds que el niaero de iteraciones del bucle ha de ser igual al nésero de grdficos aultiplicado por ocho. Es un autntico ‘pefazo" tener que ir sunando Ics valores de las bits que componen cada caracter para hallar los 8 niaeros que lo representan, Vasos a buscar una forsa ais faci! de hacerlo, Agrupenos os bits de cuatro en cuatro, A cada grupo de cuatro bits le corresponderd un nigero del ‘6 al "9" 6 una Jetra deta “AY ala ‘F*, De esta foraa, cada scan quedaré representado por dos caractéres. La correspondentia entre los cuatro tits y el carctér correspondiente viene dada por la siguiente tabla: y la "BY en un solo a Podencs representar nuestro priner caractér como: sgis1i91 1141 onseoses = $6 Y el segunda coae 0001996 s1i180 = 10 ae1iig6 = 1¢ sooiiig0 = 1¢ LLIB = 3E sULLLILL =F sutLittt = 7F 801881 = 49 Si ponenos los datos todos sequidos, el caracter priner asap 83c3C807ENS Y el segundot BICLCICSETETFAG Lo cual se parece bastante al formato eapleada en nuestra Cargador Universal de Cédigo Maquina. Seguro que los ais adelantados ya se han dado cuenta de que To que estanas haciendo es representar en hesadecinal los bytes que definen cada caracter. La rutina para cargarlos se complica un poco, pera puedes copiarla en un papel y utilizarla en tus programas cada ver que 12 necesites: 16 DEF FH a(a$,n)=168 (CODE af )-88-78(28(0))°9°1)+ (CODE a8 int 1)-48-71 (a8 net) 989) 20 LET d=usR "AY 30 FOR ist TO 2: READ as 48 FOR net TO LEW af-1 STEP 2 50 LET ash a(a$,n); POKE da 68 LET ded¢ls NEXT nt NEXT i 76 DATA *O96R183C3CBD7ESO* ‘88 DATA *BBICICICSETFTF49" Creenos que este aétodo es el nejor porque siaplifica la conversién del UDG disefado sobre el papel a nineros para introducir en el ordenador. Sin eabargo, te henos explicado los tres attados posibles pars que eaplees el que ads te guste. Por ditina, nos queda decir que en 10s modelos de 128K (Plus 2, Plus 3, etc.) hay dos UDGs de nenos, ya que los cédigos 4165 y 164 corresponden a los conandos SPECTRUM y PLAY por lo que hay 19 UDG5 en lugar de 21. © Todos los ordficos que necesites Ya nos parece estar oyendo decir a alguien que ‘vaya a... de juego se puede hacer con solo 19 gréficos'. £1 buen progranador no se conforea con cualquier cosa, y sencs el que se dedica a progranar juegos, asi que vanos & ver 1a fora de tener todos los grificos que nos dé 1a real gana. ‘antes heaos hallado 1a direcin donde el ordenador aleacena Jos UDGs tecleando: PRINT USR "A*, La respuesta es distinta en un modelo de 48K y en uno de 128K. En el prieero serd: 65358 y fen el segundo ser: 5584. £1 ordenador utiliza la (ltinas posiciones (por enciea de RAMTOP) para alaacenar 1a definicién de los Us, Pero dclao sabe el ordenador donde estén alnacenadas 10s UGs?. Huy sencillo, porque io tiene apuntado en una de las fanosas variables del Sistena, concretasente en 1a que se Ilana UDG y esté situada en las direcciones: 23675 y 2476s asi que si tecleanost PRINT PEEK 2367542564PEEK 25876 obtendrenos el wisao resultado que cons PRINT USR *A'. Nos viene ry bien que 1a direccién de los UDGs est en una variable del Sistena, porque asi podenas cambiar su contenido y colocar los Us en otra parte (siespre han de estar por enciaa de RANTOP, asi que tendreaos que bajar RANTOP con CLEAR), Pero puestos 2 tenerlos en cualguier parte, dpor qué no generar varios bancos fe U0Gs y seleccionar uno u otro segin lo que queranos inpriairs al fin y al cabo, el ordenador no tarda nada en cambiar de banco y si podenos tener todos los UDGs que querasos. En un 48K cada banco de UDGs ocupa 188 bytes (8821) sientras que en un 126K ocupa 152 bytes (8419). Vanes 2 hacer Jos célculas de las direcctones para tener § bancos de UDGs en tun 128K, Io que hace un total de 5t19595 UDGs, Quien disponga de un nodelo de 48k, no tiene ads que sdaptar los cSiculos para que fl espacio entre direcciones sea de 148 en lugar de 152. Cinco bancos por 152 es igual a 746 bytes; 65S36-760=64776 ‘ue serd la direccién del priner banco. La RANTOP deberé estar, por tanto, en 64775 asi que enpezanos por hacer: CLEAR 64775 Las direcciones de cada banco serdn: @ a 3 a 50 Ahora teneeos que escribir una rutina que nas POKE en 1a variable UDE la direccidn de cada banco que seleccionenos. Puede ser una rutina ala que se entre con una variable Ilanada “banco* conteniendo un ninero de "i" a "5" y retorne tras POKEar ‘en UDG 1a direccién de ese bancos es decir, tras seleccionarlo, La rutina puede ser @ ‘990 REM SELE-BaNCO 1810 LET db=152¥bancovb4s74 1828 POKE 25676, INT (db/256) 1638 PORE 73675, db-2560PEEK 25676 1048 RETURN El procediniento para definir los UDGs serdt vane FOR be1 105 aeex LET banco=b vant (Define un banco de UDGS] axe NEXT b sxe DATA tpriger bancol avez DATA Tsequndo banco? axxex DATA Ctercer bancol vex DATA {cuarto bancol axen DATA Tquinte bancod fntes de inprisir cada UDG hay que asegurarse de que estd seleccionado el banco correspondiente, Para ello, se puede hacer tuna anada a 1a rutina “SELE-BANCO* con la variable "banca* conteniendo el ntsero de banco a seleccionar, En 1a segunda parte de este articulo, te vamos a contar cono tener % gréficos en un solo banco, 6 varios bancos de % grificos cada uno, Adends, vanos a ver 1a forma de hacer una aniaacién iitotaleente en Basic!!. De acaento, y para que le des tun poco a 1a tecla, henos preparado un pequefo prograna que te va a peraitir analizar 12 forma en que estd definido cada caracter del Spectrua. Lo henos hecho cortito para que no te canses dz teclear, pero te aseguranos que los resultados son sorprendentes. Se Ilana “ANBLIZA-CHAR" y tienes el listado en 1a Figura-1. §u aanejo es tin sencillo que no hace falta explicarlo, tecles el programa y ya nos contaras... 32 BEM s#% BNGLIZACHAR se 20 INPUT a7: 30 if sto THEN GO TO 9 28 if 3<82"GR asiee THEN Go TO 9 CLS: PRINT AT 0,0; INK 7; PABER, 22 cli yok i=860f0,129. step 8: PLO SFL etches Aster GiaeRiNs LET bebset (7-4) “106 NEXT x: PRINT AT y+7,25. 16 .10-28 (2299) 3a; 0 Th 28 INICTACION w GRAFICOS Y ANIMACION EN BASIC. Cunpliendo 12 prosesa que bicinos en 12 prinera fora de Tanbien parte de este articalo, vamos a ver le definir todos los graficos que queraes, verenos una aninacién realizada totalaente en Basic. AL igeal que 1a vez anterior, prosetenos no eaplear ni tna sola instruccibn en cbdigo adgaine, Quien piense que para hacer buenos programas es inprescindible saber progranar en cédigo aéquing, esté en un error. Para hacer buenos progranas solo hace falta ser un buen progranador. Es conveniente aprender cétigo aéquina porque es sais divertido que el Basic, y se pueden hacer ais cosas, pero no es inprescindible, En este articulo utilizarenos algunos trucos de progranacién avanzada en Basic y consequiresos efectos bastante curiosos. Suponenos que quien lo lea conoce, al eno, todas las sentencias de Basic, Si alguna sentencia en particular te crea problenas, consiitala en el capitulo correspondiente del anual, En la primera parte viaos cono definir UDGs (Gréficos DeFinidos por el Usuario) y conc tener varios bancos te 19 (6 21) UGS cada uno. Di jinos tasbien que la definicién del juego fe caracteres del Spectrum estaba guardada en ROM (excepto los Us). Seria estupends poder re-definir todos los caracteras del ordenador, y no solo los UDGs. De esta forms, podrianos definir tun banco de 9 grdficos que se iaprisieran en lugar de los taracteres nornales y seleccionar este tanco cuando fuéranos a inpriair grdficos, pudiendo volver al font de caracteres original cuando haya que inpriair texto... listing que los caracteres estén definidos en ROW, Sin ewbargo, te vanos a dar una buena noticia: iiSt es posible re-definir todos los caracteres del ordenador!! y adeads, se quede hacer en Basic y de uns forea bastante facil. Ahora vanos a ver cao Re-definir todos 1os caracteres ‘Cong viaos en ta prinera parte, 1a direccién de sesoria donde estén definidos Los UDEs se encuentra aleacenada en una variable del Sistena que se Ilana "UDG" y cuys direccién es 23675. Esto nos peraite colocar los UDGs en otra parte de la smesoria (alterando el contenido de esta variable) 6 definir varios bancos de UDGs seleccionando en cada caso el que necesitenos. Pues otro tanto ocurre con 1a direccién donde estén definidos el resto de los caracteres (excepto los cédigos 128 al 143 que no tienen definicién, sino que se generan gor prograsal. Existe una variable del Sistesa denoninada "CHARS" — cuya direccién es 23666 y que contiene la direccién donde estén efinidos los caracteres con cédigos 32 al 127 (ambos inclusive). En principio, esta variable apunta a una direccién de ROM, pero podeaos alterar su contenido sara que apunte s una zona de REN donde nosatros hayaaos definido nuestro propio font de caracteres (que pueden ser letras 0 grafcos). Existe una particularidad con 1a variable CHARS que 1a hace @ (TI) ser distinta de U6. En realidad, esta variable no contiene 1a ireccién del font de caracteres, sino el resultado de restar 256 a esta direccién, dPor qué?. Muy sencillo, si aultiplicanos el cOtigo de un caractér por 9 y Le sunaaos el contenido de (CHARS, el resultado sera la direccién donde esté definido ese caractér. Pero el cidigo del priner caractér no es cero, sino 32 Y precisanente, 32 por @ es igual a 256; por tanto, el contenido de CHARS ha de ser 256 niwerns ads bajo que la direccién del priser caractér. Vanos a conprobarlo, Enpecesos por leer el contenido de CHARS: PRINT PEEK 2340*2569PEEK 25607 EL resultado ha de ser: 15369, Si le sunaaos 254, obtenenos: 15616 (300th) y esta es, precisanente, 1a direccién a partir de 1a que estd definido el font de caracteres, Hay 9% caracteres y cada uno ocupa @ bytes, por 10 que el Font completo ocupa 9688-768 bytes. Si sunaaos 768 a 15616 obtenenos 16384 cue es la prinera direccién de RAM. For tanto, 1a definicién de los caracteres ocupa las 768 dltisas direcciones de 1a ROM (en los odelos de 128K, cuando decinos “Ia ROM" hay que entender que nos referiaos a 1a ROM de ejecucién, es decir, 1a que contiene el intérprete de Basic y esta paginada durante 1a ejecucién de un prograna). Si querenos construir otro font de caracteres (0 un banca de gréficos) no tenenos ads que ubicarlo en una direccién de RAM, definirlo de 1a aisna forma que los UDGs ‘sin olvidar que esta vez son 9 caracteres) y direccionarlo alterando el contenido de CHARS para que sea el resultado de restar 256 a1 direccitn donde heaos alaacenado nuestro font, Tanbien padenos Gefinir solo parte de los caracteres copianda todos los caracteres desde RON y redefiniendo solo aquellos que nos fnteresen. Pero como ejesplo, vasos a hacer algo ain ais divertido: vanos a copiar en RAN los caracteres de 12 ROK, pero hhaciéndoles una pequeia alteracin para que el ordenador inprine con letra cursiva Itaabien asada: ‘itdlica’). Para conseguir letra cursiva, hay que hacer que cade letra se incline a la derecha. Para ello, desplazzeos 2 a derecha los tres "scans" superiores de su definicién y a 1a izquierda los tres inferiores, dejando los dos centrales coao estén, Vieos en 1a prinera parte que cada scan quedaba definido por un nisero en ‘ecinal; pues bien, si dividiaos ese néaero por dos (tonando solo 1a parte entera) el scan quede desplazado a 1a derechay si Jo aultiplicanos por 2 (en caso de que sea nayor de 255 hay que restarle 256) el scan queda desplazado a 1a izquierda. Para ‘entender por qué ocurre esto es necesario tener unos ciertos conocisientos de eateaiticas, asi que aejor os lo creeis y nos ahorrasos explicarlo (de verdad, 1a explicacién es un rollo y nos ocuparia varias péginas}. Para este experisento, los que tengan un 128K deberdn pasar 1 modo 48k, de esta forma, las explicaciones que denos serin utilizables por todos los lectores. Vanos 2 colocar nuestra nuevo font insediatanente debajo de los UGs, asi que tendrenos que bajar RANTOP. El siguiente cuadro nos ayudar a localizar todas las direcciones. Es interesante hacer un cuadro como este cada vez que se quiera distribuir 1a aesori

También podría gustarte