Detecciones en SuperBASIC

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

Moderador: Sir Cilve Sinclair

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Detecciones en SuperBASIC

Mensaje por radastan » Mar Ene 20, 2009 12:43 pm

Vamos a ver, llegamos al espinoso asunto de realizar detecciones en SuperBASIc dentro de un juego. Me refiero a las instrucciones de ZX Specttum para comprobar los atributos o el caracter de una posición. ¿existe equivalencia en SuperBASIC?
Última edición por radastan el Mar Ene 20, 2009 3:50 pm, editado 1 vez en total.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Deteccines en SuperBASIC

Mensaje por badaman » Mar Ene 20, 2009 1:26 pm

¿Espinoso? No entiendo muy bien la pregunta, entre otras cosas porque no conozco el sistema de atributos del Spectrum, y en el QL no hay un sistema de atributos por un lado y una pantalla por otro.

Por lo que expones, deduzco que en el Spectrum hay una forma de saber que carácter se encuentra en una determinada posición de la pantalla. Si esto es lo que preguntas, en el QL, como en otros ordenadores con sistemas gráficos orientados a pixels, esto no es posible. Lo más que podemos hacer es leer un buffer de un canal, pero estos datos no tienen una estructura relacionada con la pantalla, sino que tienen estructuras de cadenas. Por ejemplo, cuando leemos un puerto serie o un microdrive asociado a un canal.

Los caracteres en el QL no están sujetos a una rejilla de n caracteres de ancho por n de alto, pues podemos escribir un carácter en cualquier ventana, y una ventana podemos ubicarla en cualquier posición x,y de la pantalla, pero es que incluso dentro de una ventana, un carácter puede imprimirse en cualquier coordenada de pixels con el comando CURSOR.

Si lo que quieres es leer una posición determinada y conocer si alli hay algo tendrás que establecer una referencia con la pantalla usando una matriz (DIM) de 2 dimensiones.
Sinclair QL, la respuesta profesional de los 80

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Deteccines en SuperBASIC

Mensaje por Gandulf » Mar Ene 20, 2009 1:38 pm

Creo que la detección en base a los atributos no tiene mucho sentido en el QL, en todo caso sería mirar si un determinado pixel tiene un valor determinado para ver su color. En cuanto a saber qué caracter hay en una determinada posicion de pantalla no me suena que se pueda hacer en spectrum (seguro que estoy equivocado porque Radastan programa a menudo en Basic), ya que cuando pones un caracter en pantalla se vuelca como pixels, no tiene "modo texto".

Lo normal sería hacer la detección como se haría en cualquier juego, de spectrum también, si el movimiento es pixel a pixel o no hay colores; comparando coordenadas entre sprites/objetos, y no mirando si un atributo tiene un valor determinado para ver si se choca con algo.
Un saludo,

Gandulf

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por radastan » Mar Ene 20, 2009 3:52 pm

En Spectrum es posible saber el atributo de una posición de pantalla con una orden, al igual que el caracter que lo ocupa (devuelve el valro ASCII).

tal y como me temía hay que recurrir al tema de matrices, lo que complica un poco las cosas en ciertos juegos. Es que da la puñetera casualdiad que ando varios días enredando con la versión QL de BASIC Rally y no doy con la tecla, por lo que tendré que recurrir a matrices... lo que lo hará más lento por un lado, pero también con más posibilidades por el otro (se puede hacer un circuito).

A ver que consigo.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Detecciones en SuperBASIC

Mensaje por Gandulf » Mar Ene 20, 2009 4:19 pm

Lo del color lo tengo claro, pero el caracter me parece fastidiado, porque nada te impide poner pixels en cualquier lado de la pantalla, haya texto o no, y entonces ¿cómo se reconoce al caracter? Si esa función existe (desconozco el nombre) para funcionar tendría que comparar los 8 x 8 pixels que le indiques con los 8x8 pixels de cada carácter del juego de caracteres hasta encontrar una comparación 100% exacta. Tiene que ser lentíiiiiiisimmma.
Un saludo,

Gandulf

Avatar de Usuario
Metalbrain
Freddy Hardest
Mensajes: 592
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por Metalbrain » Mar Ene 20, 2009 4:45 pm

La función es SCREEN$ (y, x), y solo reconoce los caracteres estandar, pero no los GDU. No se si se ve afectada o no por la variable de sistema (CHARS?) que indica la posición del juego de caracteres, o compara a saco con la ROM.
SevenuP se escribe con u minúscula y P mayúscula.

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Detecciones en SuperBASIC

Mensaje por Gandulf » Mar Ene 20, 2009 5:00 pm

Joer, a no me acordaba de la función SCREEN$. Pues como dices, habría que ver si funciona con una fuente alternativa activada (seguramente sí), pero además de super lenta, no le veo mucho sentido la verdad y menos en un juego, ya que cualquier pixel que invada el caracter invalida la comparación. Esto lo veo más adecuado en los sistemas con modos de texto puro, donde los caracteres en pantalla no se representan con pixels sino con códigos de caracter.

