Mayo 03, 2016, 02:09:10 PM Ultima modificación: Mayo 03, 2016, 02:17:35 PM por matiascarpello
Hola comunidad. Quisiera saber como podría implementar un sistema para lanzar como en el juego de este video. https://www.youtube.com/watch?v=GEESJLjy8Rk
En ese juego, uno desliza el dedo por la pantalla táctil y la pelota va a esa dirección. Incluso puedo deslizar dibujando una curva sobre la pantalla y la pelota tiene esa curvatura.

Aquí dejo una imagen también para que se entienda. En el cuadro izquierdo se hace ese swipe en la pantalla táctil y en el cuadro derecho se lanza la pelota tomando esa dirección.


Creo que pasándolo a GMS sería utilizar las funciones de los eventos del mouse. Al presionar el botón izquierdo del mouse en un punto, se dibuja un trayecto invisible, y al soltar la pelota se crea y sigue la ruta de la dirección.

Básicamente quizás sea más fácil de lo que pienso, pero no tengo idea como implementarlo.

#1 Mayo 04, 2016, 07:18:40 PM Ultima modificación: Mayo 04, 2016, 07:20:49 PM por Clamud
Este sistema es más avanzado de lo que parece. Ya estuve jugando un poco para tratar de entenderlo. En primer lugar, pienso que la trayectoria que sigue la pelota está definida como una curva Bézier cuadrática, porque se curva en un sólo sentido y no forma bucles.

http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/

El punto inicial de la curva siempre es el jugador, y el punto final está localizado atrás de la portería (que tal vez se elige de forma aleatoria). Lo más complicado es calcular el nodo intermedio que define la curva. Tal vez se hace con un algoritmo que se aproxima a los puntos dados de forma estadística.

https://en.wikipedia.org/wiki/Curve_fitting

