Programando videojuegos en SuperBASIC: teclado

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Programando videojuegos en SuperBASIC: teclado

Notapor radastan el Mar Ene 13, 2009 7:13 pm

Empezamos a meter caña al SuperBASIC del QL para algo más que utilidades, empezando por el teclado.

Existen tres formas de usar el teclado desde SuperBASIC:

- INPUT
- INKEY$
- KEYROW

Con INPUT introducimos una cadena de texto, del tirón, y no podemos hacer nada mientras el usuario no pulse enter. Salvo aventuras, poco uso tiene.

Con INKEY$ podemos ver la respuesta a cierta tecla, ejemplo:

100 IF INKEY$="o" THEN LET X=X-1

Es decir, se usa exactamente igual que en Spectrum, pero tiene una pega importante: retardo inicial. Quiere decir que responde como las teclas en un editor de texto, cuando dejas pulsada una tecla tarda un tiempo en repetir la misma. Esto nos limita su uso al menú de opciones y juegos donde sólo se espera la pulsación de una tecla determinada, pero no nos sirve para juegos en el que la respuesta del teclado es crucial.

Para este último caso tenemos KEYROW, que es por así decirlo lo que los usuarios del BASIC del ZX Spectrum hemos soñado durante años y que teníamos que sustituir por el incómodo IN al puerto correspondiente. KEYROW lee directamente el valor del puerto de las 8 filas de teclas disponibles en el QL. Un ejemplo podría ser:

100 IF KEYROW(5)=128 THEN LET X=X-1

esta línea hace lo mismo que en el anterior ejemplo, mira si se ha pulsado la tecla "o". Pero ojo, si pulsamos simultáneamente alguna tecla más de dicha fila ya no nos funcionará, por lo que deberemos ingeniárnoslas para hacer un uso correcto (eso lo dejo para otro momento).

Bien, llegados a esto es conveniente que toméis contacto con las teclas del QL a través de KEYROW mediante el siguiente cutre-programa:

Código: Seleccionar todo
10 cls
20 AT 0,0: PRINT "FILA 0: "; KEYROW(0)
30 AT 1,0: PRINT "FILA 1: "; KEYROW(1)
40 AT 2,0: PRINT "FILA 2: "; KEYROW(2)
50 AT 3,0: PRINT "FILA 3: "; KEYROW(3)
60 AT 4,0: PRINT "FILA 4: "; KEYROW(4)
70 AT 5,0: PRINT "FILA 5: "; KEYROW(5)
80 AT 6,0: PRINT "FILA 6: "; KEYROW(6)
90 AT 7,0: PRINT "FILA 7: "; KEYROW(7)
100 GOTO 20


Lo se, es muy mejorable,pero es sencillo de entender. Con KEYROW podemos leer las filas 0 a 7 (8 en total) y nos devolverá un valor decimal entre 0 (ninguna tecla pulsada) y 255 (todas las teclas pulsadas). Para entender el resultado basta saber como se aplican los valores en decimal de cada bit dentro de un byte (que es lo que estamos leyendo):

1
2
4
8
16
32
64
128

Cada fila tiene 8 teclas, y según su posición nos devolverá uno de los valores anteriores al ser pulsada.

Como ejemplo rápido supongamos que usamos o y p para mover una raqueta dentro de un campo de juego:

Código: Seleccionar todo
100 MODE 8
110 PAPER 0: INK 7: CLS
120 BORDER 4,6
130 LET x=16
140 AT 18,x: PRINT "----"
150 IF KEYROW(5)=128 AND x>0 THEN AT 18,x+3: PRINT " ": LET x=x-1
160 IF KEYROW(4)=32 AND x<32 THEN AT 18,x: PRINT " ": LET x=x+1
170 goto 140


Tachán! ya tenemos realizada la primera parte de un juego de frontón o Arkanoid.

Mañana más.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________
Avatar de Usuario
radastan
Phantomas
 
Mensajes: 2178
Registrado: Lun May 07, 2007 5:34 pm

Re: Programando videojuegos en SuperBASIC: teclado

Notapor radastan el Mar Ene 13, 2009 11:23 pm

Badaman, muy gentilmente, me ha pasado los mismos ejemplos pero sin usar GOTO y optimizando un poco:

