Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: [ Resuelto ] Animar tentáculo  (Leído 630 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DarkKRuleR

en: Diciembre 30, 2015, 02:59:58 am
Buenas! Tengo este tentáculo:


Número de conexiones N. Cada conexión tiene un ángulo en valor absoluto, que no depende de las conexiones anteriores. Cambiar el ángulo de una NO afecta a las siguientes, como podéis ver en la imagen. Está planteado en 2D sobre un papel, así que cada conexión tiene sólo 1 ángulo.

Cómo puedo hacer una animación de tentáculo? Que parezca que realmente se está moviendo como tal de una forma interesante. Qué algoritmo hacer para dar valores a cada ángulo en cada step y hacer una animación. El sistema ya lo tengo montado, sólo necesito calcular el valor de los N ángulos en cada instante.

Ah, y si se puede, como limitación quiero que el tentáculo siempre mire hacia arriba. A la hora de crearlo y dar valor inicial tengo esto:

Código: [Seleccionar]
for ( i = 0; i < vrLong; ++i ) {
    if ( vrAngA < 70 ) vrAngA += round( random_range( 20, 40 ) );
    else if ( vrAngA > 160 ) vrAngA += round( random_range( -20, -40 ) );
    else {
        if ( scProb( 50 ) ) vrAngA += round( random_range( 20, 40 ) );
        else vrAngA += round( random_range( -20, -40 ) );
    }
    vrTentaculoAng[i] = vrAngA;
}

Inicia en 0, y para cada ángulo, en orden desde la base, sumo a vrAngA, esa variable la uso en cada step para dar valor a los ángulos de forma acumulativa, y TIENDE HACIA 90. Como resultado el tentáculo acaba con valores aleatorios, pero tendiendo a mirar hacia arriba. Quiero que la animación también tienda hacia arriba (90), o sea, que no vaya el tentáculo y se ponga boca abajo mientras hace sus cosas de tentáculo.

Alguna pista, idea o código?
« última modificación: Diciembre 31, 2015, 03:49:28 pm por DarkKRuleR »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Guacusio

Respuesta #1 en: Diciembre 30, 2015, 05:05:06 am
Debería ser algo bastante sencillo de implementar, aunque la animación es algo más complicada. Puedes intentar usar el motor spine incorporado en GMS y usar una Skeletal Animation, o puedes hacerlo manualmente. Para lo último, tienes que considerar lo siguiente:

-Cómo vas a mantener cada segmento unido al anterior
-Cómo vas a cambiar los ángulos en forma continua y no discreta para lograr una animación suave

Simplificando el problema a un tentáculo compuesto de segmentos iguales, mediante trigonometría puedes obtener las coordenadas de un segmento en función de las coordenadas del segmento anterior y su ángulo:



donde d es la distancia que separa al origen de un segmento del origen del siguiente. Llevando esto a código, por ejemplo podrías crear 2 objetos, uno para el primer segmento (o_monstruo) y otro para los demás (o_tent); guarda en una lista las id de cada segmento y en end step calculas las coordenadas de cada uno.

objeto o_monstruo:
create:
Código: [Seleccionar]
var i;
ntent=6;//número de segmentos
segmento=ds_list_create();
segmento[| 0]=id;
for(i=1;i<ntent;i++)
    {
    segmento[| i]=instance_create(0,0,o_tent);
    segmento[| i].padre=segmento[| i-1];
    }
o_tent.d=84;//depende del sprite y la ubicación de su origen

end step:
Código: [Seleccionar]
var i,a,c,s;
for (i=1;i<ntent;i++)
    {
    with segmento[| i]
        {
        a=degtorad(padre.image_angle);
        c=cos(a);
        s=sin(a);
        x=padre.x+d*c;
        y=padre.y-d*s;
        }
    }

el objeto o_tent no necesita eventos, pero ambos objetos deben tener asignado el sprite del segmento.

Para mover el tentáculo, basta con asignarle valores a image_angle de cada segmento. Por ejemplo, puedes usar este script:

http://www.comunidadgm.org/desarrollo-de-scripts/cambio-continuo-automatico-de-una-variable-entre-2-valores/

y llamarlo así (suponiendo que le llamas scr_cv):

scr_cv("image_angle",a1,a2,n,t);

donde:

a1=ángulo inicial del segmento
a2=ángulo final del segmento
n=número de steps que dura la animación
t=id del segmento a animar

Puedes usar una timeline para ir cambiando los ángulos y crear animaciones complejas. Te dejo un editable con lo que te expuse.


 


Desconectado DarkKRuleR

Respuesta #2 en: Diciembre 30, 2015, 03:38:52 pm
Bien, hice varias pruebas y entendí cómo funcionaba todo. Gracias por contestar :D

Por lo que veo, en tu tentáculo usas el modelo acumulativo, en que cada ángulo es igual a la suma de los anteriores más un valor extra. Este es el que se usa en robótica y similares, si yo dejo mi codo en un ángulo estático y muevo mi hombro, lo normal es que el movimiento del hombro también mueva el codo, y modifique su ángulo relativo respecto a la escena. Entonces, en cada instante le das un cambio gradual a cada ángulo y, al estar todos conectados, se mueve de forma "tentaculera".

En mi caso lo hago todo dentro de 1 mismo objeto, y en el evento draw recorro cada ángulo y dibujo tal cual pusiste en la imagen :) El tema es... vale, no se me había ocurrido, respecto a lo que tengo yo (nada) es un muy buen paso, y por ahora está muy bien, aunque no veo del todo el comportamiento "tentacular"



