Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: msx dummie en 27 de Octubre de 2007, 02:51:22 pm



Título: DISPAROS EN BASIC
Publicado por: msx dummie en 27 de Octubre de 2007, 02:51:22 pm
Buenas tardes Familia!

me arranco con una nueva, sobre las secuencias de disparo en los juegos hechos en basic.

he programado algunas chorradillas asi en plan sencillo, el tipico marciano que baja y le tienes que dar y caspillas del estilo, para aprender como "disparar" al "enemigo", despues de ver las únicas posibilidades que he encontrado tenemos: inkey$ y on strig

por mi pequeña experiencia he deducido que es mas "real" inkey$ ya que, nada se para en el juego cuando "disparas" , el proyectil avanza y el "marciano" sigue moviendose, ademas mientras puedes mover tu "nave"
cuando he probado con ON STRIG GOSUB... el juego se para, hasta que el proyectil termina su recorrido, esto me parece una putada, ya que si quiero programar un juego para que funcione con el Joystick tendria este problema...

entonces mi pregunta es: ¿existe otra manera de hacer esto en Basic? y ¿existe ademas alguna forma para tener más de un disparo en pantalla? me refiero a no tener que esperar a que el misil llegue al final de su recorrido para volver a disparar.

Hoy estoy muy preguntón  ::), GRACIAS A TODOS!


Título: Re: DISPAROS EN BASIC
Publicado por: Shinzon en 28 de Octubre de 2007, 10:40:05 am
Las limitaciones del Basic son principalmente la velocidad, como ya sabes, y el reducido tamaño de la memoria disponible para programar. Es la primera la que te interesa. De principio, prueba a hacer una rutina sencilla, aunque sea lenta. Luego ya irás puliendo.

Ahora imagina que quieres tener 10 SPRITEs de disparos tuyos (una cantidad muy generosa, que disminuirá la velocidad del BASIC en forma proporcional). Cada uno, tiene sus variables de coordenadas X e Y en relación al SPRITE. De tal forma, que para relacionar una cosa con otra haces algo así:

10 DIM Y(10): DIM X(10) ' Máximo de Sprites
20 PUT SPRITE(sprite a mostrar), (x(del sprite a mostrar), y(del sprite a mostrar)), 15

Ahora ya no recuerdo muy bien la sentencia SPRITE, pero sería mas ó menos así (creo). Cuando tu SPRITE (el que sea) tenga que subir un PIXEL en pantalla, se lo sumas asi:

Y(del sprite a mostrar)=y(del sprite a mostrar)+1
La coordenada X en principio debería ser igual, aunque depende de lo que hagas.

Los demas SPRITES estarán donde tienen que estar. Pero piensa que cuantos mas SPRITEs tengas en pantallas, mas veces tendrá que hacer este cálculo, y hasta que no termine de hacerlo, no pasará a otra cosa.

Sapphire, Viejo_archivero y Darth Fistro dirán que te pases al Ensamblador... ¡y yo lo secundo! No tendrás estos problemas :)

Por otra parte, cuando hablas de:

"cuando he probado con ON STRIG GOSUB... el juego se para, hasta que el proyectil termina su recorrido, esto me parece una putada, ya que si quiero programar un juego para que funcione con el Joystick tendria este problema..."

... das a entender que lo que metes en la rutina de interrupción (que es lo que es ON... GOSUB) es toda la secuencia de movimiento del SPRITE. Algo como esto:

10 ON STRIG GOSUB 1000
...
1000 FOR I=212 TO 0 STEP -1
1010 PUT SPRITE (100, I), 15
1020 NEXT I
1030 RETURN ' Vuelve al programa principal

Da igual que uses un bucle ó una variable autodecrementada. El resultado será el mismo. Hasta que la coordenada Y no sea 0 no parará de moverse (aunque lo demás no se actualiza y claro, no se mueve).

Usala unicamente para sacar una "bala" según las coordenadas X e Y en las que te encuentres, y realiza una rutina principal que se encargue del movimiento de los Sprites (el marcianito, tu nave, y tus mortiferas balas). Un ejemplo:

1000 PUT SPRITEx (x(numero de sprite), y(numero de sprite)), 15
1020 RETURN

Si usas las rutinas de interrupción puedes ganar algo de velocidad y realismo, aunque tampoco demasiado. Mirate las instrucciones "ON (STRIG, STOP, KEY...) GOSUB numero de linea" para aclararte las ideas.

Espero haberte sacado de dudas, cosa que dudo, porque estoy bastante espeso y con un poco de mala leche :(

Cuando tenga el MSX real, espero poder realizar algun ejemplo, porque en el portatil, el emulador me va a pedo burra.

Salu2.  ;D


Título: Re: DISPAROS EN BASIC
Publicado por: msx dummie en 28 de Octubre de 2007, 08:20:19 pm
pues si, me has sido de mucha ayuda, aunque estes de "mala leche" ;)
lo que pasa es que no pillo todo...
por eso, lo del paso a ensamblador lo veo complicado, todavia me falta mucho que aprender sobre basic, que segun tengo entendido es bastante mas sencillo, no?

lo que no acabo de entender es como puedo iniciar la secuencia desde la subrutina a la que se llama con gosub y hacer que continue en el programa digamos "principal"
soy muy burro, lo sé...
pero no sé como se podria hacer esto...
lo que me explicas al principio, al dimensionar x e y tampoco sé si lo estoy comprendiendo del todo.
Pero me lo voy a leer varias veces más, y a hacer pruebas a ver que tal.
muchisimas Gracias.


