VAMOS A DIVERTIMOS PROGRAMANDO EN BASIC FASCÍCULO 1- FAMILY BASIC TUTORIAL

Bienvenidos a esta nueva serie no continua y de introducción para desarrolladores principiantes y nostálgicos de programación en diversos sistemas. Esta entrada la dedicaré a “juego experiencia”  llamado FAMILY BASIC lanzado únicamente para el mercado Japones en el año 1985.

Fuente de la imagen: http://www.leucht.com

Espero que esta sea una pero no continua serie de entradas de introducción a la programación de vídeo juegos, obviamente con tintes nostálgicos. Como es de comprender no soy amigo de cosas tan  ostentosas como Game Maker ni Unity, respeto enormemente estas plataformas tanto como a las sopas instantáneas, pero no, este no es un blog dedicado a cosas tan modernas.

El 90% de esta serie serán cosas similares a BASIC, no se alarmen también habrá espacio para lenguajes de programación un poco más complejos. Tengan presente, este es el punto de regreso lo elementos basicos de lenguaje de BASIC, posteriormente dedicaré entradas  a mostrar algunas particularidades de cada implementación de las variantes de este lenguaje.

DIAVAGACIÓN PERSONAL – MUCHO SE HA ESCRITO DE BASIC

Aunque parezca sorprendente aun siendo de sur america, el primer contacto con BASIC fue una vieja colección de fasciculos de una extraña enciclopedia española de los 80’s , esto es claro nunca he usado una microcoputadora  y solo clones de PC AT y ATX, por tanto revistas y libros con código BASIC solo he llegado ha conocer por  curiosidad.

Una de las cosas que aun me gustan del BASIC  es la facilidad de realizar todo inmediatamente. Aun cuando en los 90s también estudié Turbo Pascal  y C++ que incorporaban para esa estoces objetos, siempre considere el BASIC más divertido, pasando de Visual Basic 3.0 hasta 6.0. El BASIC  me facilito  el estudio de  C#, JAVA (y sus clones), PHP, y un largo etc. Para mi pesar, abandone la programacióna mediados de la era del Microsoft XNA (2009) por cuestiones profesionales.

Aqui me tienen tratando de venderles la moto de este arcaico lenguaje.

¿Por qué  NO, BASIC? ¿Por qué  SI, BASIC?

Empecemos con las cosas malas. Cosas que se mal acostumbra trabajando con BASIC, por tanto deberían tener presente:

  1. No declarar variables, ni  definir los tipos de datos
  2. No crear estructuras o sub-rutinas
  3. Muy poco de depurar y crear ejecutables
  4. Nada de construcción de objetos, toda su parafernalia de interfaces y herencia
  5. Prácticamente imposible desarrollar para sistemas operativos modernos, obviando los abandonados Visual Basic y sus mal logrados clones modernos.
  6. No le volverá millonario!! le quitará tiempo!! es un lenguaje caduco, viejo, obsoleto, etc

Fortalezas del BASIC frente a otros lenguajes modernos:

  1. Si lo piensan claramente es prácticamente un juego, porque no es trabajo, ni le dará dinero. Practicamente no podría hacer ningún daño con este juguete.
  2. Organización y planificación, programar en BASIC  primitivo es desgastante, se debe planificar antes de iniciar la escritura de código.
  3. Entrenamiento para ensamblar en código de maquina, el BASIC es tan  similar al Ensamblador que podría considerarle un MACRO ENSAMBLADOR. Entendiendo que en ensamblador no hay objetos, no hay tipos, no hay sub-rutinas, etc.
  4. Todo ordenador existente tiene una versión de BASIC. El BASIC es prácticamente un lenguaje universal de la informática.

¿Por qué FAMILY BASIC?

En este punto HISTÓRICO consideren que aprender BASIC es técnicamente un JUEGO por esta razón inició esta serie con el FAMILY BASIC.

Fuente de la imagen http://vignette3.wikia.nocookie.net

Para mi sorpresa  y obviando lo malo de la documentación; lo encontré muy sencillo, no ocupa muchos recursos, es fácil de ejecutar y tiene lo mínimo para para introducir a muchos curiosos en este mundillo de los vídeo juego. Este es un sistema integrado pero primitivo con: un lenguaje de programación y herramientas gráficas personalizadas, no muy distinto de los sistemas modernos .

Este lenguaje implementado por Hudson-Sharp-Nintendo BASIC incorpora los elementos básicos del lenguaje BASIC y que da pie a hacer un pequeño pero interesante tutorial. Sin embargo, debo hacer una grandes advertencias en rojo!!