Creo que la base que tú tienes es perfecta, y que lo que habría que hacer es no dejarlo todo en manos de lo random, sino nosotros definir la animación "step por step". Por ejemplo, "muévete gradual de 0 a 90 en... 30 steps", luego gradualmente baja hasta -90 etc

Voy a adaptarlo a tu sistema de ángulos acumulativos y probar esto, edito si tengo éxito, porque no tengo claro que esté en lo correcto :)
« última modificación: Diciembre 30, 2015, 03:40:53 pm por DarkKRuleR »

 


Desconectado Guacusio

Respuesta #3 en: Diciembre 31, 2015, 03:34:01 am
Nooo! los ángulos no son acumulativos!  XD Tenía un modelo que usa ángulos acumulativos pero se los saqué porque dijiste que no querías que el ángulo dependiera de las conexiones previas. El ángulo del segmento anterior sólo lo necesito para calcular las coordenadas del segmento siguiente, pero no lo acarreo. Si usara ángulos acumulativos, el código del evento end step sería como esto:

Código: [Seleccionar]
var i,a,c,s;
for (i=1;i<ntent;i++)
    {
    with segmento[| i]
        {
        a=degtorad(padre.image_angle);
        c=cos(a);
        s=sin(a);
        x=padre.x+d*c;
        y=padre.y-d*s;
        image_angle=padre.image_angle+a0;
        }
    }

donde a0 representa el ángulo de un segmento relativo al anterior. Y sí, me parece mejor considerar ángulos acumulativos porque facilita la creación de animaciones más realistas.

Citar
lo que habría que hacer es no dejarlo todo en manos de lo random, sino nosotros definir la animación "step por step". Por ejemplo, "muévete gradual de 0 a 90 en... 30 steps", luego gradualmente baja hasta -90 etc

Exactamente. El problema es que no es sencillo definir los ángulos sólo tanteando; requiere paciencia y ensayo y error hasta conseguir la animación como la quieres. Yo una vez necesité hacer esto para un juego de lucha y preparé una interfaz gráfica para crear animaciones de esta manera y me ahorró muchísimo trabajo: creaba el código que simplemente tenía que copiar y pegar en las timeline (si te interesa puedo pasártelo). Lo bueno es que este sistema tiene un uso generalizado para cualquier tipo de animación. Podrías crear no sólo tentáculos sino figuras humanas moviéndose o lo que se te ocurra, con toda una jerarquía de segmentos.


 


Desconectado DarkKRuleR

Respuesta #4 en: Diciembre 31, 2015, 03:49:16 pm
Pues toca tirar del ensayo y error para conseguir la animación que quiero, estoy acostumbrado xD Pues qué raro, pensé que era acumulativo... aún así ya lo hice en modo acumulativo,  y como facilita las animaciones en este caso pues mejor ^_^

Hm, entiendo lo de la interfície, más o menos me hice una para mis PJS aunque no la uso por ahora xD Entonces intentaré hacerlo a mano, que suele irme mejor (me manejo bien con los ángulos) y si veo que tengo problemas intentaré hacer una interfície gráfica, sería sencilla para un tentáculo 2D :) Marco el tema como resuelto, gracias :O