Yo lo haría por el sistema de toda la vida donde cada sprite/objeto que puede colisionar tiene coordenadas X, Y y Ancho y Alto, y se comparan los cuadrados que definen cada objeto.

Gracias por refrescarme la memoria con esta función Basic.
Un saludo,

Gandulf

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Detecciones en SuperBASIC

Mensaje por na_th_an » Mar Ene 20, 2009 5:10 pm

Es muy lento. Lo más rápido es tirar de arrays, como dios manda.

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por badaman » Mar Ene 20, 2009 5:52 pm

radastan escribió:tal y como me temía hay que recurrir al tema de matrices, lo que complica un poco las cosas en ciertos juegos. Es que da la puñetera casualdiad que ando varios días enredando con la versión QL de BASIC Rally y no doy con la tecla, por lo que tendré que recurrir a matrices... lo que lo hará más lento por un lado, pero también con más posibilidades por el otro (se puede hacer un circuito).


De la forma que tu dices has de hacer exactamente las mismas comprobaciones. Ver si hay un coche arriba si avanzas, a los lados si giras, y atras si reculas. Ahora en vez de consultar la pantalla consultas una matriz.

Pongamos que tienes una zona de la carretera de 11 de ancho por 20 de alto que estan definidas en una matriz carretera$(10,19):

Código: Seleccionar todo

defines micoche=19
defines tope=0
Pintas el coche que pilotamos en la posición carretera$(6,micoche)
inicias bucle
  borras micoche
  subes el coche una posición: micoche=micoche-1
  si micoche=-1 entonces micoche=19
  cuando detectas colisión, sales del bucle
  pintas micoche
  subes el tope de la carretera tope=tope-1
  si tope=-1 then tope=19
  borras la linea de la carretera - carretera$(tope)=FILL$(" ",11) -  por si hubiese otro coche pintado antes
  Si toca poner un nuevo coche en la carrera, pintas un nuevo coche en la posición (RND(0 to 10),tope)
terminas bucle
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por radastan » Mar Ene 20, 2009 6:08 pm

Bada, se por donde hay que ir, el problema es que no se como será de lento el superBASIC a la hora de consultar matrices, pero vamos, que todo es ponerse y ver el resultado. Ya estoy en ello, cuando saque conclusiones os las comunico.

Ya de paso estoy meditando crear una matriz para un circuito completo, es decir, que tenga zonas que vayas más rápido (asfalto), que puedas derrapar (tierra), etc. Una matriz me da muchas más posibilidades. Empezaré por algo sencillo, y ya veré por donde se puede ir.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por badaman » Mar Ene 20, 2009 6:43 pm

Por lo que he leido, no más que usando algo como SCREEN$. De cualquier forma, siendo la unica opción posible...

Sobre las indicaciones, ya sabes que siempre explico más de lo necesario para que quien lea se anime y aprenda. Piensa que en este caso la primera cosa que se le pasa a uno por la cabeza es que va a tener que mover fila a fila de la matriz para dejar hueco. Y esto no es necesario.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por badaman » Jue Ene 22, 2009 7:39 pm

Siguiendo las indicaciones que puse anteriormente, he realizado un pequeño juego al que he llamado Crash.

Imagen

Vamos a toda velocidad por la carretera y tenemos que evitar chocar con los coches que vienen en dirección contraria.

Para ello puedes usar las teclas del cursor arriba, abajo, izquierda y derecha.

El juego acaba cuando te estrellas con otro coche.

Puedes cambiar el número de coches (1 a 5) que llenan la pista y el alto (1 a 9) y ancho (2 a 28) de la carretera (aunque una carretera de menos de 5x6 caracteres ya es un poco angustiosa). Y todo ello en 40 líneas de código.

Si tenemos GoldCard o un emulador muy rápido, podemos quitar el REM de la línea 380 para ralentizar un poco el juego.

Código: Seleccionar todo