ADVERTENCIA 1: No compartiré enlaces para descarga de EMULADOR ni el Family Basic V3 (J) (ni pretendan preguntar por ellos). Sin embargo , recomiendo el uso de  NESTOPIA que permite pegar texto (con la tecla F12), así podrán pegar fácilmente los ejemplos.

ADVERTENCIA 2: Siento no poner muchos pantallasos, pero no quiero tener líos en especial con el © de los personajes.

Fuente de la imagen: http://www.old-computers.com

Cerrando la introducción, espero que les cause mucho interés ya que este es el primer mini tutorial de FAMILY BASIC y para fortuna solo para la ustedes la comunidad hispano parlantes!! . Tengan presente que cuando escriba a sobre BASIC esta punto será siempre el punto de regreso a la introducción a los elementos básicos del lenguaje.

17156347_1043788469087984_5730991003766645229_n.jpg

Con este sabio mensaje inicia este tutorial!!

MINI TUTORIAL DE LENGUAJE BASIC

Si ya sabe BASIC puede saltar este mini tutorial, pero si es igualmente nostálgico y quiere recordar esos viejos tiempos te invito a repasar con este BASIC olvidado.

Lo primero en aparecer es una pantalla negra para ingresar texto. Esta pantalla no tiene ningún elemento y se puede desplazar con las flechas del teclado. Cada vez que presiona la tecla ENTER el interpreta lo tomara como un comando e intentara ejecutarlo.

fami1

LIST    Listar el código actual
LOAD/SAVE Un poco adelante tengan paciencia
   SAVE     "nombre_archivo"  guarda el listado actual 
             en un archivo con mombre nombre_archivo
   LOAD    "nombre_archivo"  carga el listado actual 
           en un archivo con mombre nombre_archivo
NEW     Borra el listado actual pone todo en limpio.
RUN      Ejecuta el programa actual
CLS      Borrar pantalla

El comando núcleo es el RUN, sin este no se ejecuta nada de nada. CLS le sigue en importancia, porque le numero de lineas de carácter es muy limitado siempre vas a estar limpiando la pantalla.

El resultado de cada comando es un OK o un ERROR:

OK     la instrucción se termino con éxito
ERROR La instrucción o linea de programa que tiene el error

Un programa es un conjunto de  instrucciones enumeradas,  cada instrucción se ejecuta en este orden de numero asignado.

10 CLS
20 LOCATE 10,20
30 PRINT "HOLA MUNDO"

Este es el primer programa siempre se llama “HOLA MUNDO”,

  • LINEA 10:  CLS borras toda la pantalla y fondos.
  • LINEA 20:  LOCATE 10,20 y ubica el curso en  la columna 10, fila 20. Recuerden que:
    • En computación x=0, y=0 siempre es la esquina superior a mano izquierda, “x” aumenta a la derecha y “y” hacia abajo.
    • En texto este BASIC puede manejar columnas (x horizontal)  27  y filas  22 (y vertical)
  • LINEA 30: PRINT imprime una linea de texto en pantalla. Texto que siempre va entre comillado.

fami2

Las variables son muy importantes en Video juegos ya que almacena: puntajes,vidas, posición de los sprites (personajes jugables, enemicos, etc), otro sin fin de cosas.

Los BASIC primitivos solo maneja dos tipos de datos

  • NUMEROS  unicamente enteros
  • TEXTO,  se distingue de estos últimos siembre van entre comillados “”. 
    • “Una cadeno de texto” es un cojunto de caracteres o mejor dicho LETRAS/NUMEROS/SIMBOLOS.
    • BASIC no maneja tipos de variables de un solo  “caracter” (A,B,C,D…+,*,12,1,2,3,5,45,6) o su representación numérica llamada BYTE, pero si varias funciones que retornan un solo carácter.
10 CLS
20 X= 1
30 Y= 2
40 Z = X + Y
50 PRINT "LA SUMA DA ";Z

Las variables no deberían ser palabras reservadas ni contener caracteres especiales, ni espacios. En general los BASIC se usan solo mayúsculas, y en otras variantes no distinguen las mayúsculas de las minúsculas.

Sin mas dilación, el siguiente ejemplo muestra un ejemplo con variables de TEXTO.

10  CLS
20 X$= "1"
30 Y$= "2"
40 Z$ = X$ + Y$
50 PRINT "LA SUMA DA ";Z$

Con las funciones STR$(NUMERO)  y VAL(TEXTO) se pueden hacer conversiones entre ambos tipos de variables.   Ahora bien, las funciones que devuelven TEXTO siempre usan $ (símbolo de dinero), al igual que las variables deben tener al final su respectivo $. Las conversiones de variables  no son útiles en vídeo juegos del tipo árcade, por el contrario si en las aplicaciones.

