Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con disparos en Blitz3D

Iniciado por Puyover, 08 de Septiembre de 2007, 11:11:55 PM

« anterior - próximo »

Puyover

Hola a todos!

Vereis estoy haciendo un juego tipo asteroids en Blitz3D y funciona todo perfectamente excepto un pequeño detalle: Si mientras me muevo en la direccion Abajo+Izquierdas y pulso la tecla disparar, la nave no dispara, solo lo hace si me quedo QUIETO en esa direccion :S

Os dejo el codigo de las funciones referentes al movimiento de la nave y las balas:

Citar
Function UpdateBullet()
   For Bala.BULLETS = Each BULLETS
      If Bala\Direccion = BABAJO_I Then
         Bala\Y = Bala\Y + Bala\Velocidad
         Bala\X = Bala\X - Bala\Velocidad
      ElseIf Bala\Direccion = BARRIBA_D Then
         Bala\Y = Bala\Y - Bala\Velocidad
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BDERECHA_A Then
         Bala\Y = Bala\Y + Bala\Velocidad
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BIZQUIERDA_A Then
         Bala\Y = Bala\Y - Bala\Velocidad
         Bala\X = Bala\X - Bala\Velocidad
      ElseIf Bala\Direccion = BARRIBA Then
         Bala\Y = Bala\Y - Bala\Velocidad
      ElseIf Bala\Direccion = BDERECHA Then
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BABAJO Then
         Bala\Y = Bala\Y + Bala\Velocidad
      ElseIf Bala\Direccion = BIZQUIERDA Then
         Bala\X = Bala\X - Bala\Velocidad
      EndIf
      
      DrawImage(Bala\Grafico, Bala\X, Bala\Y, 0)
      
      If Bala\X > X_Final Then
         Delete Bala
      ElseIf Bala\X < X_Inicial Then
         Delete Bala
      ElseIf Bala\Y > Y_Final Then
         Delete Bala
      ElseIf Bala\Y < Y_Inicial Then
         Delete Bala
      EndIf
      
      For rock.ASTEROIDE = Each ASTEROIDE ;Recorremos todos los asteroides
         If Bala <> Null Then ;Si la Bala existe entonces...
            If ImagesCollide(Bala\Grafico, Bala\X, Bala\Y, 0, rock\Grafico, rock\X, rock\Y, 0) Then               
               PlaySound sndExplosion
               Explosionar(rock\X, rock\Y)
               Colision = 1
               rock\NivelHP = rock\NivelHP + 1
               rX = rock\X: rY = rock\Y
               Delete Bala
               If rock\NivelHP > 7 Then
                  Asteroides_Destruidos = Asteroides_Destruidos + 1
                  Delete rock
               EndIf
            EndIf
         EndIf
      Next
   Next
End Function

Citar
Function Disparar()
   Municion = Municion + 1
   PlaySound sndDisparo
   Bala.BULLETS = New BULLETS
   Bala\Grafico = LoadAnimImage("gfx/SpriteSheet.png", 64, 64, 8, 8)
   Bala\X = ship\X
   Bala\Y = ship\Y
   Bala\Velocidad = 4
   MaskImage Bala\Grafico, 255, 0, 255
   HandleImage Bala\Grafico, 2, 3
   
   If ship\Direccion = ARRIBA_D Then Bala\Direccion = BARRIBA_D
   If ship\Direccion = IZQUIERDA_A Then Bala\Direccion = BIZQUIERDA_A
   If ship\Direccion = DERECHA_A Then Bala\Direccion = BDERECHA_A
   If ship\Direccion = ABAJO_I Then Bala\Direccion = BABAJO_I
   If ship\Direccion = ARRIBA Then Bala\Direccion = BARRIBA
   If ship\Direccion = DERECHA Then Bala\Direccion = BDERECHA
   If ship\Direccion = ABAJO Then Bala\Direccion = BABAJO
   If ship\Direccion = IZQUIERDA Then Bala\Direccion = BIZQUIERDA
End Function

