Hola Game makeros! Esta vez tengo un problema que tal vez les de ideas a muchos otros, quiero hacer un juego plataforma o runner que vos puedas disparar cosas dependiendo la cantidad de dedos que hagas el swipe.. es decir si haces swipe para arriba con 2 dedos exploten bombas, si haces swipe para adelante con 3 dedos tire misiles.. pero no encuentro la manera de modificar el gml para hacer cierta funcion depende a cuantos dedos usaste para el swipe..
Creo que sería algo asi pero la verdad ni idea. Me orientan ?

for(a=0;a<5;a+=1){
if(device_mouse_check_button_releassed(a,mb_left))
  {   if a=1{//crear misil}
       if a=2{//crear bomba}
}

Podrías hacer un vector que almacene los nombres de los objetos:

l[0]="Bomba" l[1]="Misil" etc

Y luego al convocar el objeto:

instance_create(a,b,l[a])

Te resultara más sencillo que un montón de "if".

Sisi el tema que lo complicado es que detecte un swipe con 3 dedos, o 2, no con 1, con 1 es facil, xinicial >mouse_x =swipe , pero con varios?

#3 Mayo 15, 2015, 05:39:27 PM Ultima modificación: Mayo 15, 2015, 05:41:55 PM por Clamud
Me pareció interesante la idea de usar múltiples swipes, y por fin tuve tiempo de programar un ejemplo (que está adjunto).

En el proyecto hay dos objetos, en el primero está el código para reaccionar a swipes con un sólo dedo y en el segundo se ha extendido el código para reaccionar a múltiples swipes, no tengo forma de probar el segundo ejemplo, pero estoy casi seguro que funciona.
Para trabajar más fácil con los "switch" primero se crearon 5 constantes (en el Árbol de recursos -> Macros -> All configurations) con estos valores

NINGUNO=0
DERECHA=10
ARRIBA=20
IZQUIERDA=30
ABAJO=40




En el objeto obSwipe1, en el evento Create se inicializan las variables activo y swipe. La variable activo indica si se puede, o no, reaccionar al swipe realizado, esto es necesario para poner un tiempo de espera antes de volver a reaccionar y así evitar que se agreguen muchos objetos seguidos. A la variable swipe se le asigna alguna de las constantes creadas al principio.

En el evento Step se detecta el swipe. Pensé en dos formas para detectar el swipe:

  • la primera es hacer que el punto inicial del swipe es donde se hace click y el punto final es donde se levanta el dedo
  • la segunda forma es determinar la dirección del swipe con el movimiento continuo del puntero, sin necesidad de bajar y levantar el dedo
Creo que la segunda es mejor para un juego rápido y es la que está implementada.

Al detectar un swipe se inicia una alarma, la variable activo se hace false y se crea un efecto que depende del valor de la variable swipe. Cunado la alarma termina de contar se restablece la variable activo.



En el objeto obSwipeMultiple se extiende el código para revisar los cinco puntos táctiles (en vez de usar las funciones "mouse" se usan las funciones "device_mouse") y las variables que guardan las posiciones de los punteros y los tipos de swipe se convierten en arreglos (de 5 elementos).

Aquí cada dispositivo puede realizar un swipe en diferente dirección, por lo que se necesita un modo de determinar una sola dirección dominante, pensé en dos formas para determinar la dirección y la cantidad de dedos usados:

  • la primera es contar cuántos swipes se realizan en cada dirección y el que tenga mayor número es el dominante, sin embargo, si todos los dedos hacen un swipe diferente no hay dominante y se podría ejecutar una acción al azar, además ésta forma es más difícil de implementar comparada con la segunda
  • en la segunda forma se determina una dirección final si todos los dispositivos que realizaron un swipe lo hicieron en la misma dirección aproximada
La segunda forma es la que está en el ejemplo, ahí se asignan las variables swipe_final y contador. La variable contador guarda la cantidad de dedos usados en el swipe y en una parte la variable se limita para contar sólo hasta 3
[gml]if( contador > 3 ) contador = 3;[/gml]
sin embargo se puede eliminar esa línea para detectar hasta cinco dedos.

Usando las constantes creadas al principio, se simplifica mucho el código para ejecutar acciones que dependen del swipe final
[gml]
switch( swipe_final + contador ) //ejecutar una acción
{
    case DERECHA + 1: //swipe a la derecha con un dedo
        effect_create_above( ef_explosion, x+200,y, 2,c_blue );
        break;
    case ARRIBA + 1: //swipe a la izquierda con un dedo
        effect_create_above( ef_firework, x,y-150, 2,c_blue );
        break;
    case IZQUIERDA + 2: //swipe a la izquierda con dos dedos
        effect_create_above( ... );
        break;
    case ABAJO + 3: //swipe hacia abajo con tres dedos
        effect_create_above( ... );
        break;
}
[/gml]
Como mencioné al principio éste, código no lo he probado con multitouch, pero con un dedo funciona bien. No completé las acciones a realizar con múltiples dedos, eso tienes que agregarlo tú.

Espero que se entienda, cualquier duda me dices.

Genial amigo! me encanto que te hayas puesto e intentes hacer algo, mira jaja yo estuve haciendo algo pero es mas "Rústico", tu ejemplo me gusto mas, yo simplemente hice que detecte cada device y cree un objeto al presionar el device, es decir que si presionas con 3 dedos, se crean 3 objetos obj_swipes, al soltar el primer dedo que presionaste cuenta la cantidad de esos objetos y solo queda hacer un if
if instance_number(obj_swipes)=1 {//lo que haga con un dedo}
if instance_number(obj_swipes)=2 {//lo que haga con dos}....etc

funciona bien pero no detecta la direccion de los 4 dedos, solo del 1ero, pero se puede modificar.. ahora probare tu ejemplo y si funciona lo implemento! sabia que le iba a dar ideas a gente con esta idea, jamas lo vi implementado

Bueno bueno! estuve probando y anda casi a la perfección, no se exactamente cuando pero al rato de usarlo hay una alarma que sigue ejecutandose o algo que hace que se ejecute sin tocar nada el ultimo efecto, es decir si hiciste swipe a la izquierda queda ejecutandose el swipe a la izquierda, CREO que es cuando continuas el dedo, digamos, si haces el swipe, y frenas el dedo apoyado y cuando termina el efecto soltas funciona bien, ahora si haces el swipe y seguis apretando y moviendo y soltas en movimiento sigue ejecutandose.. si puedo te subo un video de como funciona

Si, ya se a qué te refieres, ¿lo has probado en windows, no?. El problema es que eso se debe al propio funcionamiento de :GMS:; los eventos del ratón no se actualizan cuando el puntero está fuera de la ventana, entonces cuando sueltas el botón del ratón fuera de la ventana no se detecta el evento "relesased" y se siguen creando los efectos aunque el botón no esté presionado. Para hacer que :GMS: actualice el estado del botón, es necesario poner el cursor dentro de la ventana, hacer click y volver a soltar el botón. Se supone que ese problema no ocurre en un dispositivo móvil porque no se puede poner el puntero fuera de la ventana de juego.

Ya intenté solucionarlo probando con la función mouse_clear, pero no dió resultado. Otra idea es usar las funciones device_mouse_raw o display_mouse_get para saber cuándo el puntero se ha salido del la ventana y entonces dejar de detectar los swipes, pero es una solución parcial, porque tampoco es posible detectar si se ha liberado el botón.

Dentro del proyecto encontré un error, sucede al cambiar de room mientras está presionado el botón del ratón, para solucionarlo sólo hay que inicializar unas variables en el evento Create
[gml]
//para obSwipe1
xa = mouse_x;
ya = mouse_y;
[/gml]
[gml]
//para obSwipeMultiple
for( i=0; i<5; i++ ) //inicializar arreglos
{
    swipe = NINGUNO;
    xa = device_mouse_x(i);
    ya = device_mouse_y(i);
}
[/gml]

También me he dado cuenta de que interpreté tu primer mensaje de una forma, sin embargo, se puede interpretar de otra forma, y entonces el código sería ligeramente diferente; en el código de obSwipeMultiple pensé en crear sólo un tipo de objeto a la vez y por eso usé un algoritmo para determinar el "swipe_final", ahora he pensado que tal vez quieres crear diferentes objetos a la vez dependiendo de la dirección del swipe de cada dedo. ¿Cuál forma te parece mejor?

Nono, así esta perfecto, quiero que 3 o mas dedos hagan un swipe para el mismo lado, y si 3 dedos estan apoyados y 2 dedos hacen swipe para un lado, siga detectando 3, como que la persona hizo mal el swipe con 1 dedo, nono, lo probé en android, en windows no tengo manera de probar el multiple jaja, asi que lo probe directamente en android... pero puede que sea eso porq si clickeo la pantalla deja de hacerlo

Sucede cuando hago un swipe rapido, ya sea en windows o android, si hago un swipe rapido y suelto queda presionado y haciendo ese efecto

#9 Mayo 17, 2015, 10:39:53 AM Ultima modificación: Mayo 17, 2015, 11:43:54 AM por vitito93
Faltaba solamente agregar este codigo que te muestro en la imagen.. preguntar si activo era true antes de decir SI HIZO Swipe para tal lado..

Edito: En el swipe para 1 DEDO si se arregla el bug poniendo "if activo" en el multiple no pude arreglarlo solo con eso, ahora lo estoy mirando.

Edito 2: Pude arreglarlo en el swipe multiple, es decir si hago uno o 2 swipes rapido anda bien... pero si hago TRES swipes RAPIDO hace lo mismo, se bugea y sigue detectando swipes para ese ultimo lado sin tocar la pantalla ..

Edito 3  :'( : Creo que el bug se da cuando haces asi: Presionas, haces swipe para arriba por ejemplo y al momento de soltarlo seguis subiendo con la flechita o dedo en android.. algo asi jaja probalo

Ya encontré el error, y no se debía a lo que comenté antes, sólo faltaba poner una línea:
[gml]
else swipe = NINGUNO; //si no se toca la pantalla, no hay swipe
[/gml]
Dejo el proyecto con las correcciones, hay que hacer otras pruebas, espero que no tenga errores.

#11 Mayo 17, 2015, 07:21:15 PM Ultima modificación: Mayo 17, 2015, 07:35:56 PM por vitito93
Es verdad!! jaja ahi esta funcionando bastante bien, lo único que como te habia dicho en un comentario anterior, sobre mi metodo, con mi metodo al crear el objeto cuando tocas la pantalla hace que casi no haya errores, presta atencion aca, no haya errores en cuanto a detectar los dedos, ya que crea el objeto ni bien detecta el device, y con tu metodo por ahi no lee bien, o hay que ser muy exacto con los dedos, ojo, la idea esta perfecta pero como hago para no hacerlo tan estricto y si presiono un ratito (milisegundos ) mas tarde el dedo, me lo detecte igual? te adjunto mi proyecto para que veas la diferencia, va , lo podes captar bien si tenes algun android jaja si no tenes el modulo te lo exporto a apk, solo pedimelo, mi facebook  es victor belluccini Gmail: victorbelluccini@gmail.com para hablar mas rapido jaja

#12 Mayo 17, 2015, 07:55:44 PM Ultima modificación: Mayo 17, 2015, 08:01:04 PM por vitito93
Agrega este código en el proyecto que te pase, asi podes probarlo sin android, podes simular cada dedo con mouse izquierdo, derecho y con la rueda.. (puedes apretas mas de una vez cada boton excepto el izquierdo) pero quiero que lo pruebes para que veas a lo que me refiero en cuanto a lo seguro que es en cuanto a cada dedo