Se pueden realizar son las básicas entre  NUMEROS, y se pueden agrupar estas con “()” paréntesis, las operaciones son prácticamente idénticas a las que usas en hojas de calculo.  En cuanto a variables de TEXTO  solo se pueden sumar .

* multiplicar
 + sumar 
- restar
 / dividir

Es usual en programación el repetir instrucciones un numero determinado de veces, en este caso las instrucción FOR… NEXT es de las más importantes, en BASIC es su uso es sencillo.

FOR  variable = numero_inicial TO numero final {STEP} numero_salto
 ( muchas instrucciones que se repiten hasta que termina el conteo)
NEXT

Un ejemplo clásico de FOR… NEXT es:

10 CLS
20 PRINT "LA TABLA  DEL 2"
40 FOR I = 0 TO 9
50 PRINT "2 X ";i;"=";2*I
60 NEXT

fami3.png

En este caso el PRINT se combina con un ; ( punto y coma) imprime el en la misma linea sin espacio con , (coma) deja un corto espacio, ambos son validos. Se debe tener precaución con el largo de las lineas en este BASIC

Este BASIC tabien incorpora instrucciones llamada STEP que solo cuenta saltando en ese numero de rangos.

FOR I = 0 TO 9 STEP 2

Las instrucciones FOR son de mayor utilidad si se anidan con otros NEXT, en un sin fin   de ocasiones. El siguiente es un ejemplo de lo que llaman un FOR anidado:

10 CLS
20 FOR J = 0 to 9
30 PRINT "LA TABLA DEL"; J
40 FOR I = 0 TO 9
50 PRINT j;" X ";i;"=";J*I
60 NEXT
70 NEXT

La instrucciones condicional en el del tipo SI tal cosa ENTONCES se resuelven con el comando IF la condicion  THEN  y la instrucción.

IF condición THEN  instrucciones seguidas por : (dos puntos) en la misma linea

 = (igual)
 > (mayor que )
 < (menor)  >= (mayor igual)
 <= (menor igual)
 <> (no igual)

Recordemos que   la puntica del signo <  o  > apunta al pequeño,
en esta convención la variable siempre esta a izquierda

Combinaré  este IF con otro que es el comando INPUT para el siguiente ejemplo.  Este solicita a usuario que ingrese un dato y lo guarda en una variable o variables, la forma que imprime texto es idéntica al  PRINT.

20 INPUT "CUAL ES TU EDAD?: "; EDAD
30 IF EDAD > 22 THEN PRINT "ERES MAYOR DE 22"

El ultimo elemento básico e importante son los saltos de programa. Los saltos solo se usan en BASIC y en ENSAMBLADOR, los otros lenguajes los soportan pero es la practica menos recomendada que podría documentar, tan caducos como el BASIC.

Como cada linea tiene un numero podemos saltar a una parte del programa mediante dos opciones básica GOTO  para, GOSUB…. RETURN para salto con retorno un comando después de la linea desde donde saltamos.

20 INPUT "CUAL ES TU EDAD?: "; EDAD
30 IF EDAD < 22 THEN GOTO 60
40 PRINT "ERES MAYOR DE 22!"
50 GOTO 70
60 PRINT "ERES MENOR DE 22!"
70 END

En la linea 70 se observa un END y es una instrucción que obliga a  termina el programa definitivamente y regresar al BASIC, lo mismo que sucede si el programa llega al final y no encuentra más instrucciones.

El GOSUB RETURN es lo más próximo a sub-programas generalmente llamados sub-rutinas

20 INPUT "CUAL ES TU EDAD?: "; EDAD
30 IF EDAD < 22 THEN GOSUB 500: GOTO 60
40 PRINT "ERES MAYOR DE 22! POR"; FALTA
50 GOTO 70
60 PRINT "ERES MENOR DE 22! TE FALTAN ";FALTA
70 END
500 FALTA = ABS(22-EDAD)
510 RETURN

Un ultimo ejemplo para cerrar este mini tutorial quedan dos tema los condicionales y los saltos de programa,

10 CLS
20 PRINT "ADIVINA EL NUMERO DE 1 A 6"
30 INPUT "INTRODUCE EL NUMERO:", N
40 DADO = RND(5) + 1
50 IF DADO = N THEN GOTO 90
60 PRINT "NO!!QUE MALA SUERTE!!"
65 PRINT "EL NUMERO ERA EL ";DADO
70 INPUT "QUIERES CONTINUAR (S/N):",C$
80 IF C$ = "S" THEN GOTO 30
90 PRINT "ME RINDO ADIOS!"
100 END
  • LINEA 40: Se genera un numero aleatorio en este BASIC es un numero entero de 0 al numero 5.
    En este punto se deben distinguir las funciones de las sentencias, estas primeras siempre se llaman con los valores dentro de () y en las sentencias no solía usar en estos BASIC tan primitivos este símbolo.
  • LINEA 50: esta el condicional que inicia con
  • LINEA 30 y 70: Muestra dos tipos de peticiones de entrada de teclado una numérica y una de texto (alfanumérica le decíamos)
  • fami4.png