Código: Seleccionar todo
100 CLS : FOR i=0 to 7 : PRINT "|FILA ";i;": "
110 REPeat bucle
120   FOR i=0 TO 7: AT i,9: PRINT KEYROW(i): CLS 4
130 END REPeat bucle


Código: Seleccionar todo
100 MODE 8
110 PAPER 0: INK 7: CLS
120 BORDER 4,6||
130 x=16
140 REPeat bucle
150   AT 18,x: PRINT ||||"----"
160   IF KEYROW(5)=128 AND x>0 THEN AT 18,x+3: PRINT " ": x=x-1
170   IF KEYROW(4)=32 AND x<32 THEN AT 18,x: PRINT " ": x=x+1
180 END REPeat bucle


También me recuerda que para romper el bucle hay que hacer "BREAK" mediante CTRL+ESPACIO

Lo que no sabía es que no hacía falta NEXT para cerrar un FOR en SuperBASIC, me ha dejado a cuadros.

Mañana os dejaré un sencillo programa de frontón, que por cierto es algo lento debido a los "IF", tengo que probar mi técnica de sustitución a ver si acelera también en QL o no. La verdad es que el intérprete SuperBASIC del QL es lento para estar un 68008 detrás.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________
Avatar de Usuario
radastan
Phantomas
 
Mensajes: 2178
Registrado: Lun May 07, 2007 5:34 pm

Re: Programando videojuegos en SuperBASIC: teclado

Notapor badaman el Mar Ene 13, 2009 11:48 pm

De los bucles REPeat también puede salirse con una condición:

Código: Seleccionar todo
REPeat bucle
IF condición THEN EXIT bucle
...
...
END REPeat bucle


radastan escribió:Lo que no sabía es que no hacía falta NEXT para cerrar un FOR en SuperBASIC, me ha dejado a cuadros.

Mañana os dejaré un sencillo programa de frontón, que por cierto es algo lento debido a los "IF", tengo que probar mi técnica de sustitución a ver si acelera también en QL o no. La verdad es que el intérprete SuperBASIC del QL es lento para estar un 68008 detrás.


Efectivamente. Igual que con IF, si todo lo que quieres que se ejecute dentro del bucle FOR lo pones en la misma línea, no necesitas END FOR (o el antiguo NEXT) Por cierto, NEXT tiene otra función dentro de los bucles anidados FOR .. NEXT .. END FOR. Y aún quedan mas cosas que decir de FOR. Es muy potente.

Para evitar los IF puedes probar a usar:

Código: Seleccionar todo
SELect ON variable
=valor1 : sentencias
=valor2 : sentencias
...
=REMAINDER : sentencias
END SELect variable


Ver Guía de usuario (palabras claves).
Ultima edición por badaman el Mar Ene 13, 2009 11:56 pm, editado 4 veces en total
Sinclair QL, la respuesta profesional de los 80
Avatar de Usuario
badaman
Sabreman
 
Mensajes: 475
Registrado: Mar Ene 29, 2008 11:58 am

Re: Programando videojuegos en SuperBASIC: teclado

Notapor radastan el Mar Ene 13, 2009 11:51 pm

Es que sustituir IF por SELect ON variable es casi lo mismo, se trata de acelerar las decisiones con triquiñuelas, porque en caso contrario la cosa se enletece una barbaridad. Con decir que es casi más lento el SuperBASIC del QL que el BASIC del Spectrum, incluso en algunas cosas es más rápido este último.

La cuestión es ver qué cosas son más rápidas en QL y sacar partido de ello.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________
Avatar de Usuario
radastan
Phantomas
 
Mensajes: 2178
Registrado: Lun May 07, 2007 5:34 pm

Re: Programando videojuegos en SuperBASIC: teclado

Notapor afx el Mie Ene 14, 2009 1:43 am

badaman escribió:Por cierto, NEXT tiene otra función dentro de los bucles ...

Efectivamente, NEXT fuerza la siguiente iteración del bucle, END FOR el fin del bloque que se repite.

Por ejemplo:
Código: Seleccionar todo
FOR I = 1 TO N
   ... <sección A> ...
   IF <condición> THEN NEXT I
   ... <sección B> ...
END FOR I

Si se cumple <condición> se fuerza la siguiente iteración del bucle y no se ejecuta la <sección B>.
afx
Sabreman
 
Mensajes: 396
Registrado: Dom Feb 24, 2008 11:56 pm


Volver a Sinclair QL

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron