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!
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
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.
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...
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...
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.
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!
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.
Ésos malditos teclados :twisted:
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!