Citar
Function MoverNave()
   If KeyDown(DUP) And KeyDown(DRIGHT) Then
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa arriba y derecha entonces...
      ship\X = ship\X + ship\Velocidad
      ship\Direccion = ARRIBA_D
   
   ElseIf KeyDown(DLEFT) And KeyDown(DUP) Then
      ship\Direccion = IZQUIERDA_A
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa izquierda y arriba entonces...
      ship\X = ship\X - ship\Velocidad
      
   ElseIf KeyDown(DRIGHT) And KeyDown(DDOWN) Then
      ship\X = ship\X + ship\Velocidad ;...Si se pulsa derecha y abajo entonces...
      ship\Y = ship\Y + ship\Velocidad
      ship\Direccion = DERECHA_A
      
   ElseIf KeyDown(DDOWN) And KeyDown(DLEFT) Then
      ship\Y = ship\Y + ship\Velocidad ;...Si se pulsa abajo e izquierda entonces...
      ship\X = ship\X - ship\Velocidad
      ship\Direccion = ABAJO_I
   
   ElseIf KeyDown(DUP) Then
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa arriba entonces...
      ship\Direccion = ARRIBA
   
   ElseIf KeyDown(DRIGHT) Then
      ship\X = ship\X + ship\Velocidad ;...Si se pulsa derecha entonces...
      ship\Direccion = DERECHA
   
   ElseIf KeyDown(DDOWN) Then
      ship\Y = ship\Y + ship\Velocidad ;...Si se pulsa abajo entonces...
      ship\Direccion = ABAJO
      
   ElseIf KeyDown(DLEFT) Then
      ship\X = ship\X - ship\Velocidad ;...Si se pulsa izquierda entonces...
      ship\Direccion = IZQUIERDA
   EndIf
   
   If ship\Y < Y_Inicial Then ship\Y = Y_Final
   If ship\Y > Y_Final Then ship\Y = Y_Inicial
   If ship\X < X_Inicial Then ship\X = X_Final
   If ship\X > X_Final Then ship\X = X_Inicial
   
   If KeyHit(57) Then Disparar()
   
   DrawImage ship\Grafico, ship\X, ship\Y, ship\Direccion
End Function

En fin, gracias adelantadas por vuestra ayuda!
Vivimos en la era de la televisión. Una sola toma de una enfermera bonita ayudando a un viejo a salir de una sala dice más que todas las estadísticas sanitarias. -Margaret Thatcher

[Vil]

Perdona que responda sin leer tu codigo, es por dar una respuesta rapida (y perezosa...). Has debuggeado a ver si te detecta la tecla disparo? a veces cuando pulsas mas de tres teclas a la vez, una de ellas no es reconocida (no se si es cosa de Blitz o en general de algunos teclados, drivers o yo que se). A mi me pasa tambien en otros juegos como el frets on fire.

Prueba a cambiar la tecla de disparo o a ver si realmente te detecta q le das a la tecla.

Un saludo

Puyover

Se me habia olvidado decir que dispara hacia todas las direcciones excepto hacia esa en particular :S lo siento.

De todas formas si mientras te mueves en esa direccion intentas disparar, no lo hace, mientras que si te quedas quieto en esa direccion y disparas si que lo hace.

La verdad es que es un poco raro todo esto.
Vivimos en la era de la televisión. Una sola toma de una enfermera bonita ayudando a un viejo a salir de una sala dice más que todas las estadísticas sanitarias. -Margaret Thatcher

Mars Attacks

En cualquier caso, prueba lo que te ha dicho. Pon un print o algo para asegurarte de que lee esa tecla bien en ese caso. Sería raro que pasara, sabiendo que con combinaciones similares no pasa, pero cosas veredes...

davidgf

E! Eso me pasó a mi en un juego de matamarcianos con DirectDraw7 i VB6. Yo diría que es problema del tecaldo  (del controlador) sabes qué puedes hacer? probar con varios pcs y teclados y nos cuentas. A mi me pasava que algunas combinaciones de 3 teclas no andavan pero diria que no es problema del código.

También me pasava eso jugando a juegos de la VBA con el emulador si tenia que apretar más de 2 teclas a la vez

Espero que te ayude...
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

BeRSeRKeR

Cita de: "davidgf"Yo diría que es problema del tecaldo  (del controlador)
Eso es lo que yo pienso también. Hace unos años leí un artículo en el que precisamente se mencionaba eso y además creo que la combinación de teclas conflictiva era precisamente los cursores "arriba" e "izquierda".

Desgraciadamente no recuerdo cuál era el artículo.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Puyover

Mirad lo que he encontrado: http://www.sjbaker.org/steve/omniv/keyboards_are_evil.html

Simplemente he cambiado la tecla de disparo a la tecla 'S' y ya funciona perfectamente!

Gracias a todos y saludos!
Vivimos en la era de la televisión. Una sola toma de una enfermera bonita ayudando a un viejo a salir de una sala dice más que todas las estadísticas sanitarias. -Margaret Thatcher

Tei

A parte de lo que dice este articulo. Que no se si aun se siguen construyendo asi los teclados. Hay una diferencia importante entre coger el siguiente caracter de entrada estandar, y leer que tecla hay pulsada a bajo nivel. Para un juego arcade nos interesa lo segundo.
Cuando probe un PC por primera vez, lo primero que me sorprendio de la arquitectura PC es lo tremendamente mala que es el tema este del teclado, el buffer del teclado y demas.  En un commodore 64 estas cosas funcionaban mucho mejor.

Mr. Sandman


davidgf

jejee bingo!

Yo leí hace tiempo que algunos fabricantes para ahorrar en piezas limitaban el buffer del teclado o ponían controladores baratos. Ahora tengo curiosidad por saber si en mi jueguecito todavía está el error ese.. jjejeje

EDITO: Si ya se donde. En la ayuda o el readme del "Freats on Fire" (el dichoso juego de la guitarrita/teclado) hablava de como cambiar las teclas predeterminadas por que segun decia algunas combinaciones no salian bien (y comentava eso k e dixo antes)

Saludos!
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.