RECOMENDACIONES SOBRE USO DE LA CONSOLA BASIC

  • Recuerden que estamos en el futuro si van solo a digitar a la consola les tomará toda una vida, apóyense con el editor de texto de su preferencia y copien el texto la consola. Copien y peguen  bloques pequeños de prueba. (NESTOPIA con F12)
  • Con LIST lista todo el programa pero se puede hacer un listado corto LIST 20 o LIST 20-40, igualmente se hace con el RUN.
  • Los errores comunes son siempre de introducción de de las instrucciones.
  • Sino estas seguro del resultado siempre se podrá escribir el comando en la consola de BASIC y observar que puede suceder.
  • Para saber el valor de una variable siempre se pueden dejar LOCATE….. PRINT   para saber cual es su estado.
  • Siempre esta la opción de hacer un Soft RESEST a la maquina, cuando no se ha guardado el estado (esto borra el Background)
  • Si quieren terminar abortar o detener recuerden la tecla END (FIN) varias veces.
  • Recuerden hacer copias de su maquina virtual, guardando el estado actual.

USO DE LO MANDOS: BOTONES + PAD

las funciones que tenemos son  STRG(NUMERO_MANDO) y PAD(NUMERO_MANDO) retornan respectivamente 0

Valores de entrada NUMERO_MANDO:
  0 Mando 1 
  1 Mando 2 
Valores que retorna:
  PAD: ARRIBA 8, ABAJO 4, ZIQUIERDA 2, DERECHA 1
  STRG: A=4 Y  B=8

PARTICULARIDADES GRÁFICAS DEL FAMILY BASIC

Consideren que el Familiy Basic maneja 4 tipos de recursos gráficos:

  • TEXTO, como vimos en la primera parte se limita a imprimir texto en pantalla
  • SPRITE CARACTER, son realmente caracteres especiales o texto convertido en sprite. NO son animados y su movimiento se debe programar.
  • ACTORES, son un conjunto de 16 sprites automáticos que tiene varias acciones y su uso es inmediato.
  • FONDOS, se incorpora un pequeño editor de fondos que hace la vez de editor de niveles. Estos fondos son por pantalla, limitado numero de elementos de dibujo y no permite hacer SCROLL (desplazamiento de pantalla)

Nuestra primera pantalla quedaría así:

10 CLS: SPRITE OFF
20 LOCATE 10,10: PRINT "START!"
30 PAUSE 500
40 CLS: CLEAR
  • LINEA 30:  de PUASE da una pausa en 500 mili segundos o 5 segundos, en otros BASIC se llama WAIT.

SPRITE CARACTER

El siguiente código nos permitirá descubrir todos caracteres espaciales en este BASIC que pueden ser convertidos en SPRITES

10 CLS
20 PRINT "CARACTERES ESPECIALES"
30 FOR I = 184 TO 225 STEP 3
40 PRINT I+1;" ";CHR$(I+1);" ";I+2;" ";CHR$(I+2);
45 PRINT I+3;" ";CHR$(I+3);
50 PRINT CHR$(10)
60 NEXT

fami5.png

Primero mostraré como usar los SPRITE CARACTER, por fortuna solo tenemos dos comando uno para crearlo DEF SPRITE  y uno para cambiarlo de posición SPRITE

DEF SPRITE numero, (color,completo,0,orientacion,flip_horizontal)

color:      1 a 4
numero:     Asigna un numero para el caracter y es util para moverlo
            0 al 7, total de 8 asignables  
completo:   0 para 1 solo caracter, 1 todo el texto

orientacion= 0 lectura occidental, 0 lectura japones

flip_horizontal= 0 normal,  1 espejo horizontal
SPRITE numero, pos_x, pos_y

numero:        numero de Sprite que queremos mover
pos_x,posy:   Coordenadas de pantalla en pixeles donde queremos ubicarlo

Si queremos ver el SPRITE CARACTER  los ACTORES siempre se debe llamar antes el SPRITE ON para activarlo caso contrario SPRITE OFF no deseamos mostrarlos.

Ahora si, mostraré es como interactuar con los SPRITE CARACTER

10 CLS: CGEN 3: SPRITE ON
20 LOCATE 10,10: PRINT "START!"
30 PAUSE 300
40 CLS: CLEAR
45 X=80: Y=80
50 DEF SPRITE 0,(0,0,1,1,0)=CHR$(207)
60 SPRITE 0,X,Y
70 BOTONES = STRIG(0): PAD=STICK(0)
80 LOCATE 1,2: PRINT BOTONES, PAD,X,Y
90 IF PAD=2 THEN X=X-8
100 IF PAD=1 THEN X=X+8
110 IF PAD=8 THEN Y=Y-8
120 IF PAD=4 THEN Y=Y+8
130 IF X>250 THEN X=250
135 IF Y>220 THEN Y=220
136 IF XSPRITE 0,X,Y 
160 GOTO 70 

Este condigo es largo e informativo,

  • LINEA 45:  Asignamos una coordenadas iniciales  x,y
  • LINEA 50: Creamos el sprite de una “bola”
  • LINEA 60: Usamos el comando para tenerlo en una posición inicial
  • Linea 70: Leemos el estado del mando 1 (en este caso llamado 0)
  • LIENAS 90 a 120: Es un bloque se encarga de cambiar los valores de las coordenadas
  • LINEA 135 a 145: Controlamos que sprite no se nos desborde y genere error
  • LINEA 150: Asignamos la nueva posición al sprite
  • LINEA 160: Regresamos al bucle

fami6

Tenemos varios defectos de este tipo de SPRITE CARACTER, lo importante es que este se puede desbordar, solo se movería si nosotros lo programáramos.

Temas avanzados

En el manual original pagina 132 muestran como se pueden formar SPRITE CARACTER desde los actores que comentare adelante. El japones que usa no es muy complicado el detalle es que el orden no es correcto MARIO, el sprite muestra que sube una escalera escribe como   20,21,22,23 y el orden es correcto es 21,20,23,22.

Remplazando la linea en el ejemplo anterior.

50 DEFSPRITE 0,(0,1,0,1,0)=CHR$(21)+CHR$(20)+CHR$(23)+CHR$(22):SPRITE 0,110,160

No es evidente pero se pueden crear nuevos dibujos respetando este orden de 4 caracteres y hacer unos nuevos sprites desde los caracteres especiales.

Recuerden que para ver el SPRITE primero va siempre un SPRITE ON. Mostraré un ejemplo  cuando hable de los colores.

ACTORES

Los actores y los fondos son el PLUS de este BASIC. En total FAMILY BASIC nos ofrece 17 sprites automatizados o animados. Muchos de  ellos con  8 posibilidad animación y 4 posibles colores.

http://www.nesworld.com

Cuando pensamos en un actor pensamos es como en un GUION y por eso arbitrariamente les llame actores, dado que tenemos que pensar que son automáticos y debemos orientares sobre lo que queremos que ellos realicen. Para descubrir como funcionaban partí del siguiente trabajo detectivesco. Lo primero es siempre iniciar el modo:

SPRITE ON

Posteriormente el siguiente pedazo de código, pueden modificarlo pueden hacer hacer puebas.

DEFMOVE(0)=SPRITE(0,3,1,200,0,0):POSITION0,50,90: MOVE 0

fami7.png

Esta instruccion se debe invocar siempre queramos cambiar la acciones del ACTOR. Ahora veamos sus parametros:

DEFMOVE(No_SPRITE) = SPRITE(PRE,ACCION,NCUADROS,SPEED,CUADROS,0,COLOR)
PRE:  Selecciona una actor del siguiente electo

 0 mario
 1 princesa
 2 aveja
 3 pajaro ala en alto
 4 pinguino
 5 gusano
 6 coche
 7 cuadro con 4 patas
 8 nave 1
 9 nave 2
 10 Explosión
 11 villano balón sonoriza
 12 misil pequeño redondo
 13 tortuga
 14 cangrejo
 16 pájaro ala abajo

ACCIÓN: Define acción entre 8 posibilidades saltar/caer es también
 ir en diagonal

 0 muerte
 1 subir
 2 salta derecha
 3 camina derecha 
 4 cae derecha
 5 bajar
 6 cae a izquierda
 7 camina izquierda
 8 salta izquierda

COLOR: Selecciona 1 a 4 colores (mostrare un poco adelante)

SPEED:  Velocidad de movimiento

NCUADROS = Numero de cuadro que se moverá el actor

Con este pequeño ejemplo  termina esta sección:

(es un poco distinto del código de la pagina 93 del manual base en japones)