Título: Re: DISPAROS EN BASIC
Publicado por: Sd-Snatcher en 28 de Octubre de 2007, 09:10:15 pm
Nanana

que lio por dios  ;D.

El on strig hay que usarlo para activar la bala nada mas, me refiero a darle una velocidad y un punto de origen.




50 on strig XXX gosub 10000
....

10000 balax= navex
10010 balay= navey
10020 balav= 1
10030 return



El movimiento de la bala hay que hacerlo en el bucle principal del juego.

Vamos lo mismo que podria ser con

if strig(XX) then balax= navex .....

Pero es mas correcto usando el on strig.









Título: Re: DISPAROS EN BASIC
Publicado por: Shinzon en 29 de Octubre de 2007, 09:27:18 am
Eso es lo que quería decir, pero no me salían las palabras, jajajajaja

El BASIC es fácil. Pero intenta ir paso a paso, practicando las diversas funciones cambiando parámetros y tal. Es cuestión de probar. La parte "mas dificil" es agrupar todo lo que sabes y "ensamblarlo" todo en un programa. Pero la práctica ayuda mucho.

Yo la verdad, es que BASIC aprendí en su día, pero me quedaba siempre corto de recursos (mas que nada velocidad), así que ahora que he vuelto, me he decantado directamente por el Ensamblador. Pero el BASIC está bien para empezar.

Bueno, en fim, que espero haber ayudad aunque sea un poquito :)

SD-Snatcher... acepto la corrección y estás invitado a una cerveza.  :D


Título: Re: DISPAROS EN BASIC
Publicado por: msx dummie en 29 de Octubre de 2007, 10:32:15 am
gracias!
pero a ver si lo cojo del todo:

en la subrutina hago digamos que una variable sea "true" o valga 1, "n=1" para devolverlo a la rutina rincipal, y me imagino que habra que tener una linea despues del return en el programa principal, que mueva ese sprite...
pero ¿como se le puede decir esto? estoy rompiendome el tarro, pero no doy con ello.... me refiero a como se le puede decir que la bala avance hasta un punto en concreto?
no se si me se explicar, que desastreeee!


Título: Re: DISPAROS EN BASIC
Publicado por: cybernoid en 29 de Octubre de 2007, 10:36:40 am
Hola,

Aquí te pego un ejemplillo que acabo de hacer, si hay algo mal no me pegeis, que estoy en el curro y lo he hecho en 5 minutos :P

Código:
5 ' NAVE DISPARA
10 ' --- Slot 0
20 ' color 1
30 DATA &H00,&H00,&H00,&H10,&H23,&H66,&H66,&H7F
40 DATA &H7F,&H67,&H63,&H20,&H10,&H00,&H00,&H00
50 DATA &H00,&H00,&H00,&H04,&HE2,&H33,&H33,&HFF
60 DATA &HFF,&HF3,&HE3,&H02,&H04,&H00,&H00,&H00
70 '
80 ' --- Slot 1
90 ' color 8
100 DATA &H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00
110 DATA &H00,&H00,&H00,&H30,&H78,&H78,&H30,&H00
120 DATA &H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00
130 DATA &H00,&H00,&H00,&H06,&H0F,&H0F,&H06,&H00
140 DATA *
141 DEFINT A-Z
145 SCREEN 2,2
150 gosub 10000

160 DIM DX(10):DIM DY(100)
161 FOR N=0 TO 10:DX(N)=-10:DY(N)=-10
170 X=100:Y=180
180 PUT SPRITE 0,(X,Y),11,0
185 ' MUEVE NAVE
190 IF STICK(0)=3 THEN X=X+4
200 IF STICK(0)=7 THEN X=X-4
205 ' SI PULSA ESPACIO CREA UN DISPARO
210 IF STRIG(0)=-1 THEN GOSUB 410
220 GOSUB 310
230 GOTO 180
300 ' MUEVE DISPAROS
310 FOR N=1 TO 10
315 IF DY(N)<1 THEN DY(N)=-10:PUT SPRITE N,(300,DY(N)),3,1
320 IF DY(N)<>-10 THEN DY(N)=DY(N)-8:PUT SPRITE N,(DX(N),DY(N)),3,1
350 NEXT
360 RETURN
400 ' CREA DISPARO
410 FOR N=0 TO 10
420 IF DY(N)=-10 THEN DY(N)=Y-4:DX(N)=X:RETURN
430 NEXT
440 RETURN


10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL(R$):S=S+1:GOTO 10020
10030 return

Funcionaria bastante mejor con KunBasic.

Espero que te sirva de algo.

Edito: En este caso la "bala" avanza hasta que sale de la pantalla si cambias la linea 315 y pones 315 IF DY(N)<100 THEN DY(N)=-10:PUT SPRITE N,(300,DY(N)),3,1 avanzaria hasta mitad de pantalla + o -
Edito otra vez: conprobado, con Xbasic corre que se las pela :)


Título: Re: DISPAROS EN BASIC
Publicado por: msx dummie en 30 de Octubre de 2007, 09:57:30 pm
gracias Gobblin!
¿podrias decirme para que sirven las condiciones dsede la line 300?
gracias!