100 REMark crash_bas - 2009 - badaman
110 MODE 8: CLS: CLS #0
120 REMark cambia "an" = ancho pista
130 al=9: an=11: REMark vals. 2 a 28
140 REMark cambia "nv" = dificultad
150 nv=3: REMark 1 dific. a 5 facil
160 h=INT(an/2): ch=h+1: v=al: cv=v
170 coche$=CHR$(174): otro$=CHR$(183)
180 lin$=FILL$(" ",an): tp=0: sw=0
190 DIM camino$(al,an): ca=5
200 FOR i=0 TO al: camino$(i)=lin$
210 OPEN #ca,scr_448x200a32x16
220 PAPER #ca,4: CLS#ca: INK#ca,1
230 WINDOW #ca,an*16,(al+1)*20,32+(448-(an*16))/2,16+(200-((al+1)*20))/2
240 PAPER #ca,6: CLS#ca: CSIZE#ca,3,1
250 REPeat carrera
260   ov=v:oh=h
270   IF KEYROW(1)=4 AND v>1 AND cv>1
280     IF camino$(cv-1,ch)<>" " THEN sw=1: ELSE cv=cv-1: v=v-1
290   END IF
300   IF KEYROW(1)=128 AND v<al THEN cv=cv+1: v=v+1
310   IF KEYROW(1)=2  AND ch>1  THEN ch=ch-1: h=h-1
320   IF KEYROW(1)=16 AND ch<an THEN ch=ch+1: h=h+1
330   cv=cv-1: IF cv<0 THEN cv=al
340   AT #ca,ov,oh: PRINT #ca," "
350   SCROLL #ca,20
360   AT #ca,v,h: PRINT #ca,coche$
370   IF camino$(cv,ch)<>" " OR sw THEN EXIT carrera
380   REMark PAUSE 5: REMark quita REM para GoldCar
390   tp=tp-1: IF tp<0 THEN tp=al
400   camino$(tp)=lin$
410   n=RND(0 TO nv)
420   IF NOT n
430     n=RND(1 TO an)
440     AT #ca,0,n-1: PRINT #ca,otro$
450     camino$(tp,n)=otro$
460   END IF
470 END REPeat carrera
480 AT #ca,v,h: PRINT #ca,"*";
490 AT #ca,0,0: PRINT #ca,"Crash!"
500 CSIZE #ca,0,0: CLOSE #ca


Las variables que he usado son las siguientes:

al=alto de la carretera en caracteres
an=ancho de la carretera en caracteres
nv=nivel de dificultad
h=posición horizontal de nuestro coche en la pantalla en chr.
v=posición vertical de nuestro coche en la pantalla en chr.
ch=pos. horizontal de nuestro coche en la matriz de la carretera
cv=pos. vertical de nuestro coche ne la matriz de la carretera
coche$=letra que define el dibujo de nuestro coche
otro$=letra que define el dibujo de los otros coches
lin$=cadena de caracteres llena de un número de espacios igual al ancho de la carretera
camino$=matriz para guardar los otros coches que aparecen en la carretera
tp=puntero que indica la posición dentro de camino$ donde empieza la carretera
sw=variable sw que sirve para saber si se debe abandonar el juego cuando su valor es 1
ca=número del canal que vamos a abrir para pintar la carretera
ov=valor anterior de v
oh=valor anterior de h
n=variable para saber si debemos pintar un nuevo coche en la carretera o no dependiendo de nv y del azar.

La estructura del programa es la siguiente:

100-190 Definimos las variables
200 llenamos de espacios la matriz carretera$
210-240 abrimos el canal y pintamos la pantalla
250 abrimos el bucle del juego
260 guardamos los valores de la posición actual del coche en la pantalla en ov,oh
270-320 comprobamos si hemos pulsado una tecla del cursor y actualizamos las variables oportunas
330 actualizamos el puntero de la posición de nuestro coche en la matriz subiendo una posición
340-360 borramos nuestro coche de la pantalla, hacemos scroll vertical y pintamos de nuevo el coche
370 Si hay algo en esa posición, hemos chocado y salimos del bucle del juego
380 quitamos el REM del principio si queremos que el juego se ralentice
390 actualizamos el puntero del tope o donde empeiza la pantalla
400 borramos la fila dela carretera por si hubiese algún coche ya pintado en esa fila
410 elejimos un valor al azar entre 0 y el nivel de juego
420 Si sale 0 entonces pintamos un coche adversario
430 elejimos la posición del coche adversario a lo ancho de la carretera
440 lo pintamos en la pantalla
450 lo reflejamos en la matriz de la carretera
460 coche adversario pintado
470 vuelta a empezar hasta que salgamos del bucle
480-490, si hemos salido del bucle es que nos hemos chocado, y lo pintamos en pantalla
500 cerramos el canal
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por radastan » Vie Ene 23, 2009 10:05 am

Cambiando la línea 340 por 355 queda mucho mejor, parece un gusano que tiene que sortear el camino.

Ya estoy trabajando en más modificaciones.

Y como curiosidad realmente sorprendente... si te fijas en el camino un rato... te da la sensación que toda la pantalla es amarilla.

:D
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por badaman » Vie Ene 23, 2009 10:26 am

Queda muy curioso sí. Parece una serpiente. Y lo más interesante es que no necesitamos comprobar si algún coche choca con la cola de la serpiente, pues el scroll impide eso.

Ahi tienes una idea para un juego, una serpiente que debe comerse todo lo que se encuentra por el camino. A mas coma mas puntos, y si se traga una seta venenora... oh wait. :)

Por cierto, no necesitamos cambiar el orden de las líneas, con poner un REMark a la línea 340... de esta forma evitamos el parpadeo de pintar y borrar.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Detecciones en SuperBASIC

Mensaje por radastan » Vie Ene 23, 2009 11:07 am

Más modificaciones al "gusano":

- Cargaros las líneas 400, 410, 420, y 460.
- Meted algo de color, por ejemplo "ink #ca, 1" delante del "coche" y "ink #ca, 2" delante de los "otros"

Ahora ya es hasta frenético, mola mazo.

Voy a dar unos retoquillos y a hacer un menú, ya tenemos juego "Gusano".
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 18 invitados