10 CLS: CGEN 2: CGSET 1,1: SPRITE OFF 
20 LOCATE 10,10: PRINT "START!" 
30 PAUSE 300 
40 CLS: SPRITE ON: VIEW 
50 AC=1:X=50:Y=50
55 DEFMOVE(0)=SPRITE(6,AC,1,2,0,0)
65 POSITION 0,X,Y 
80 BOTONES = STRIG(0): PAD=STICK(0) 
100 LOCATE 1,2: PRINT BOTONES, PAD,XPOS(0),YPOS(0)
110 IF PAD=2 THEN ACT=7: GOSUB 500 
120 IF PAD=1 THEN AC=3: GOSUB 500 
130 IF PAD=8 THEN AC=1: GOSUB 500 
140 IF PAD=4 THEN AC=5: GOSUB 500 
180 GOTO 80
500 X=XPOS(0): Y=YPOS(0)
510 DEF MOVE(0)=SPRITE(6,AC,1,200,0,0)
515 POSITION 0,X,Y 
520 MOVE 0
530 RETURN
  •  LINEA 10: Esdistinta del primer ejemplo para usar el actor como sprite
  • LINEA 55:  Se define una base para que el ACTOR haga su aparición
  • LINEA 110 a 140: Se le da dirección al ACTOR
  • LINEA 180: Bucle de juego
  • LINEA 500: Como el ACTOR es automático requerimmos siempre almacenar  su posición en X,Y
  • LINEA 515  se mueve el ACTOR  cero (0), el único creado a la posición X,Y

fami8

Suplemento:

150 IF XPOS(0) >250 THEN AC=3: GOSUB 500
155 IF XPOS(0) > 220 THEN AC=1: GOSUB 500

 FONDO – BACKGROUND BGTOOL

El editor de fondos es un poco engorroso, pero es cuestión de tener un poco de paciencia. Se inicia con el comando BGTOOL que carga el editor. Para guardarlos se debe usar la CINTA VIRTUAL o salvando el estado.

fami9

Las teclas de referencia son las siguientes:

FLECHAS:                   Mueve el cursos en la pantalla de dibujo
ESPACIADORA:         Dibuja carácter de dibujo
INSERT – DELETE:   Izquierda –  derecha de selección de la paleta
HOME:                         Baja paginas en la paleta
ENTER:                        Cambiar color (modos de color)
F1 F2 F3 F4:                Dibuja con un color preseleccionado
ESCAPE:                        MENU

Con las flechas arriba y abajo se navega en el menú y con ESPACIADORA selecciona la opción

Es muy importante tener presente que  solo si activando el menú se puede salir nuevamente al BASIC presionando la tecla END (FIN).

Elementos del menú:

  • SELECT: Regresar a dibujar
  • COPY/MOVE:  Con INSERTAR selecciona lo que se quiere copiar, dos veces insertar se borra
  • CLEAR: Borra todo lo que hemos hecho
  •  FILE: Guarda o carga, ver más abajo como es este proceso en la maquina virtual.
  • CHAR: Permite escribir en la pantalla

El fondo es un conjunto de caracteres especiales SPRITE CARACTER y las instrucciones para manejo del fondo a destacar son:

SCR$(COLUMNA,FILA) :  Devuelve el caracter que esta esa coordenada de pantalla  
VIEW: Imprime la totalidad del fondo o background en memoria (
    el dibujado por el BGTOOL), este queda en el fondo de plano de accion
CLEAR:  Limpia el contenido de la memoria inclueyendo el backgroung

INNECESARIAMENTE COMPLICADO: RESOLUCIONES,  TINTES Y COLORES

En modo de impresión de texto recordemos que son   columna 27  (x horizontal)  y filas  22 (y vertical)Cada linea carácter tiene 8×8 pixeles (alto y ancho).  Para convertir entre estas coordenadas. Los fondos se dibujan como texto en el fondo claro esta, por tanto sus coordenadas son en texto para verificar con en el SCR$

_pixeles = _texto * 8 + 12

x_texto = (x_pixeles-12)/8
y_texto = (y_pixeles-23)/8

Puede ser muy util SCR$(x_texto,y_texto)

NOTA: Al ser los numero enteros la división siempre dará un numero entero, no da mucho pie a ser exactos.

Otro tema innecesariamente complicado  es el CGEN simplemente solo funcionan dos opciones y de activarse si o si para ver FONDOS  y SPRITE CARACTER

CGEN 0    'ERROR DE PANTALLA
CGEN 1    'ERROR DE PANTALLA
CGEN 2    'SPRITE DESDE PARTES DE ACTORES (COLORES CORRECTOS)
CGEN 3    'SPRITE DESDE CARACTERES ESPECIALES (COLORES CORRECTOS)

CGSET es otro  comando criptico, el tutorial en japones nos invita a probar entre las distintas combinaciones, para descubrir las pequeñas variaciones de tono.

CGSET A,B

Cosas interesantes:
A = 0 Texto en un verdoso
A=B=1 Blanco y negro
A=1 B=2 Mario en rojo oscuro
A=1 B=0 Mario color Luigui
Etc..descumbranlo..

