Lectura eficiente del input (entrada) en BASIC ¿cómo?

Página 3/3
1 | 2 |

Por Dreamerm42

Hero (622)

Imagen del Dreamerm42

11-01-2015, 02:20

Ajammm si pero... llamame burro... xD

Por AxelStone

Prophet (2963)

Imagen del AxelStone

11-01-2015, 11:14

Warchild wrote:

Nunca he usado saltos a subrutinas con los sticks, si quitas las lineas 30 y 40 y en la 80 pones GOTO 50 ha de funcionar igual y evitas los saltos. Siempre vas a operar con el estado de los cursores inmediatamente después de leerlos, tal como haces.
Yo uso IF THEN tal cual, tu método parece más directo. Gracias por compartir tu código! Nos ayuda al resto a aprender también Smile

Vale ya se pq uso el GOSUB. Es que además de actualizar la X-Y hago otros procesos (cargar nuevos fotogramas del personaje) que no quiero que se hagan si no pulso la tecla o queda un efecto raro de Cody andando en el sitio Smile . El que solo necesite actualizar X-Y que pruebe el método sin GOSUB y nos cuentan señores Wink

Por Warchild

Paragon (1280)

Imagen del Warchild

11-01-2015, 16:44

Si no se pulsa ninguna tecla el valor de Stick (x) será cero. Siempre vas a tener que hacer otros procesos además de actualizar X e Y. Yo te recomiendo que evites siempre que puedas las instrucciones tipo on...gosub. Consumen más tiempo y memoria que comprobar con If-then o similares. Más si tu objetivo es hacer un juego "a lo grande". En un pequeño listado no lo vas a notar.

@Dreamerm42:

En cada ciclo la bios lee el teclado y guarda los valores en las posiciones de memoria que indica e_sedes. Cada byte representa 8 teclas, una por bit. Para saber a qué grupo de teclas corresponde cada byte y qué bit corresponde a cada tecla debes consultar una tabla, la matriz del teclado. De esta forma puedes detectar la pulsación de dos teclas a la vez, o de teclas como shift, graph, ctrl...

Mírate documentación, pero no sólo manuales de Basic. Coge la lista de variables del sistema, verás que hay muchos datos ahí con los que podrás jugar con POKE y PEEK. Experimenta un poco y ya me dices si te va saliendo algo.

10 cls
20 locate 0, 0
30 for k=0 To 10
40 locate 0,0
50 print peek (&hFBE5+k)
40 next k
50 goto 20

Ejecuta este programa y verás como cambian los valores al pulsar las teclas. Espero que te sirva para empezar a entenderlo. Smile

Por theNestruo

Champion (296)

Imagen del theNestruo

11-01-2015, 20:12

AxelStone wrote:

Solo lo he hecho para los cursores, el truco al final resulta que era que en el ON GOSUB debes especificar el salto para todas las teclas. Código funcionando dentro de un turbo bloque:

10 ' cursores=0, j1=1, j2=2. Vamos a elegir cursores
20 K%=0
30 ON STICK(K%) GOSUB 50,50,50,50,50,50,50,50
40 GOTO 30
50 D%=STICK(K%)
60 X%=X%-(D%=2)-(D%=3)-(D%=4)+(D%=6)+(D%=7)+(D%=8)
70 Y%=Y%-(D%=4)-(D%=5)-(D%=6)+(D%=8)+(D%=1)+(D%=2)
80 RETURN

Yo creo que la "gracia" de usar ON STICK GOTO/GOSUB es que te permite discriminar en función de valor y no tener que volverlo a leer después o hacer comprobaciones. Es decir, en vez de enviar todas las direcciones a la misma subrutina, enviar cada una a la suya específica:

30 ON STICK(K) GOSUB 50,60,70,80,90,100,110,120
40 GOTO 30
50 Y=Y-1:RETURN
60 X=X+1:Y=Y-1:RETURN
70 X=X+1:RETURN
etc.

Especialmente útil para rutinas de movimiento "complejas" (que no sean meras actualizaciones de coordenadas: saltos, agacharse, etc.).

Por otra parte, para una mera actualización de coordenadas yo utilizaría arrays:

10 FOR I=0 TO 8:READ DX(I), DY(I):NEXT
20 DATA 0,0,1,1,1,0,-1,-1,-1
30 DATA 0,-1,-1,0,1,1,1,0,-1
40 K=0:REM CURSORES
50 D=STICK(K):X=X+DX(D):Y=Y+DY(D)
60 GOTO 50

Que en teoría debería ser lo más rápido porque no hay comparaciones ni saltos.

Nota: el código lo he escrito aquí directamente, así que es meramente ilustrativo Big smile Vamos, que puede tener erratas

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

11-01-2015, 22:54

vale en basic pero en ensamblador como hago las diagonales??

@@CHECK_TECLA:
xor a
ld a,8
call SNSMAT
bit 5,a
jp z,@@UP
bit 6,a
jp z,@@DOWN
bit 4,a
jp z,@@LEFT
bit 7,a
jp z,@@RIGHT
bit 0,a
jp z,FIN
jp @@CHECK_TECLA

Por AxelStone

Prophet (2963)

Imagen del AxelStone

12-01-2015, 09:44

Pues sí, he reordenado el código para quitar el on gosub y responde bien.

Por FX

Champion (264)

Imagen del FX

12-01-2015, 18:13

jrcp_kun wrote:

vale en basic pero en ensamblador como hago las diagonales??

@@CHECK_TECLA:
xor a
ld a,8
call SNSMAT
bit 5,a
jp z,@@UP
bit 6,a
jp z,@@DOWN
bit 4,a
jp z,@@LEFT
bit 7,a
jp z,@@RIGHT
bit 0,a
jp z,FIN
jp @@CHECK_TECLA

Puedes poner unos cp antes de los bit.
Por ejemplo para arriba y derecha seria cp &b110000 (los bits 5 y 4)
Siempre que en la rutina a la que llamas haga algo especial con las diagonales.
Sino, si por ejemplo solo se modifica una variable x o y, poniendo un call z en vez de jp z, podría servir (se llamaría primero a arriba y después a la derecha)
Un saludo
Fx

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

12-01-2015, 21:04

la mejoro y la pruebo a ver
gracias felix

Página 3/3
1 | 2 |