Hola makeros!
A ver si me podéis echar una mano con este problemilla...
Mi juego es un shooter lateral para móvil. El problema que tengo sucede al intentar agacharme y disparar a la vez, es decir, pulsando simultáneamente 2 veces la pantalla.
El personaje dispara pulsando la pantalla, y deja de disparar al dejar de pulsarla. Además, se agacha pulsando las flechas de movimiento. No tengo problema con el multitouch, pero sí tengo problema a la hora de que el juego me detecte que he dejado de pulsar la pantalla para disparar, pero sigo pulsandola para mantenerme agachado.
El código que tengo en el step event para disparar es:
//Con metralleta
for( i=0; i<=1; i++ )
{
if( device_mouse_check_button( i, mb_left ) ) && ( device_mouse_x(i) > 500 ) && ( device_mouse_y(i) > 300 ) && ( device_mouse_y(i) < 1217 )
{
if !instance_exists(obj_fondo_pausa) && global.balas>=1
{
if global.personaje=="merce" or global.personaje=="merce1" or global.personaje=="merce2" or global.personaje=="merce3" or global.personaje=="merce5" or global.personaje=="merce6"or global.personaje=="merce7"
{
if !view_enabled && !instance_exists(obj_cabeza_disp)
{
if (visible=false) && y<obj_suelo.y
{
x=device_mouse_x(i)
y=device_mouse_y(i)
visible=true
global.disparo=1
//Donde mira el player
if x>obj_player.x && !instance_exists(obj_cabeza_disp)
{
obj_player.image_xscale=1
if global.direccion="abajo" or global.direccion="izq-abajo" or global.direccion="abajo-dcha"{instance_create(obj_player.x,obj_player.y+15,obj_cabeza_disp);obj_player.image_speed=0.5}
else{instance_create(obj_player.x,obj_player.y,obj_cabeza_disp);obj_player.image_speed=0.5}
}
else
{
obj_player.image_xscale=-1
if global.direccion="abajo" or global.direccion="izq-abajo" or global.direccion="abajo-dcha"{instance_create(obj_player.x,obj_player.y+15,obj_cabeza_disp);obj_player.image_speed=0.5}
else{instance_create(obj_player.x,obj_player.y,obj_cabeza_disp);obj_player.image_speed=0.5}
}
}
}
}
}
}
}
Código en step event para dejar de disparar:
for( i=0; i<=1; i++ )
{
if( device_mouse_check_button_released( i, mb_left ) )&& ( device_mouse_x(i) > 500 ) &&( device_mouse_y(i) > 300 ) && ( device_mouse_y(i) < 1217 ) && visible=true
{
visible=false
with(obj_cabeza_disp){instance_destroy()}
}
}
Código en step event del boton agacharse:
for( i=0; i<=1; i++ )
{
if( device_mouse_check_button( i, mb_left ) ) && ( device_mouse_x(i) > x1 and device_mouse_x(i) < x2 ) && ( device_mouse_y(i) > y1 and device_mouse_y(i) < y2 )
{
global.direccion="abajo"
image_index=1
}
}
Al correr el juego en PC funciona sin problema, pero en Android es cuando tengo problemas. Entiendo que se debe a que si mantengo la pantalla pulsada con un dedo para estar agachado y con otro para disparar, y solamente levanto el dedo de disparar, el móvil no detecta que he levantado ese dedo. Si fuera este el problema, ¿cómo podría solucionarlo?
PD: he probado a crear virtual key en la pantalla para disparar, pero no para el movimiento, y sigo teniendo el mismo problema. No sé si creando virtual keys para todo lo solucionaría.
Mil gracias!!!!
Acabo de probar metiendo virtual Keys al botón de dirección y al de disparo y nada :'(
Algún alma caritativa que me ayude????
Te ayudaria pero no tengo conocimientos del android pero no se si esto funcionaria de la misma forma...
// Event Create
key_fire = 0
key_firePressed = 0
key_firePrev = 0
key_fireRel = 0
// Event step
key_fire = mouse_check_button(mb_left) // La funcion determinada a efetuar
key_firePressed = (key_fire and !key_firePrev) // devuelve 1 si antes estaba presionado sino el 0
key_fireRel = (!key_fire and key_firePrev) // devuelve 1 si antes lo tenias presionado sino el 0
key_firePrev = key_fire // Es solo para que funcione
Asi trabajan las funciones del pressed & release en gm puedes aplicarla con tu propia key a usar. Espero que te halla ayudado. :-[
Deberías revisar todos los puntos táctiles (de 0 a 4), tal vez el punto que está sobre la flecha tiene indice 3, pero el for solo llega a 1.
Usar "virtual keys" es buena opción, creo que haría el código más fácil de escribir.
Hola! Gracias por las respuestas!!!
Después de bastantes horas y quebraderos de cabeza he descubierto que fallaba...
Lo dejo por aquí por si alguien se topa con ello. En una línea de código perdida en un objeto tenía puesto
if mouse_y>=obj_suelo.y and instance_exists(obj_cabeza_disp){visible=false;with(obj_cabeza_disp){instance_destroy()}}
Es decir, esta condición chequeaba para todos los mouse (todas las pulsaciones) su condición y, y dado que la tecla de movimiento siempre cumplía esta condición, me estaba alternando el código. En resumidas cuentas, si usáis los device_input, NUNCA uséis los mouse_x o mouse_y porque lo comprobará para absolutamente todas las pulsaciones.
Saludos!