Me imaginé que era algo complicado pero no tanto  :(

puedes emular eso usando el sistema de fisicas de GM, pero se me ocurre que tienes que medir la fuerza del swipe, tomas un valor del 1 al 2o, segun la distancia del swipe y aplicas esa fuerza a la velocida en Y y_speed y agregas una fuerza constante a la velocidad en X x_speed, el truco debe de estar en que valores les vas a dar para que se haga dicho movimiento
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Cita de: somnus en Mayo 05, 2016, 02:23:36 AM
puedes emular eso usando el sistema de fisicas de GM, pero se me ocurre que tienes que medir la fuerza del swipe, tomas un valor del 1 al 2o, segun la distancia del swipe y aplicas esa fuerza a la velocida en Y y_speed y agregas una fuerza constante a la velocidad en X x_speed, el truco debe de estar en que valores les vas a dar para que se haga dicho movimiento

Gracias por responder. Estuve probando nuevamente el juego que quiero emular y la pelota siempre va a la misma velocidad sin importar la velocidad del swipe. Tambien se me ocurre que cuando uno haga el swife dibuje por asi decirlo un path y que la pelota siga ese path pero no se, no estoy seguro si seria la mejor forma y tampoco que como se podria dibujar haciendo un swipe. Quizas haya otra forma de porder hacerlo.

Intenta lo siguiente:

Crea un sprite "spr_balon", 32x32 y centralo
Crea un objeto "Balon"

En el evento Create
ini_x=0;
ini_y=0;
curv_x=0;
curv_y=0;
fin_x=0;
fin_y=0;

b=0;
r=0;
curva=0;
trayectoria=0;
dibujar=0;
disparar=0;


En el evento Glob Left Pressed
if(trayectoria==1){
    curv_x=mouse_x;
    curv_y=mouse_y;
    modificar_curva=1;
    dibujar=1;
}else{
    speed=0;
    x=mouse_x;
    y=mouse_y;
    ini_x=mouse_x;
    ini_y=mouse_y;
}


En el evento Glob Left Released
if(trayectoria==0){
    fin_x=mouse_x;
    fin_y=mouse_y;
    trayectoria=1;
}

modificar_curva=0;


En el evento End of Path
speed=20;

ini_x=0;
ini_y=0;
curv_x=0;
curv_y=0;
fin_x=0;
fin_y=0;

b=0;
r=0;
curva=0;
trayectoria=0;
dibujar=0;
disparar=0;


En el evento Draw
draw_sprite(spr_balon,-1,x,y);
if(dibujar==1){
    for(i=0;i<100;i++){
        t=i/100;
        px=power((1-t),2)*ini_x+((2*t)*(1-t)*curv_x)+(power(t,2)*fin_x);
        py=power((1-t),2)*ini_y+((2*t)*(1-t)*curv_y)+(power(t,2)*fin_y);
        draw_point(px,py);
    }
    if(trayectoria==1 && modificar_curva==1){
        curv_x=mouse_x;
        curv_y=mouse_y;
        curva=1;
    }
}else{
    if(trayectoria==0 && ini_x>0){
        draw_line(ini_x,ini_y,mouse_x,mouse_y);
    }else{
        draw_line(ini_x,ini_y,fin_x,fin_y);
    }
}


En el evento <Space>
r=path_add();

if(curva==1){
    for(i=0;i<50;i++){
        t=i/50;
        px=power((1-t),2)*ini_x+((2*t)*(1-t)*curv_x)+(power(t,2)*fin_x);
        py=power((1-t),2)*ini_y+((2*t)*(1-t)*curv_y)+(power(t,2)*fin_y);
        path_add_point(r,px,py,25);   
    }
}else{
    path_add_point(r,ini_x,ini_y,25);
    path_add_point(r,fin_x,fin_y,25);
}

path_set_closed(r,0);
path_start(r,60,0,1);



Agregalo a un Room, y corre el juego, da click y arrastra para crear una linea, luego puedes dar click de nuevo a los lados de la linea para crear la curva y con Space lanzas el balon.

Es solo un ejemplo, lo puedes mejorar y adaptar a lo que necesitas.

Espero te sirva.

Hasta Luego...

Lo probé y esta muy bueno, solo que no se si es lo ideal para lo que busco porque mi juego será para celulares. Pero repito, agradezco mucho y lo tendré como último recurso si no logro implementar la forma anterior.

Cita de: Javier en Mayo 05, 2016, 08:30:10 AM
Intenta lo siguiente:

Crea un sprite "spr_balon", 32x32 y centralo
Crea un objeto "Balon"

En el evento Create
ini_x=0;
ini_y=0;
curv_x=0;
curv_y=0;
fin_x=0;
fin_y=0;

b=0;
r=0;
curva=0;
trayectoria=0;
dibujar=0;
disparar=0;


En el evento Glob Left Pressed
if(trayectoria==1){
    curv_x=mouse_x;
    curv_y=mouse_y;
    modificar_curva=1;
    dibujar=1;
}else{
    speed=0;
    x=mouse_x;
    y=mouse_y;
    ini_x=mouse_x;
    ini_y=mouse_y;
}


En el evento Glob Left Released
if(trayectoria==0){
    fin_x=mouse_x;
    fin_y=mouse_y;
    trayectoria=1;
}

modificar_curva=0;


En el evento End of Path
speed=20;

ini_x=0;
ini_y=0;
curv_x=0;
curv_y=0;
fin_x=0;
fin_y=0;

b=0;
r=0;
curva=0;
trayectoria=0;
dibujar=0;
disparar=0;


En el evento Draw
draw_sprite(spr_balon,-1,x,y);
if(dibujar==1){
    for(i=0;i<100;i++){
        t=i/100;
        px=power((1-t),2)*ini_x+((2*t)*(1-t)*curv_x)+(power(t,2)*fin_x);
        py=power((1-t),2)*ini_y+((2*t)*(1-t)*curv_y)+(power(t,2)*fin_y);
        draw_point(px,py);
    }
    if(trayectoria==1 && modificar_curva==1){
        curv_x=mouse_x;
        curv_y=mouse_y;
        curva=1;
    }
}else{
    if(trayectoria==0 && ini_x>0){
        draw_line(ini_x,ini_y,mouse_x,mouse_y);
    }else{
        draw_line(ini_x,ini_y,fin_x,fin_y);
    }
}


En el evento <Space>
r=path_add();

if(curva==1){
    for(i=0;i<50;i++){
        t=i/50;
        px=power((1-t),2)*ini_x+((2*t)*(1-t)*curv_x)+(power(t,2)*fin_x);
        py=power((1-t),2)*ini_y+((2*t)*(1-t)*curv_y)+(power(t,2)*fin_y);
        path_add_point(r,px,py,25);   
    }
}else{
    path_add_point(r,ini_x,ini_y,25);
    path_add_point(r,fin_x,fin_y,25);
}

path_set_closed(r,0);
path_start(r,60,0,1);



Agregalo a un Room, y corre el juego, da click y arrastra para crear una linea, luego puedes dar click de nuevo a los lados de la linea para crear la curva y con Space lanzas el balon.

Es solo un ejemplo, lo puedes mejorar y adaptar a lo que necesitas.

Espero te sirva.

Hasta Luego...

Bueno, te he hecho un ejemplo de como hacerlo, y he usado un codigo muy pero muy simple y que funciona, claro que tenes que agregarle muchas cosas, pero al menos asi ya podes solucionar y continuar el proyecto.
Lo dejo adjunto.
Atentamente.-
Elvis Kelley
Mi Manual.
Mi canal de Youtube Youtube click aqui
Video tutoriales Game maker

El ejemplo de Elvis usa un método más intuitivo, pero usar distance_to_object y máscaras de colisión precisas le restan algo de eficiencia.

El ejemplo de Javier es una buena implementación de las curvas Bézier cuadráticas, con un poco de trabajo se puede ajustar para definir la curva con un solo swipe.

Sigo pensando que ese es el método que se usa en el juego; otras de las razones que apoya esta teoría es que aunque se dibuje una curva suave con el dedo el balón no siempre sigue esa trayectoria, más bien sigue una trayectoria un poco menos curvada.

Estas son otras cosas que he descubierto:


  • El swipe sólo se detecta cuando se realiza en un ángulo de 0 a 180 grados.
  • No es necesario que se inicie en la posición del jugador, los puntos de la curva se trasladan para que el disparo siempre inicie en la posición del jugador.
  • El dedo se debe arrastrar una distancia mínima para realzar el disparo.
  • Al parecer el nodo intermedio es el punto más alejado del inicio y el final dentro del swipe.

Cita de: elviskelley en Mayo 06, 2016, 02:30:47 AM
Bueno, te he hecho un ejemplo de como hacerlo, y he usado un codigo muy pero muy simple y que funciona, claro que tenes que agregarle muchas cosas, pero al menos asi ya podes solucionar y continuar el proyecto.
Lo dejo adjunto.

Muchísimas gracias. Excelente ejemplo y ayuda para poder comenzar. Es casi lo que estaba buscando. Faltan pulir un par de cosillas pero teniendo ese tremendo ejemplo como base ya puedo arrancar. Espero no tener que molestar más.  ;D