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: Cambio continuo automático de una variable entre 2 valores  (Leído 1573 veces)

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

Desconectado Guacusio

Nombre del creador: Guacusio

Versión GM utilizada:  :GMS: (compatible con  :GM6:  :GM7:  :GM8:)

Descripción:
Cambia en forma continua y automática el valor de una variable dada en una instancia dada entre dos valores dados a una velocidad dada

Este script surge de la necesidad de cambiar variables en forma continua sin necesidad de crear código especial para cada una en los objetos que las contienen. Ejemplos del uso de este script son mover una instancia de un punto a otro, rotarla, cambiar su escala, velocidad, etc. cambiando la variable correspondiente en forma continua en vez de discreta. Pueden cambiarse variables de 0, 1 o 2 dimensiones.

El formato de llamada del script es el siguiente:

argument0=nombre de la variable a cambiar(string)
argument1=valor inicial con que partirá la variable
argument2=valor final deseado de la variable
argument3=número de steps deseados para el cambio
argument4=id de la instancia que contiene a la variable

Ejemplos (asumiendo que el script se llama scr_cv):

Mueve la instancia actual 100 pixeles a la derecha y 80 pixeles hacia arriba en 35 steps:
scr_cv("x",x,x+100,35,id);
scr_cv("y",y,y-80,35,id);

Rotar 90º la instancia j en 40 steps:
scr_cv("image_amgle",j.image_angle,j.image_angle+90,40,j);

Mover el view[0] hasta las coordenadas (100,100) en 60 steps:
scr_cv("view_xview[0]",view_xview[0],100,60,id);
scr_cv("view_yview[0]",view_yview[0],100,60,id);

Este script requiere un objeto auxiliar que manipule las variables, llamado o_cv. Se requiere agregar este objeto con los siguientes eventos:

Create:
nvar=0;

End step:
//proceso principal de cambio de variables
//array v[i,j] guarda los datos necesarios para cambiar la variable i-ésima
//v[i,0]=id de la instancia que contiene a la variable
//v[i,1]=nombre de la variable a cambiar (string)
//v[i,2]=valor inicial de la variable
//v[i,3]=valor final de la variable
//v[i,4]=valor actual de la variable
//v[i,5]=incremento aplicado a la variable en cada step

var i,j,a1,a2,n,n1,n2,c,fin,aux;
i=0;
while i<nvar//recorre el array con variables
    {
    fin=false;//indica si la variable ya llegó a su valor final
    if instance_exists(v[i,0])//sólo cambia variables de instancias existentes
        {
        if sign(v[i,3]-(v[i,4]+v[i,5]))!=sign(v[i,5])//detecta si la variable alcanza su valor final ahora
            {
            fin=true;
            v[i,4]=v[i,3];
            }
        else
            v[i,4]+=v[i,5];
        aux=v[i,4];//valor actualizado de la variable
        n=v[i,1];//nombre de la variable
        a1=string_pos("[",v[i,1]);//revisa si es array
        if a1>0
            {
            a2=string_pos("]",v[i,1]);
            n=string_copy(v[i,1],1,a1-1);
            c=string_pos(",",v[i,1]);//revisa si es de 2 dimensiones
            if c>0
                {//variable de 2 dimensiones
                n1=real(string_copy(v[i,1],a1+1,c-a2+1));//subíndice 1 de la variable
                n2=real(string_copy(v[i,1],c+1,a2-c+1));//subíndice 2 de la variable
                }
            else//variable de 1 dimensión
                n1=real(string_copy(v[i,1],a1+1,a2-a1+1));//subíndice de la variable
            }
        with v[i,0]
            {
            switch n//actualiza el valor de la variable
                {//NOTA: modificar según las variables esperadas que se cambiarán
                case "image_angle":
                    image_angle=aux;
                    break;
                case "x":
                    x=aux;
                    break;
                case "y":
                    y=aux;
                    break;
                case "a0":
                    a0=aux;
                    break;
                case "image_xscale":
                    image_xscale=aux;
                    break;
                case "image_yscale":
                    image_yscale=aux;
                    break;
                case "vspeed":
                    vspeed=aux;
                    break;
                case "hspeed":
                    hspeed=aux;
                    break;
                case "view_xview":
                    view_xview[n1]=aux;
                    break;
                case "view_yview":
                    view_yview[n1]=aux;
                    break;
                case "view_angle":
                    view_angle[n1]=aux;
                    break;
                }
            }
        }
    if fin or !instance_exists(v[i,0])
        {//elimina del array de variables las variables que ya no necesitan cambiarse
        for(j=0;j<6;j+=1)
            v[i,j]=v[nvar-1,j];
        nvar-=1;
        i-=1;
        }
    i+=1;
    }

El código del evento end step anterior debe ser editado dentro de la sentencia switch para agregar o quitar las variables que reconoce el script; esto es así porque en GM Studio no existe la antigua función variable_local_set que habría facilitado enormemente la programación permitiendo el reconocimiento de cualquier variable. Por el mismo motivo, no es posible crear dentro del script el objeto o_cv usando object_add, ya que esta función también quedó obsoleta.

Script de llamada a la función:
// cambia el valor de la variable numérica argument0
// desde el valor argument1 hasta el valor argument 2
// en argument3 pasos
// en la instancia argument4

var aux,i,inc;
if !instance_exists(o_cv)
    instance_create(0,0,o_cv);//crea una instancia de o_cv si no existe
with o_cv
    {
    aux=nvar;
    for(i=0;i<nvar;i+=1)
        {
        if v[i,0]=argument4 and v[i,1]=argument0
            aux=i;//esta variable ya estaba cambiando
        }
    v[aux,0]=argument4;
    v[aux,1]=argument0;
    v[aux,2]=argument1;
    v[aux,3]=argument2;
    v[aux,4]=argument1;
    inc=(argument2-argument1)/argument3;//incremento por paso
    if inc<0
        v[aux,5]=min(-0.0001,inc);
    else
        v[aux,5]=max(0.0001,inc);
    if aux=nvar
        nvar+=1;//esta variable es nueva
    }
« última modificación: Junio 23, 2014, 09:45:04 pm por Johann »


 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.