Finalmente estan los comando de cambio de color, no deberian llamarse PALET sino CHANGECOGLOR o algo así. Son dos (2) comandos que no modifican realmente la paleta del Famicon, ni los indices ni nada parecido.

PALET S y PALET B; en donde S es de ACTOR  y B de FONDO/TEXTO/CARACTER

Insisto, esta instrucción no cambia la paleta, cambia al mismo tiempo 3 elementos de COLOR acorde a la paleta de la FAMICON.

PALET S  TINTE_SPRITE, FONDO, INDICE_1,INDICE_2,INDICE_3

FONDO cambia solo el color del fondo (0 a 60) de
 pantalla

Tinte cada ACTOR
  3 opciones de tinte diferente, en otras palabras
  se pueden dibujar 3 Marios con ropa de color 
  diferente. Cambiar la paleta de cada Mario
   Independiente mente 

Cada TINTE tiene un conjunto de indices predeterminado.
  según el ACTOR
  Ejemplo en "Mario" el indice 3 es el pantalón, 
  el 2 es camiza+botas+gorro, 1 es la piel.
   Esto tonos van del 0 al 60

Ejemplo PALET S:

10 CLS: CGEN 2: SPRITE ON
20 C=0: T=0: T1=14: T2=48:T3=22:T4=1
30 BOTONES = STRIG(0): PAD=STICK(0): K$=INKEY$
40 IF K$="" AND BOTONES = 0 AND PAD=0 THEN GOTO 30
50 LOCATE 0,10: PRINT "CARACTER:"C, "TINTE: ";T
60 LOCATE 0,2: PRINT "PALET S";T;",";T1;",";T2;",";T3;",";T4
70 LOCATE 0,15: PRINT "CARACTER T TINTE"
80 LOCATE 0,18: PRINT "TECLAS Z X C V"
90 LOCATE 0,19: PRINT "TINTES 1 2 3 4"
100 LOCATE 0,17: PRINT "R RESET"
120 IF PAD=1 THEN C=C+1 
130 IF PAD=2 THEN C=C-1 
140 IF C>52 THEN C=52 
150 IF C61 THEN T1=0 
160 IF K$="Z" THEN T1=T1+1: IF T1>61 THEN T1=0 
170 IF K$="X" THEN T2=T2+1: IF T2>61 THEN T2=0 
180 IF K$="C" THEN T3=T3+1: IF T3>61 THEN T3=0 
190 IF K$="V" THEN T4=T4+1: IF T4>61 THEN T4=0 
200 IF K$="T" THEN T=T+1: IF T>2 THEN T=0
210 IF K$="R" THEN T=0:T1=48:T2=22:T3=1
220 DEFSPRITE 0,(0,1,0,1,0)=CHR$(C*4+1)+CHR$(C*4)+CHR$(C*4+3)+CHR$(C*4+2)
230 SPRITE 0,40,60
240 DEFSPRITE 1,(1,1,0,1,0)=CHR$(C*4+1)+CHR$(C*4)+CHR$(C*4+3)+CHR$(C*4+2)
250 SPRITE 1,80,60
260 DEFSPRITE 2,(2,1,0,1,0)=CHR$(C*4+1)+CHR$(C*4)+CHR$(C*4+3)+CHR$(C*4+2)
270 SPRITE 2,120,60
280 DEFSPRITE 3,(3,1,0,1,0)=CHR$(C*4+1)+CHR$(C*4)+CHR$(C*4+3)+CHR$(C*4+2)
290 SPRITE 3,160,60
300 PALET S T,T1,T2,T3,T4
310 GOTO 30
  • LINEA: 35  la variable reservada K$ devuelve cada momento la tecla presioanda, un solo caracter

fami10

Ahora los parámetros del PALET B:

PALET B  TINTE, FONDO, TEXTO, INDICE_2,INDICE_3

TINTE debe ser 0 para afectar al fondo general es decir a los caracteres 
  llamados con PRINT
FONDO cambia solo el color del fondo (0 a 60) de
 pantalla
TEXTO cambia el color de texto (0 a 60) e igualmente el indice_1
     de los caracteres especiales
TINTE_2 y TINTE 3 Todos los CARACTER ESPECIALES (SPRITE CARACTER) 
  poseen 3 Indices a los que se les puede apuntar a un nuevo color.

Ejemplo PALET B:

