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! |