Ajammm si pero... llamame burro... xD
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
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 . El que solo necesite actualizar X-Y que pruebe el método sin GOSUB y nos cuentan señores
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.
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 Vamos, que puede tener erratas
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
Pues sí, he reordenado el código para quitar el on gosub y responde bien.
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
la mejoro y la pruebo a ver
gracias felix