10 CLS: CGEN 2: SPRITE ON
20 C=0: T=0: T1=15:T2=48:T3=48:T4=48 
25 GOSUB 500
30 BOTONES = STRIG(0): PAD=STICK(0): K$=INKEY$
35 IF K$="" AND BOTONES = 0 AND PAD=0 THEN GOTO 30
40 LOCATE 0,1: PRINT "CARACTER:"C, "TINTE: ";T
50 LOCATE 0,2: PRINT "PALET B";T;",";T1;",";T2;",";T3;",";T4
60 LOCATE 0,15: PRINT " CARACTER T TINTE"
70 LOCATE 0,18: PRINT "TECLAS Z X C V" 
80 LOCATE 0,19: PRINT "TINTES 1 2 3 4"
90 LOCATE 0,17: PRINT "R RESET"
150 IF K$="z" THEN T1=T1+1: IF T1>61 THEN T1=0 
160 IF K$="x" THEN T2=T2+1: IF T2>61 THEN T2=0 
170 IF K$="C" THEN T3=T3+1: IF T3>61 THEN T3=0 
180 IF K$="V" THEN T4=T4+1: IF T4>61 THEN T4=0 
190 IF K$="T" THEN T=T+1: IF T>2 THEN T=0
200 IF K$="R" THEN T=0:T1=48:T2=48:T3=10
210 PALET B T,T1,T2,T3,T4
220 GOTO 30
500 REM IMPRIMIR CARACTERES
510 LOCATE 0,3 
530 FOR I = 189 TO 225 STEP 3
540 PRINT I+1;" ";CHR$(I+1);" ";I+2;" ";CHR$(I+2);
560 PRINT I+3;" ";CHR$(I+3);
570 PRINT CHR$(10)
580 NEXT
590 RETURN

ALGO DE MÚSICA

Esto no es una cátedra de conservatorio, por lo que se exige algo de conocimiento en música, pasaré de esto rapidamente:

  • Como es acostumbrado en cualquier BASIC instrucción PLAY una cadena de texto que contiene los comandos MUSICALES (cadena de texto por tanto entre comillado “”).
  • La notación es ANGLO usando letras CDEFGAB en orden y corresponden a Do,Re,Mi,Fa,Sol,La,SI.
  • Dos formas de modificar el tiempo la primera es con T   letra (T) ;”T1CDEFGAB”, la segunda es colocando el numero después de la nota “C1D2E3F4F5”
  • Las octavas se configuran con O (letra o)
  • El volumen con la leta V
  • El  estacato con la letra M
  • EL FAMICON tiene una polifonia de dos notas “O1ABCD:02ABCD” se separa cada escala con “:”
100 PLAY "T202:T202"
110 PLAY "G3GGFREG8:E3EEDRCE"
120 PLAY "A3FAO3C5O2A3G8:F3DFA5F3E8"
130 PLAY "A3FAO3CO2BA:F3DFAGF"

GUARDAR EN LA CINTA VIRTUAL

La opción inmediata seria guardar el estado pero también podemos emular el funcionamiento de la cinta.

Activar en preferencias (menu OPTION -> PREFERENCES…) la lista “Run in Background”. Esto ya que este proceso toma bastante tiempo y si la maquina se detiene el proceso se detiene. También suele ser útil para pegar textos largos en Nestopia a la consola con la tecla de función F12.

Para Guardar con SAVE

  1. Pero antes de guardar debes ir al menú MACHINE  -> EXTERNAL -> TAPE RECORDER y dar en la opción RECORD.
  2. Guardar con SAVE, el nombre del archivo va entre comillas al ser texto ejemplo SAVE “TEST”.
  3. Esperar un largo rato que regrese la consola
  4. MACHINE  -> EXTERNAL -> TAPE RECORDER …. luego STOP

Para Cargar con LOAD, es muy similar…

  1. Pero antes de guardar debes ir al menú MACHINE  -> EXTERNAL -> TAPE RECORDER y dar en la opción PLAY.
  2. Guardar con SAVE, el nombre del archivo va entre comillas al ser texto ejemplo LOAD”TEST”.
  3. Esperar un largo rato que regrese la consola
  4. MACHINE  -> EXTERNAL -> TAPE RECORDER …. luego STOP

EN LA PRÓXIMA ENTREGA…MANOS EN LA MASA…

Creo que podría quedarme aquí escribiendo 14 mil lineas, en este punto considero he construido una buena introducción a este nostálgico paquete de programación. Enuna próxima entrada platearé un ben ejemplo de diseño de una “experiencia” árcade minimalista con estas reglas, digo con esta plataforma.

Agradecimientos y Referencias

Agradecimientos principales:

  • UglyJoe por  Family BASIC Super Thread y Basic programs from 任天堂のファミリーコンピュータファミリーベーシック
  • Devin Morgan, por Family Basic V3 FAQ

Referencias:

Ejemplos de desarrollo en youtube (no código):

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s