Noticias

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

* Sponsor

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!.

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - dixon

Páginas: 1 2 3 4
1
Desarrollo de Scripts / ini_file(str)
« en: Octubre 06, 2021, 08:49:03 pm »
Autor del script: Reyes Dávila
Nombre del script: ini_file(str)
Breve descripción de su función: Habilita a game maker 4.3 para trabajar con archivos ini de igual manera como en las versiones superiores.
Versiones usadas: Solo para game maker 4.3.
Version del script: 1

Código del script

Código: [Seleccionar]
///ini_file(str);
//Script para game maker 4.3, para abrir archivos ini.
//Serial del script: 123

str_in_123=argument0;
str_length_123=string_length(str_in_123);

//Escaneando string
funcion_encontrada_123=0;

str_pos_123=string_pos("(",str_in_123);//Posicion del primer paréntesis
for(i=str_pos_123;i<=str_length_123;i+=1)
{
str_copy_123=string_copy(str_in_123,i,1);
if(str_copy_123="(")
{
//Copiando nombre de funcion
funcion_str_123="";
continuar_123=1;
str_copy_123="";
for(i2=i-1;i2>=1 and continuar_123;i2-=1)
{
str_copy_2_123=string_copy(str_in_123,i2,1);
if(ord(str_copy_2_123)<=65 || ord(str_copy_2_123)>=122)
{
//Deteniendo el proceso.
continuar_123=0
}
else
{
//Copiando caracter.
funcion_str_123=string(str_copy_2_123)+string(funcion_str_123);
}
}

//Funcion encontrada
funciones_posibles='ini_close(,ini_key_delete(,ini_key_exists(,ini_open(,
ini_open_from_string(,ini_read_real(,ini_read_string(,ini_section_delete(,ini_section_exists(,ini_write_real(,ini_write_string(,';
str_count_123=string_count(funcion_str_123+string("("),funciones_posibles);
if(str_count_123=1)
{
funcion_encontrada_123+=1;
funcion_123[funcion_encontrada_123,0]=funcion_str_123;

//Verificando que la primera funcion sea ini_open(str);
c1_123=(funcion_123[1,0]="ini_open");
c2_123=(funcion_123[1,0]="ini_open_from_string");
//if(!c1_123 and !c2_123){show_message("Falta funcion: ini_open(name) o ini_open_from_string(string)")}
}

/////////////////Copiando argumentos de la funcion
index_123=i;
//length_123=string_length(str_in_123)-index_123+1;
length_123=string_length(str_in_123);

continuar_123=1;
count_comillas_123=0;
count_comillas2_123=0;
pos_parentesis_cierre=1;

//Encontrando el parentesis correcto de cierre de la función.
for(i2=index_123;i2<length_123 and continuar_123;i2+=1)
{
//Esto se hace para no tomar en cuenta los parentesis
//Que se encuentren dentro de comillas.
index_123=i2;count_123=1;
str_ram2_123=string_copy(str_in_123,index_123,count_123);
if(str_ram2_123="'"){count_comillas_123+=1}
if(str_ram2_123='"'){count_comillas2_123+=1}
c1_123=(frac(count_comillas_123/2)=0);
c2_123=(frac(count_comillas2_123/2)=0);
c3_123=(str_ram2_123=")");
if(c1_123 and c2_123 and c3_123)
{
pos_parentesis_cierre=i2;
continuar_123=0;
}
}

index_123=i+1;
count_123=pos_parentesis_cierre-index_123;
str_ram_123=string_copy(str_in_123,index_123,count_123);

//Describiendo a los argumentos
count_123=string_count(",",str_ram_123);
count2_123=string_count(".",str_ram_123);
length_123=string_length(str_ram_123);
str_inicial_123=string_copy(str_ram_123,1,1);
str_final_123=string_copy(str_ram_123,length_123,1);

//Condiciones para las funciones
if(funcion_123[funcion_encontrada_123,0]="ini_close"){argumentos_123=0;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_key_delete"){argumentos_123=2;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_key_exists"){argumentos_123=2;devolucion_123="binario"}
if(funcion_123[funcion_encontrada_123,0]="ini_open"){argumentos_123=1;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_open_from_string"){argumentos_123=1;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_read_real"){argumentos_123=3;devolucion_123="real"}
if(funcion_123[funcion_encontrada_123,0]="ini_read_string"){argumentos_123=3;devolucion_123="string"}
if(funcion_123[funcion_encontrada_123,0]="ini_section_delete"){argumentos_123=1;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_section_exists"){argumentos_123=1;devolucion_123="binario"}
if(funcion_123[funcion_encontrada_123,0]="ini_write_real"){argumentos_123=3;devolucion_123="none"}
if(funcion_123[funcion_encontrada_123,0]="ini_write_string"){argumentos_123=3;devolucion_123="none"}


//Asignando cantidad de argumento a funciones.

funcion_123[funcion_encontrada_123,1]=argumentos_123;
//Asignando tipo de respuesta, salida o return.
funcion_123[funcion_encontrada_123,2]=devolucion_123;

//Para las funciones con un argumento
if(argumentos_123=1)
{
//Asignando argumento a la posicion correcta
funcion_123[funcion_encontrada_123,3]=str_ram_123;
}

//Para las funciones con más de un argumento.
analizando_argumento_123=3;
if(argumentos_123>1)
{
for(i3=1;i3<=argumentos_123;i3+=1)
{
//Extrayendo argumentos.
continuar_123=1;
count_comillas_123=0;
count_comillas2_123=0;
length_123=string_length(str_ram_123);

if(i3<argumentos_123)
{
for(i2=1;i2<=length_123 and continuar_123;i2+=1)
{
index_123=i2;count_123=1;
str_ram2_123=string_copy(str_ram_123,index_123,count_123);
if(str_ram2_123="'"){count_comillas_123+=1}
if(str_ram2_123='"'){count_comillas2_123+=1}
c1_123=(frac(count_comillas_123/2)=0);
c2_123=(frac(count_comillas2_123/2)=0);
c3_123=(str_ram2_123=",");

if(c1_123 and c2_123 and c3_123)
{
continuar_123=0;
index_123=1;count_123=i2-1;
funcion_123[funcion_encontrada_123,analizando_argumento_123]=string_copy(str_ram_123,index_123,count_123);

index_123=count_123+2;count_123=string_length(str_ram_123)-index_123+1;
str_ram_123=string_copy(str_ram_123,index_123,count_123);
analizando_argumento_123+=1;
}
}

}//if(i3<argumentos_123)
else
{
//Asignando argumento y borrando comillas
funcion_123[funcion_encontrada_123,analizando_argumento_123]=str_ram_123;
}
}
}

////////////////////////////////Buscando variable de salida.
if(funcion_123[funcion_encontrada_123,2]!="none")
{
posicion_variable_123=funcion_123[funcion_encontrada_123,1]+3;
funcion_123[funcion_encontrada_123,1]+=1;
iniciar_copia_123=0;
igualdad_encontrada_123=0;

//Asignando variable de salida.
str_capture_123="";
continuar_123=1;
for(i2=i;i2>1 and continuar_123;i2-=1)
{
str_ram2_123=string_copy(str_in_123,i2,1);

//Iniciar copia
c1=(str_ram2_123=chr(ord("=")));
c2=(str_ram2_123!=chr(ord("=")));//Para iniciar copia;
c3=(ord(str_ram2_123)=59 || ord(str_ram2_123)=41 || ord(str_ram2_123)=13 || ord(str_ram2_123)=10);//Finalizar copia;

if(c1){igualdad_encontrada_123=1}
if(igualdad_encontrada_123 and c2){iniciar_copia_123=1}

//Finalizando copia
if(c3)
{
//Finalizando copia
continuar_123=0;
iniciar_copia_123=0;
igualdad_encontrada_123=0;
}

if(iniciar_copia_123)
{
//Copiando
str_capture_123=string(str_ram2_123)+string(str_capture_123);
}
}


///Integrando al array el nombre de la variable de salida
funcion_123[funcion_encontrada_123,posicion_variable_123]=str_capture_123;
}


//////////////////////////FIN Buscando variable de salida.

//Posicionando al final de la funcion, despues del parentesis
index_123=i+string_length(str_ram_123)+2;
count_123=string_length(str_in_123)-index_123+1;
str_in_123=string_copy(str_in_123,index_123,count_123);
str_length_123=string_length(str_in_123);
i=1;

}//Fin if(str_copy_123="(")
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
////////////////Analizando archivo ini

//Analizando funcion por funcion
archivo_ini_123="";

for(i=1;i<=funcion_encontrada_123;i=i+1)
{
//Funciones para leer archivo ini
if(funcion_123[i,0]="ini_open" || funcion_123[i,0]="ini_open_from_string")
{
///Leyendo archivo ini desde file
if(funcion_123[i,0]="ini_open")
{
//Verificando argumento
c1=string_count("'",funcion_123[i,3]);
c2=string_count('"',funcion_123[i,3]);

if(c1 || c2)
{
//Para abrir archivo desde string con comillas
abrir_archivo_123=string_replace_all(funcion_123[i,3],"'","");
abrir_archivo_123=string_replace_all(abrir_archivo_123,'"',"");
file_open_read(abrir_archivo_123);
ubicacion_archivo_ini_123=abrir_archivo_123;
}
else
{
//Para abrir archivo desde variable
str_xx_123="file_open_read([x])";
str_xx_123=string_replace(str_xx_123,"[x]",funcion_123[i,3]);
execute_string(str_xx_123);

str_xx_123="ubicacion_archivo_ini_123=[x]";
str_xx_123=string_replace(str_xx_123,"[x]",funcion_123[i,3]);
execute_string(str_xx_123);
}

while(!file_eof())
{
archivo_ini_123=archivo_ini_123+file_read_string()+chr(13)+chr(10);
file_readln();
}
file_close();
}

//Leyendo string ini
if(funcion_123[i,0]="ini_open_from_string")
{
archivo_ini_123=funcion_123[i,3];
ubicacion_archivo_ini_123="string";
}

//Corrigiendo final de string ini
index=string_length(archivo_ini_123);
count=1;
x1=string_copy(archivo_ini_123,index,count);
while(x1=chr(13) || x1=chr(10))
{
str=archivo_ini_123;
index=1;
count=string_length(archivo_ini_123)-1;
archivo_ini_123=string_copy(str,index,count);
index=string_length(archivo_ini_123);
count=1;
x1=string_copy(str,index,count);
}
archivo_ini_123+=chr(13)+chr(10);

/////////////////////////////////////////////////////////////
//Archivo ini para ini_key_delelete, ini_section_delete,
//ini_real_write, ini_string_write.
//archivo_ini_real_123.
//Separando linea por linea
archivo_ini_real_123=archivo_ini_123;
count_lineas_123=string_count(chr(13)+chr(10),archivo_ini_real_123);
for(i4=0;i4<count_lineas_123;i4=i4+1)
{
pos_x_123=string_pos(chr(13)+chr(10),archivo_ini_real_123);
index=1;
count=pos_x_123-1;
linea_ini[i4]=string_copy(archivo_ini_real_123,index,count);
index=count+3;
count=string_length(archivo_ini_real_123)-index+1;
archivo_ini_real_123=string_copy(archivo_ini_real_123,index,count);

//Quitando espacios en blanco del inicio
str=linea_ini[i4];//Entrada
index=1;count=1;
str_ram_x=string_copy(str,index,count);
while(str_ram_x=chr(10) || str_ram_x=chr(13) || str_ram_x=chr(32))
{
index=2;
count=string_length(str)-1;
str=string_copy(str,index,count);
index=1;count=1;
str_ram_x=string_copy(str,index,count);
}
linea_ini[i4]=str;//Salida
}
lineas_ini_123=i4;
///////////////////////////////////////////////////////////

//Corrigiendo saltos de linea
str=archivo_ini_123;
substr=chr(13)+chr(10)+chr(13)+chr(10);
while(string_count(substr,str))
{
newstr=chr(13)+chr(10);
archivo_ini_123=string_replace_all(str,substr,newstr);
str=archivo_ini_123;
}

//Analizando archivo ini.
secciones_123=string_count("[",archivo_ini_123);//Cantidad de secciones
i2=1;

for(i2=1;i2<=secciones_123;i2=i2+1)
{
//Obteniendo nombre de funcion
pos_123=string_pos("[",archivo_ini_123);//Buscando corchete de apertura.
pos2_123=string_pos("]",archivo_ini_123);//Buscando corchete de cierre.
index=pos_123+1;
count=pos2_123-pos_123-1;
seccion_ini_123[i2,0]=string_copy(archivo_ini_123,index,count);

//Recortando archivo ini
length_123=string_length(archivo_ini_123);
index=pos2_123+1;
count=length_123-index+1;
archivo_ini_123=string_copy(archivo_ini_123,index,count);

//Quitando caracteres del inicio
//Corrigiendo saltos de linea
str=archivo_ini_123;
index=1;count=1;
str_ram_x=string_copy(str,index,count);
while(str_ram_x=chr(10) || str_ram_x=chr(13))
{
index=2;
count=string_length(archivo_ini_123)-1;
archivo_ini_123=string_copy(str,index,count);
index=1;count=1;
str=archivo_ini_123;
str_ram_x=string_copy(str,index,count);
}


//Buscando corchete posterior
pos_123=string_pos("[",archivo_ini_123);//Buscando corchete de apertura.
pos2_123=string_pos("]",archivo_ini_123);//Buscando corchete de cierre.

//si ya no hay mas secciones
secciones_restantes_123=string_count("[",archivo_ini_123);
if(secciones_restantes_123=0)
{
pos_123=string_length(archivo_ini_123)+1;
}

//Buscando cantidad de claves.
index=1;count=pos_123-1;
string_posterior_123=string_copy(archivo_ini_123,index,count);
claves_123=string_count("=",string_posterior_123);
seccion_ini_123[i2,1]=claves_123;

//Extrayendo las claves y valores
for(i3=1;i3<=claves_123;i3=i3+1)
{
index=1;
count=string_pos("=",string_posterior_123)-1;
clave_x_123=string_copy(string_posterior_123,index,count);
index=count+2;
count=length_123-index+1;
string_posterior_123=string_copy(string_posterior_123,index,count);

index=1;
count=string_pos(chr(10),string_posterior_123)-2;
valor_x_123=string_copy(string_posterior_123,index,count);

//Corrigiendo espacios en blanco
//Quitando espacios en blanco
index_x2=1;
count_x2=1;
string_xy_123=string_copy(valor_x_123,index_x2,count_x2);
while(string_xy_123=chr(32))
{
index_x2=2;
count_x2=string_length(valor_x_123)-index_x2+1;
valor_x_123=string_copy(valor_x_123,index_x2,count_x2);
index_x2=1;
count_x2=1;
string_xy_123=string_copy(valor_x_123,index_x2,count_x2);
}

index=count+3;
count=length_123-index+2;
string_posterior_123=string_copy(string_posterior_123,index,count);

//////////////////Limpiando claves

//Quitando espacio inicial
str=clave_x_123;
index=1;count=1;
x1=string_copy(str,index,count);
while(x1=chr(32))
{
index=2;
count=string_length(clave_x_123)-1;
clave_x_123=string_copy(str,index,count);
str=clave_x_123;
index=1;count=1;
x1=string_copy(str,index,count);
}

//Quitando espacio final
str=clave_x_123;
index=string_length(str);count=1;
x1=string_copy(str,index,count);
while(x1=chr(32))
{
index=1;
count=string_length(clave_x_123)-1;
clave_x_123=string_copy(str,index,count);
str=clave_x_123;
index=string_length(str);count=1;
x1=string_copy(str,index,count);
}

//Almacenando clave y valor
seccion_ini_123[i2,i3+1]=clave_x_123;
seccion_ini_123[i2,i3+1+claves_123]=valor_x_123;

}//fin for(i3=1;i3<=claves_123;i3=i3+1)

}//fin for(i2=1;i2<=secciones;i2=i2+1)

}//fin if(funcion_123[i,0]="ini_open".....

///////////Devoliendo valores en variables
///Comparando funciones

//////////////////////////////////Funcion Clave existe
seccion_buscada_123="";
clave_buscada_123="";
seccion_existe_123=0;
clave_existe_123=0;
variable_salida_123="";
str_salida_123="";
continuar_123=1;
numero_seccion_123=0;
numero_clave_123=0;
argumento3_123="";
valor_123="";
argumentos_123=-1;

if(funcion_123[i,0]="ini_key_exists")
{
argumentos_123=2;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
variable_salida_123=funcion_123[i,5];
}

if(funcion_123[i,0]="ini_section_exists")
{
argumentos_123=1;
seccion_buscada_123=funcion_123[i,3];
variable_salida_123=funcion_123[i,4];
}

if(funcion_123[i,0]="ini_read_real")
{
argumentos_123=3;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
argumento3_123=funcion_123[i,5];
variable_salida_123=funcion_123[i,6];
}


if(funcion_123[i,0]="ini_read_string")
{
argumentos_123=3;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
argumento3_123=funcion_123[i,5];
variable_salida_123=funcion_123[i,6];

}

if(funcion_123[i,0]="ini_key_delete")
{
argumentos_123=2;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
}

if(funcion_123[i,0]="ini_section_delete")
{
argumentos_123=1;
seccion_buscada_123=funcion_123[i,3];
}

if(funcion_123[i,0]="ini_write_string")
{
argumentos_123=3;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
argumento3_123=funcion_123[i,5];
}

if(funcion_123[i,0]="ini_write_real")
{
argumentos_123=3;
seccion_buscada_123=funcion_123[i,3];
clave_buscada_123=funcion_123[i,4];
argumento3_123=funcion_123[i,5];
}
///Asignando valores correctos a argumentos
//Cambiando valores entre valores de strings y valores de variables.

//Organizando argumentos
for(i2=1;i2<=argumentos_123;i2=i2+1)
{
//Entrada principal
if(i2=1){str_entrada_123=seccion_buscada_123};
if(i2=2){str_entrada_123=clave_buscada_123};
if(i2=3){str_entrada_123=argumento3_123;};

if(string_length(str_entrada_123))
{
c1=string_count("'",str_entrada_123);
c2=string_count('"',str_entrada_123);
if(c1 || c2)
{
str_entrada_123=string_replace_all(str_entrada_123,"'","");
str_entrada_123=string_replace_all(str_entrada_123,'"',"");
}
else
{
str_ram_x_123="str_entrada_123="+string(str_entrada_123);
execute_string(str_ram_x_123);
}



//Quitando espacios en blanco iniciales.
str=str_entrada_123;//Entrada
index=1;count=1;
str_ram_x=string_copy(str,index,count);
while(str_ram_x=chr(10) || str_ram_x=chr(13) || str_ram_x=chr(32))
{
index=2;
count=string_length(str)-1;
str=string_copy(str,index,count);
index=1;count=1;
str_ram_x=string_copy(str,index,count);
}
str_entrada_123=str;//Salida

//Quitando espacios en blanco finales.
str=str_entrada_123;//Entrada
index=string_length(str);count=1;
str_ram_x=string_copy(str,index,count);
while(str_ram_x=chr(10) || str_ram_x=chr(13) || str_ram_x=chr(32))
{
index=1;
count=string_length(str)-1;
str=string_copy(str,index,count);
index=string_length(str);count=1;
str_ram_x=string_copy(str,index,count);
}
str_entrada_123=str;//Salida


}

//Salida principal
if(i2=1){seccion_buscada_123=str_entrada_123};
if(i2=2){clave_buscada_123=str_entrada_123};
if(i2=3){argumento3_123=str_entrada_123};

}//Fin for(i2=1;i2<=funcion_123[i2,1];i2=i2+1)
//Fin organizando argumentos


//Verificando que existe la seccion
for(i2=1;i2<=secciones_123 and continuar_123;i2=i2+1)
{
if(seccion_ini_123[i2,0]=seccion_buscada_123)
{
seccion_existe_123=1;
numero_seccion_123=i2;
continuar_123=0;
}
}


//Buscando clave
if(seccion_existe_123)
{
claves_123=seccion_ini_123[numero_seccion_123,1];
continuar_123=1;
for(i3=1;i3<=claves_123 and continuar_123;i3=i3+1)
{
if(seccion_ini_123[numero_seccion_123,i3+1]=clave_buscada_123)
{
clave_existe_123=1;
numero_clave_123=i3+1;
continuar_123=0;
}
}
}

//Mostrando respuesta
if(string_length(variable_salida_123))
{
str_salida_123=string(variable_salida_123)+"=";
if(funcion_123[i,0]="ini_key_exists"){str_salida_123+=string(clave_existe_123)}
if(funcion_123[i,0]="ini_section_exists"){str_salida_123+=string(seccion_existe_123)}
if(funcion_123[i,0]="ini_read_real")
{
if(clave_existe_123)
{
agumentos_x_123=seccion_ini_123[numero_seccion_123,1];
valor_123=seccion_ini_123[numero_seccion_123,numero_clave_123+agumentos_x_123];
str_salida_123+="real(string_digits(valor_123))";
}
else
{
str_salida_123+=string(argumento3_123);
}
}

if(funcion_123[i,0]="ini_read_string")
{
if(clave_existe_123)
{
agumentos_x_123=seccion_ini_123[numero_seccion_123,1];
valor_123=seccion_ini_123[numero_seccion_123,numero_clave_123+agumentos_x_123];
str_salida_123+="valor_123";
}
else
{
str_salida_123+="'"+string(argumento3_123)+"'";
}
}

execute_string(str_salida_123);
}





//////////////////////////////////////////////////////////////////////////
//Para las funciones ini_key_delete, ini_section_delete, ini_real_write, ini_string_write

c1=funcion_123[i,0]="ini_section_delete";
c2=funcion_123[i,0]="ini_key_delete";
c3=funcion_123[i,0]="ini_write_real";
c4=funcion_123[i,0]="ini_write_string";

if(c1 || c2 || c3 || c4)
{
seccion_encontrada_123=0;
linea_seccion_123=-1;

buscar_clave_123=1;
if(funcion_123[i,0]="ini_section_delete"){buscar_clave_123=0;}
//clave_buscada_123;
clave_encontrada_123=0;
linea_clave_123=-1;

buscar_linea_vacia_123=0;
if(funcion_123[i,0]="ini_section_delete"){buscar_linea_vacia_123=1;}
linea_vacia_123=-1;

//Buscando las lineas de las claves.
//Analizando archivo ini
//Leer linea por linea
//Buscando seccion
//Buscar posicion de la seccion
seccion_buscada_123="["+string(seccion_buscada_123)+"]";
continuar_x_123=1;
for(i4=0;i4<lineas_ini_123 and continuar_x_123;i4=i4+continuar_x_123)
{
index=1;
count=string_length(seccion_buscada_123);
str_123=string_copy(linea_ini[i4],index,count);
if(str_123=seccion_buscada_123)
{
//Encontrar la linea de la seccion
seccion_encontrada_123=1;
linea_seccion_123=i4;
continuar_x_123=0;
}
}


//Buscar clave si se encuentra la seccion
//Buscar linea de la clave
c1=buscar_clave_123;
c2=seccion_encontrada_123;
if(c1 and c2)
{
str_123="";
continuar_x_123=1
for(i5=linea_seccion_123;i5<lineas_ini_123 and continuar_x_123;i5=i5+1)
{
//clave_buscada_123
index=1;
count=string_length(clave_buscada_123);
str_123=string_copy(linea_ini[i5],index,count);
if(str_123=clave_buscada_123)
{
clave_encontrada_123=1;
linea_clave_123=i5;
continuar_x_123=0;
}
}
//Buscando linea de la clave
}

//Buscando linea vacia para ini_section_delete
c1=buscar_linea_vacia_123;
if(c1)
{
continuar_i5_123=1;
for(i5=linea_seccion_123+1;i5<lineas_ini_123 and continuar_i5_123;i5=i5+continuar_i5_123)
{
c1=(string_length(linea_ini[i5])=0);
c2=(linea_vacia_123=-1);
if(c1 and c2)
{
//Encontrar la linea de la seccion
continuar_i5_123=0;//break
}
}
linea_vacia_123=i5;
}

//Reemplazar linea con clave y valor
//Crear lineas del nuevo archivo ini
if(clave_encontrada_123)
{
if(funcion_123[i,0]="ini_write_string")
{
clave_x_123=clave_buscada_123;
valor_x_123=argumento3_123;
linea_ini[linea_clave_123]=string(clave_x_123)+" = "+string(valor_x_123);
}

if(funcion_123[i,0]="ini_write_real")
{
clave_x_123=clave_buscada_123;
valor_x_123=argumento3_123;
linea_ini[linea_clave_123]=string(clave_x_123)+" = "+string(valor_x_123);
}

if(funcion_123[i,0]="ini_key_delete")
{
lineas_ini_123=lineas_ini_123-1;
for(i6=linea_clave_123;i6<lineas_ini_123;i6=i6+1)
{
linea_ini[i6]=linea_ini[i6+1];
}
}
}

if(seccion_encontrada_123)
{
if(funcion_123[i,0]="ini_section_delete")
{
resta_123=linea_vacia_123-linea_seccion_123+1;
lineas_ini_123=lineas_ini_123-resta_123;
for(i6=linea_seccion_123;i6<lineas_ini_123;i6=i6+1)
{
linea_ini[i6]=linea_ini[i6+resta_123];
}
}
}

//Redactando archivo ini
//Crear un nuevo archivo ini
//Redactar linea por linea

//Creando nuevo archivo ini
archivo_ini_123="";
for(i5=0;i5<lineas_ini_123;i5=i5+1)
{
archivo_ini_123+=linea_ini[i5]+chr(13)+chr(10);
}

if(ubicacion_archivo_ini_123!="string")
{
file_open_write(ubicacion_archivo_ini_123);
for(i6=0;i6<lineas_ini_123;i6=i6+1)
{
file_write_string(linea_ini[i6]);
file_writeln();

}
file_close();
}


}//if(c1 || c2 || c3 || c4)








}//for(i=1;i<=funcion_encontrada_123;i+=1)








return str_in_123;

////Caracteres que intervienen en el proceso:
//Espacio en blanco: chr(32).
//" Comillas dobles, comilla tipográfica: chr(34).
//' Comillas simples: chr(39).

//( Paréntesis de apertura: chr(40).
//) Paréntesis de cierre: chr(41).
//, Coma: chr(44).
//. Punto: chr(46).
// "/" Barra: chr(47).
//0 Numero 0: chr(48).
//9 Número 9: chr(57).


//; Punto y coma: chr(59).

//= Signo de igualdad: chr(61).

//A Letra A mayúscula: chr(65).
//Z Letra Z mayúscula: chr(90).

//_ Línea baja, piso: chr(95).

//a Letra A minúscula: chr(97).
//z Letra Z minúscula: chr(122).

//á Letra A con tilde: chr(225).
//ú Letra U con tilde: chr(250).


//Funciones ini
//ini_close();
//ini_key_delete(section, key);
//ini_key_exists(section, key);
//ini_open(name);
//ini_open_from_string(string);
//ini_read_real(section, key, default);
//ini_read_string(section, key, default);
//ini_section_delete(section);
//ini_section_exists(section);
//ini_write_real(section, key, value);
//ini_write_string(section, key, value);

Detalles:
ini_file(str) en su primera versión es un script exclusivo de game maker 4.3 el cual le permite administrar archivos ini de igual modo que en las versiones superiores. Este script recibe como argumento una cadena que contiene las funciones necesarias para trabajar con este tipo de archivos.

Modo de uso:
1. Crear script: Con el código entregado se creará un script el cual deberá ser llamado ini_file.
2. Usar script: ini_file(str), dentro de str deberás colocar una cadena que contenga las funciones básicas para administración de archivos ini.

Ejemplo:
Código: [Seleccionar]

ini_file('   

ini_open("archivo_ini.ini");
ini_write_real("Usuario_1","clave",2112);
ini_close();

');



Mejoras a futuro:
1. Aumentar compatibilidad: Permitir que este script pueda ser usado en versiones superiores para que se pueda trabajar con ini_open_from_string(str) en todas las versiones.

Metas propuestas:
Tengo el objetivo de crear un editor html5 muy básico de video juegos y para lograrlo necesitaré cumplir las siguientes metas:



Bueno eso es todo, saludos.


2
Desarrollo de Scripts / tabla_array_ini(tabla_string);
« en: Septiembre 11, 2021, 08:47:20 pm »
Autor del script: Reyes Dávila
Nombre del script: tabla_array_ini()
Breve descripción de su función: Recibe como argumento una tabla de Microsoft Word y genera un string con formato de archivo ini.
Versiones usadas: Game maker 4.3, Game maker html5, Game maker studio. Debería funcionar en todas las versiones superiores a Game maker 4.3. Lamentablemente no funciona en game maker studio 2, pero realmente no se requiere su implementacion ya que si lo que queremos es obtener archivos ini lo podemos hacer desde la web html5.
Version del script: 4

Mejoras realizadas:

Versión 4
7/10/2021
*Anidacion de claves: Ahora pueden crearse claves anidadas. Puede ser útil para:
1. Organizar facilmente juegos de preguntas donde las preguntas puedan ser audibles y/o requieran algún material de apoyo como un video de youtube.

2. Organizar dialogos aleatorios: Para crear personajes que hablen libremente y escojan ellos mismos lo que van a decir mediante un random.

Debemos tomar en cuenta que el objetivo del script es organizar fácilmente gran cantidad de información diversa en archivos ini. Si se domina correctamente la estructura de tabla se pueden crear archivos ini bastante organizados lo cual nos permitiría crea fácilmente juegos con estructuras complejas.

Será necesario que les cree uno o varios tutoriales para enseñarles a usar la estructura de tabla, los resultados que he obtenido son muy buenos.

Versión 3
*Corregido error en game maker studio.
*Corregido error al exportar a html5.

Versión 2
*Ahora no se requiere una columna especial. Reconoce tablas de Microsoft Word Correctamente.
*Se pueden crear secciones con nombres distintos. Reconoce diversas tablas dentro de la tabla principal.

Html5
En la siguiente web verán el funcionamiento del script y podrán crear su archivo ini a partir de una tabla de microsoft word.
https://dixonysusjuegoseducativos.000webhostapp.com/_practica_game/tabla_ini/ver_01/index.html

Código del script:

Código: [Seleccionar]
///tabla_ini(str);
//Este script transforma el contenido de una tabla de Microsoft Word en formato ini.
//En str debe colocarse la tabla especial de Microsoft Word.

//Al crear la tabla en Microsoft Word se deberá tomar en cuenta:
//1. No usar tabulaciones dentro de celdas,(Produce error).
//2. No usar caracter numeral # dentro de celdas. Para comentar usar ;.
//3. No usar espacios en blanco para definir secciones, puede usar Línea baja "_".
//4. No iniciar una tabla con un comentario en la primera fila.
//5. No iniciar una tabla con una linea vacia en la primera fila.

//Características del sistema
//1. La primera columna a la izquierda serán las secciones del formato ini.
//2. Las siguientes columnas serán las claves y valores.

tabla=argument0;


//Determinando el tipo de tabla
tabla_tipo=1;
str_ram=string_count(chr(9)+chr(13)+chr(10),tabla);
if(str_ram=0){
tabla_tipo=2;

c1=(string_count(chr(35),tabla)=0);
chr_10=string_count(chr(10),tabla);
chr_9=string_count(chr(9),tabla);
c2=(frac(chr_9/chr_10)=0);

if(c1 and c2)
{
tabla=string_replace_all(tabla,chr(10),chr(9)+chr(13)+chr(10));
}
else
{
tabla_tipo=3;
tabla=string_replace_all(tabla,chr(13)+chr(10),chr(9)+chr(13)+chr(10));
}

}

////////////////Corrigiendo tabla
/////Quitando inicio de tabla
//Para game maker 4 desde script
string_inicio=chr(13)+chr(10);
index=1;count=string_length(string_inicio);
c2=(string_copy(tabla,index,count)=string_inicio);
if(c2)
{
index=count+1;
count=string_length(tabla)-index;
tabla=string_copy(tabla,index,count);
}


///Cadenas separadoras de filas de tabla:
//Game maker 4, desde script: 9,13,10.
//Game maker 4 desde file: "";
//Game maker html5 desde script: 35.
//Game maker html5 desde get_string(): 32.


////////////Determinando finales de linea.
//Solo para game maker studio y html5
if(tabla_tipo=2)
{
length=string_length(tabla);
columnas=0;
count_chr_9=0;
pos_chr_9=1;
for(i=1;i<=length;i+=1)
{
    str_chr=string_copy(tabla,i,1);
    if(str_chr=chr(9))
    {
        count_chr_9+=1;

//Para detectar final de linea con cantidad de columnas
continuar=(columnas=0);
if(columnas){continuar=(frac(count_chr_9/columnas)=0)}

        for(i2=i;i2>pos_chr_9 and continuar;i2-=1)
        {
           str_chr_2=string_copy(tabla,i2,1);
           if(str_chr_2=chr(35) || str_chr_2=chr(32))
           {
if(columnas=0){columnas=count_chr_9};//Cantidad de columnas

chr_index=i2;

//Modificando tabla
index=1;count=chr_index-1;
tabla11=string_copy(tabla,index,count);
index=count+2;count=string_length(tabla)-index+1;
tabla12=string_copy(tabla,index,count);
tabla=tabla11+tabla12;
tabla=string_insert(chr(9)+chr(13)+chr(10),tabla,chr_index);
length=string_length(tabla);

continuar=0;//finalizando ciclo
           }

        }
        pos_chr_9=i;

    }

}
}//fin if(tabla_tipo=2)



//Corrigiendo final de tabla
index=string_length(tabla);count=1;
str_x=string_copy(tabla,index,count);
c1=(str_x=chr(9) || str_x=chr(13) || str_x=chr(10) || str_x=chr(32) || str_x=chr(35));
while(c1)
{
index=1;
count=string_length(tabla)-1;
tabla=string_copy(tabla,index,count);
index=string_length(tabla);count=1;
str_x=string_copy(tabla,index,count);
c1=(str_x=chr(9) || str_x=chr(13) || str_x=chr(10) || str_x=chr(32) || str_x=chr(35));
}
tabla+=chr(9)+chr(13)+chr(10);


//Determinando finales de línea de manera adecuada.
string01=chr(13)+chr(9)+chr(13)+chr(10);
string02=chr(9)+chr(13)+chr(10);
string_correcto=string(chr(9))+string("[fin]");
//if(string_count(string01,tabla))
{
tabla=string_replace_all(tabla,string01,string_correcto);
tabla=string_replace_all(tabla,string02,string_correcto);
}
////////////Fin  corrigiendo tabla



//Cantidad de filas
filas=string_count("[fin]",tabla);//Cantidad de filas.

//Extrayendo filas
for(i=1;i<=filas;i+=1)
{
//Clasificando filas
count=string_pos("[fin]",tabla)-1;
index=1;
fila[i]=string_copy(tabla,index,count);
count+=5;
tabla=string_delete(tabla,index,count);
}

//Identificando cantidad de columnas
columnas=string_count(chr(9),fila[1]);

//Identificando celdas
for(i=1;i<=filas;i+=1)
{
for(i2=1;i2<=columnas;i2+=1)
{
index=1;
count=string_pos(chr(9),fila[i])-1;
celda[i2,i]=string_copy(fila[i],index,count);
index=count+2;
count=string_length(fila[i])-index+1;
fila[i]=string_copy(fila[i],index,count);
}
}


//Identificador de filas
seccion_principal=0;
seccion_concatenada=0;

for(i=1;i<=filas;i+=1)
{
//Verificando si la primera celda de la primera columna está vacia
primera_celda_vacia=0;
if(string_length(celda[1,i])=0){primera_celda_vacia=1}

//Verficando todas las celdas están vacías
todas_celdas_vacias=1;
columnas_ram="";
for(i2=1;i2<=columnas;i2+=1)
{
columnas_ram+=string(celda[i2,i]);
}
if(string_length(columnas_ram)){todas_celdas_vacias=0}

fila_tipo[i]="";
if(fila_tipo[i]="" and celda[1,i]=string(chr(59))){fila_tipo[i]="comentario chr(59)"}
if(fila_tipo[i]="" and celda[1,i]=string(chr(35))){fila_tipo[i]="comentario chr(35)"}
if(fila_tipo[i]="" and !todas_celdas_vacias and seccion_principal=0){fila_tipo[i]="seccion principal";seccion_principal=1}

if(fila_tipo[i]="" and !todas_celdas_vacias and seccion_principal=1){fila_tipo[i]="seccion concatenada";seccion_concatenada+=1;}
if(fila_tipo[i]="seccion concatenada" and primera_celda_vacia and seccion_concatenada>1){fila_tipo[i]="clave anidada"}

if(fila_tipo[i]="" and todas_celdas_vacias){fila_tipo[i]="vacia";seccion_principal=0;seccion_concatenada=0}
}
//FIN Identificador de filas


//Creando ini
salida_ram="";
salida_ini="";
fila_principal=1;
claves_anidadas_123=0;

for(i=1;i<=filas;i+=1)
{
if(fila_tipo[i]="seccion principal"){fila_principal=i;i+=1}

//Enumerando claves anidadas
if(fila_tipo[i]="seccion concatenada"){claves_anidadas_123=0}
if(fila_tipo[i]="clave anidada"){claves_anidadas_123+=1}

//Obteniendo valor de celda.
for(i2=1;i2<=columnas;i2+=1)
{

//Identificando la columna 1 para secciones y comentarios.
if(i2=1)
{
if(fila_tipo[i]="seccion principal"){salida_ram=string(celda[1,fila_principal]);salida_ini+='['+string(salida_ram)+']'}
if(fila_tipo[i]="seccion concatenada"){salida_ram=string(celda[1,fila_principal])+string(celda[1,i]);salida_ini+='['+string(salida_ram)+']';}
//if(fila_tipo[i]="clave anidada")
if(fila_tipo[i]="comentario chr(59)"){salida_ini+=';'}
if(fila_tipo[i]="comentario chr(35)"){salida_ini+='#'}
c1=(fila_tipo[i]="seccion concatenada");
if(c1){salida_ini+='[fin]'};//Salto de línea para secciones concatenadas.
}
else
{

c1=(celda[i2,i]!="");
if(c1)
{
cx1=(fila_tipo[i]="seccion concatenada");
cx2=(fila_tipo[i]="clave anidada");
c2=(cx1 || cx2);
if(c2)
{
//Analizando claves
if(celda[i2,fila_principal]=";")
{
//Cuando la clave es un comentario
salida_ram=string(celda[i2,fila_principal])+string(celda[i2,i]);
}
else
{
//Clave normal
if(fila_tipo[i]="seccion concatenada")
{
salida_ram=string(celda[i2,fila_principal])+' = '+string(celda[i2,i]);
}

//Clave anidada
if(fila_tipo[i]="clave anidada")
{
salida_ram=string(celda[i2,fila_principal])+"."+string(claves_anidadas_123)+' = '+string(celda[i2,i]);
}
}
}

if(!c2){salida_ram=string(celda[i2,i])}
salida_ini+=salida_ram;
if(c2){salida_ini+='[fin]'};//Salto de línea para claves y valores.
}




}

}//fin for(i2=1;i2<=columnas;i2+=1)
//Fin obteniendo valor de celda

//Salto de linea para final de secciones
//Salto de linea para columna final
x1=i+(i<filas);
if(fila_tipo[x1]!="clave anidada")
{
salida_ini+="[fin]";
}


}
salida_ini=string_replace_all(salida_ini,"[fin]",chr(13));
return string(salida_ini);
















Modo de uso:


1. Crear script: Con el código que se les está entregando, deberán crear un script cuyo nombre deberá ser: “tabla_ini”.
Ejemplo de creación de un script con el código entregado.


2. Crear tabla: Abre Microsoft Word y crea una tabla con las dimensiones que necesites.
Ejemplo de tabla normal creada con Microsoft Word.



3. En el evento CREATE de un objeto deberás colocar:
Código: [Seleccionar]
tabla_ini(“”);//No olvidar las comillas dobles.

4. Copia la tabla: Selecciona toda la tabla de Microsoft Word . Para copiar toda la tabla sin problemas podemos: Ubicar el mouse sobre la tabla, presionamos click derecho, luego en seleccionar y finalmente en tabla:


5: Pegar tabla: En el evento créate donde hemos colocado el código ‘tabla_ini(“”);’, debemos pegar la tabla copiada dentro de los paréntesis y entre las comillas dobles.

6. Obtener código ini: El script recibe como argumento el string de la tabla y devuelve un string que contiene el archivo ini.


Detalles sobre la tabla







Mejoras próximas del script
1. Anidación: Permitir la anidación de código para crear estructuras anidadas.
2. Salida tipo Json: Permitir la creación de archivos Json.
3. Json lectura: Permitir la lectura de archivos Json para producir archivos ini, ds_maps y ds_lists, en versiones que no cuenten con estas funciones.

Visión de futuro:
1. Si se logra el manejo adecuado del lenguaje Json, se podrá tomar dicho lenguaje como base para la creación de estructuras de juegos y/o sistemas los cuales podrían ser capaces de ejecutarse o interpretarse en diversas plataformas y lenguajes. Esto a su vez permitiría lograr cosas actualmente imposibles (año 2021) como:
   A. Exportar juegos de versiones antiguas del game maker, a plataformas como android.
   B. Fusión de video juegos: se podría crear un interprete de código que tome como base los archivos json para generar un video juego en base a ellos, para luego crear un sistema que combine dos archivos json el cual genere un tercer archivo con características especificas capaces de ser interpretado.
C. Multi motor: Se pudiesen crear juegos basados en estructuras Json los cuales mediante interpretes especificaos pudiesen ejecutarse en diversos motores de desarrollo (Godot, Unity, Game maker, CryEngine, etc..). Esto quiere decir que se podrían crear juegos que se ejecuten en varios motores.

Bueno, eso es todo por ahora, saludos.


3
Desarrollo de Scripts / draw_button_plus
« en: Septiembre 07, 2021, 08:57:11 am »
Nombre del autor : Reyes Dávila (Dixon CGM).
Breve descripción de su función : Sirve para crear varios botones de manera rápida y sin complicaciones, incluyendo las funciones.
Versión GM utilizada : Game maker 4.3 y Game Maker studio 1.4
Versión del script: 1

Vista previa html5:
Aquí podrán ver en funcionamiento el script.
https://dixonysusjuegoseducativos.000webhostapp.com/_practica_game/botones/ver_01/index.html
Recursos adjuntos:
Aquí podrán descargar el editable para game maker studio.
https://www.mediafire.com/file/65vh2fqnjguz5nf/botones.gmz/file

Código del script
Código: [Seleccionar]
//draw_button_plus
//Colocar en evento Create: draw_button_plus_create=1;
//Colocar en evento Draw: draw_button_plus("ver,5,5,ocultar,7,5");
//Ejemplo de uso: draw_button_plus("Abrir,5,5,Cerrar,7,5");


//Creando variables
if(draw_button_plus_create=1)
{
draw_button_plus_create=0;

//Estableciendo cuadriculas
cuadricula_w=room_width/20;
cuadricula_h=room_height/20;

boton_fuente=string_height("H");
cantidad_comas=string_count(",",argument0);
cantidad_botones=floor((1+cantidad_comas)/3);

string_ram=argument0;
largo_string=string_length(string_ram);
for(i=0;i<cantidad_botones;i+=1)
{
posx=string_pos(",",string_ram);
boton[i,0]=string_copy(string_ram,1,posx-1);
string_ram=string_copy(string_ram,posx+1,largo_string);
largo_string=string_length(string_ram);

posx=string_pos(",",string_ram);
boton_ram=string_copy(string_ram,1,posx-1);
boton[i,1]=real(boton_ram);
string_ram=string_copy(string_ram,posx+1,largo_string);
largo_string=string_length(string_ram);

c1=(string_count(",",string_ram));
if(c1)
{
    posx=string_pos(",",string_ram)
    boton_ram=string_copy(string_ram,1,posx-1);
}
else
{
    boton_ram=string_ram;
}
boton[i,2]=real(boton_ram);
string_ram=string_copy(string_ram,posx+1,largo_string);
largo_string=string_length(string_ram);

ancho_boton=string_width(boton[i,0]);
boton[i,3]=ancho_boton*1.5/cuadricula_w;//Alto del boton por cuadricula.
boton[i,4]=2;
}

//Ajustando medidas del boton a cuadricula
for(i=0;i<cantidad_botones;i+=1)
{
boton[i,1]=boton[i,1]*cuadricula_w;
boton[i,2]=boton[i,2]*cuadricula_h;
boton[i,3]=boton[i,3]*cuadricula_w;
boton[i,4]=boton[i,4]*cuadricula_h;
}

}//Fin if argument0="create";








////////////////////////Dibujando botones...
if(draw_button_plus_create=0)
{
//Dibujando botones
funcion_boton="";
for(i=0;i<cantidad_botones;i+=1)
{
for(i2=0;i2<=4;i2+=1)
{
boton_data[i2]=boton[i,i2];
}
x1=boton_data[1];y1=boton_data[2];
x2=boton_data[1]+boton_data[3];y2=boton_data[2]+boton_data[4];
boton_up=0;
c1=mouse_x>x1;c2=mouse_x<x2;
c3=mouse_y>y1;c4=mouse_y<y2;
c5=mouse_check_button(mb_left);
c6=(funcion_boton="");
if(c1 and c2 and c3 and c4 and c5 and c6)
{
funcion_boton=boton_data[0];
boton_up=1;
}

draw_button(x1,y1,x2,y2,boton_up);//Game maker 4

game_maker_studio=''
draw_set_colour(c_ltgray);//Game maker studio
draw_button(x1,y1,x2,y2,!boton_up);//Game maker studio
draw_set_color(c_black);//Game maker studio
//'

if(c1 and c2 and c3 and c4 and (c5=0))
{
draw_line(x1,y1,x2,y1);
draw_line(x1,y1,x1,y2);
draw_line(x2,y1,x2,y2);
draw_line(x1,y2,x2,y2);
}
boton_data[5]=string_width(boton_data[0]);//Ancho del texto.
x1=boton_data[1]+boton_data[3]/2-boton_data[5]/2;y1=boton_data[2]+boton_data[4]/2-boton_fuente/2;
draw_text(x1,y1,boton_data[0]);
}
}//Fin if argument0=draw




Modo de uso
1. Primero copian el código del script que les he dejado.
 2.Crean un script en game maker y lo llaman "draw_button_plus".


3. Dentro de ese script pegan el código que copiaron peviamente.
4. En el evento CREATE de un objeto deberán colocar:
Código: [Seleccionar]
draw_button_plus_create=1;
5. Luego en el evento DRAW deberán colocar:
Código: [Seleccionar]
//Esto es un ejemplo:
draw_button_plus("Ver,1,10,Ocultar,4,10");
6. Finalmente debajo de ese código deberán colocar las funciones de cada botón muy fácilmente de la siguiente manera:
Código: [Seleccionar]
//Funciones de boton
if(funcion_boton="Ver")
{
direction=0;//Aquí va la función deseada
}

if(funcion_boton="Ocultar")
{
direction=1;//Aquí va la función deseada
}

El evento DRAW quedaría de la siguiente manera:
Código: [Seleccionar]
draw_button_plus("Ver,1,10,Ocultar,4,10");
//Funciones de boton
if(funcion_boton="Ver")
{
direction=0;//Aquí va la función deseada
}

if(funcion_boton="Ocultar")
{
direction=1;//Aquí va la función deseada
}


Segunda explicación:
1. Este script recibe argumentos en forma de string, los cuales deberán ser separados por una coma.
2. El primer espacio antes de la primera coma corresponde al nombre del primer botón a dibujar, el segundo argumeto es la posición x del botón y el tercer argumento es la posición y del botón.

3. Si queremos crear tres botones (Abrir, Cerrar y guardar), podemos hacer lo siguiente:
Código: [Seleccionar]
draw_button_plus("Abrir,0,0,Cerrar,3,0,Guardar,6,0");
4. En cuanto a las posiciones x, y estas se expresan en cuadriculas. El script divide la room en cuadriculas dividiendo el ancho y el alto en 20 partes, por tanto si queremos crear un botón en todo el centro de la pantalla podemos escribir:
Código: [Seleccionar]
draw_button_plus("Ver,10,10")

4
General / Joystick táctiles para juegos html5 en proceso.
« en: Agosto 13, 2021, 04:04:16 am »
Hola, gusto en saludarlos:


Joystick táctiles para juegos html5 en proceso.

1.   Quiero crear un joystick táctil para juegos html5 y no puedo emplear el draw gui porque no funciona en exploradores.

2.   El año pasado cree un sistema engorroso y orrible de escalas para lograr imitar la función draw gui en exploradores y logré crear joytick táctiles para el juego “adiós capitán”. Pero es demasiado complicado y los resultados no son del todo agradables (Mira el juego y dale un like, XD). En el proceso aprendí algunas cosas y este es el punto 3:

3.   Se pueden crear Joytick táctiles para juegos html5 empleando un pequeño sistema de tres views manejado por un script encargado de escalar las views para que dé un resultado parecido a este:




1.   Para lograrlo hay que crear una view principal que se ajuste al tamaño del explorador.

2.   Una seguna view que contenga el juego.

3.   Una tercera view que contenga el joystick táctil.
Parece fácil pero no:

1.   Para que todo quede ajustado deben escalarse proporcionalmente las views 2 y 3, empleando regla de tres, (Estudia regla de tres matemáticas las vas a necesitar).

2.   Debido al problema de escalado que algunos conocemos (problemas con fuentes, imágenes más dibujadas), es necesario trabajar con views superiores a 512x512.

3.   Para ubicar correctamente las views vamos a necesitar un sistema o script parecido al “ajustador de canvas html5” que he creado, pero un poco más complejo, esta véz habrá que manejar muy bien las dos posiciones del dispositivo móvil:

Movil en posición horizontal: Al cambiar de posición el móvil, la posición del joystick táctil cambia.



Para lograr que todo cuadre, es conveniente trabajar ahora con 4 views como se indica abajo:





1.   View azul: La que se ajusta a todo el contorno del explorador.
2.   View Roja: La que mostrará el juego.
3.   View verde: la que contiene la parte izquierda del joystick.
4.   View naranja: la que contiene la parte izquierda del joystick táctil.

¿Y que lograremos con eso?, bueno con eso podemos manejar las views para que cuando el móvil esté en horizontal podamos mostrar algo como esto:




Ahora olviden todo lo aprendido, XD.  Ahora es que vengo a hablarles de lo que realmente quiero hablarles:

Características de este sistema ya explicado:

1.   Solo trabajará correctamente en game maker studio 1, 2 y superiores.
2.   Se requiere emplear las funciones incluidas de multitouch.
3.   No se aplicará correctamente en la versión de game maker llamada “game maker html5”.

En resumen: Quiero crear un sistema de joystick táctiles que funcione en la versión game maker llamada “Game maker html5”.

Razones y motivos principales:
1.   Los juegos creados con game maker html5 son más ligeros que los creados con game maker studio, y cargan más rápido.

Dificultades:
1.   Game maker html5 no incluye función multitouch.
2.   Game maker html5 presenta problemas de coordenadas del mouse en dispositivos móviles.

Objetivos y alternativas:
1.   Crear joystick táctiles para juegos html5 mediante lenguajes para el desarrollo web tales como javascript, Jquery, php, angular, react, etc…

2.   Integrar al juego exportado el joystick táctil creado mediante los lenguajes indicados. (para esto solo necesitamos modificar el index.html del juego)


¿Cómo funcionaría el proyecto?

1.   Se crearían, mediante los lenguajes para el desarrollo web, los botones táctiles los cuales pudiesen ser ajustados mediante reglas css u otras.
2.   Al pulsar los botones algún lenguaje deberá “simular” que se ha presionado una tecla y game maker reconocería esta tecla “en teoria”.

Dificultades:

1.   No encuentro el código que simula la teclas del teclado en exploradores, bueno solo encontré esto:
https://www.it-swarm-es.com/es/javascript/jquery-o-js-puro-simular-la-tecla-enter-presionada-para-probar/969438578/

2.   Jquery está obsoleto y quizás deje de implementarse en exploradores en el futuro.

Estado actual del proyecto:
En proceso....

¿ alguna idea?

Aqui les dejo un ejemplo:

Un ejemplo sin terminar. Giren el dispositivo móvil y verán los cambios.
https://dixonysusjuegoseducativos.000webhostapp.com/_practica_game/Draw_gui_game/index.html

El juego "Adios capitan", trabaja con el sistema engorroso de escalas, giren el dispositivo movil.
https://dixonysusjuegoseducativos.000webhostapp.com/juegos_completos/adios_capitan/index.html

5
Desarrollo de Scripts / ip_admin.php
« en: Julio 29, 2021, 11:17:53 am »
Nombre del autor : Reyes Dávila (Dixon CGM).
Breve descripción de su función : Es un scritp híbrido que funciona en game maker y php, devuelve la ip del usuario y la cantidad de visitas que tiene el juego, con esto se puede saber cuántos usuarios han jugado el juego.
Versión GM utilizada : Game Maker studio 1.4
Versión del script: 2

Vista previa html5:
Aquí podrán ver en funcionamiento el script.
https://dixonysusjuegoseducativos.000webhostapp.com/ip_admin/modelo/Ejemplo_html5/index.html

Recursos adjuntos:
Aquí podrán descargar el editable para game maker studio y el html5.
https://www.mediafire.com/file/zrdsu8e5b19clk9/ip_admin.gmz/file

Modo de uso

Paso 1: Crear cuenta en un servidor web.
a) Abre una cuenta en un servidor hosting.
b) Crea en tu hosting una carpeta donde alojarás este script.

Paso 2: Personalizar el script.
a) En la parte superior de este script hay un apartado llamado "///Datos a modificar manualmente"
en ese apartado deberás colocar un nombre de usuario, clave y la web de alojamiento donde
será almacenado el script php. Deberás reemplazar los valores "Dixon123", "1234567" y la web_alojamiento.

Paso 3: Subir una copia de este cript al servidor web, dentro de la carpeta que creastes y deberás
llamarlo ip_admin.php (todo en minuscula).

Paso 4: Preparar game maker
a) crea un nuevo script y pégale este código. El script deberá ser llamado ip_admin (todo en minuscula).
b) Crea una room y coloca un objeto, este se encargará de administrar los datos.
c) En el evento create del objeto se deberá colocar:ip_admin("create");
c) En el evento step: ip_admin("step");
d) En el evento Asynchronous - http: ip_admin("http");

paso 5: Visualizar salida:
a) Este script creará dos variables globales llamadas: global.ip y global.cantidad_ip.
    *global.ip: Es la que contiene la ip de usuario.
    *global.cantidad_ip: Es la que contiene la cantidad de ip detectadas(la cantidad de usuarios que han visto tu juego).




Código del script


Código: [Seleccionar]






datos1514='
<?php
///Nombre del script: ip_admin.php;
//Para game maker studio 1.4
//Serial único del script: _BXY256
//Para cambiar el serial único deberá hacerse un reemplazo de todas las apariciones de "_BXY256".

///Datos a modificar manualmente
//Los datos deben estar dentro de comillas dobles.
$Usuario00="Dixon123";
$Clave00="1234567";
$web_alojamiento="https://dixonysusjuegoseducativos.000webhostapp.com/ip_admin/modelo/";
$script_php="ip_admin.php";
$intervalo_llamada="25";//Es el interrvalo de tiempo para solicitar información.

/*

//Instrucciones:
Este script es un código hibrido porque funciona en game maker y en servidores con php.
Para hacerlo funcionar es necesario tener una copia de este script guardado como archivo php
con la extensión ".php" y otra copia deberá estar dentro de un script de game maker.

Modo de uso:
Paso 1: Crear cuenta en un servidor web.
a) Abre una cuenta en un servidor hosting.
b) Crea en tu hosting una carpeta donde alojarás este script.

Paso 2: Personalizar el script.
a) En la parte superior de este script hay un apartado llamado "///Datos a modificar manualmente"
en ese apartado deberás colocar un nombre de usuario, clave y la web de alojamiento donde
será almacenado el script php. Deberás reemplazar los valores "Dixon123", "123456" y la web_alojamiento.

Paso 3: Subir una copia de este cript al servidor web, dentro de la carpeta que creastes y deberás
llamarlo ip_admin.php (todo en minuscula).

Paso 4: Preparar game maker
a) crea un nuevo script y pégale este código. El script deberá ser llamado ip_admin (todo en minuscula).
b) Crea una room y coloca un objeto, este se encargará de administrar los datos.
c) En el evento create del objeto se deberá colocar: id_admin("create");
c) En el evento step: id_admin("step");
d) En el evento Asynchronous - http: id_admin("http");

paso 5: Visualizar salida:
a) Este script creará dos variables globales llamadas: global.ip y global.cantidad_ip.
    *global.ip: Es la que contiene la ip de usuario.
    *global.cantidad_ip: Es la que contiene la cantidad de ip detectadas(la cantidad de usuarios que han visto tu juego).

*/

?>

';

/*
<?php
//////////////////////////////////////////////////////////CÓDIGO PHP
$FuncionPhp=$_POST["funcion_BXY256"];
$UsuarioPhp=$_POST["usuario_BXY256"];
$ClavePhp=$_POST["clave_BXY256"];

//Protección con clave y usuario
$c1=($UsuarioPhp == $Usuario00);
$c2=($ClavePhp == $Clave00);

if(
$c1 and $c2)
{
//Aquí va el código php
if($FuncionPhp == "get")
{
    
//Paso 1: Obteniendo la ip de usuario.
    
function getRealIP()
        {
            if (!empty(
$_SERVER['HTTP_CLIENT_IP']))
            return 
$_SERVER['HTTP_CLIENT_IP'];
            if (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']))
            return 
$_SERVER['HTTP_X_FORWARDED_FOR'];
            return 
$_SERVER['REMOTE_ADDR'];
        }
        
$IpUsuario=getRealIp();
        
        
//Paso 2: Identificando el fichero de registo.
        
$Fichero="registro_ip.txt";
        
        
//Paso 3: Creando fichero si no existe.
        
if (!file_exists($Fichero))
        {
            
$fi fopen($Fichero'w');
            
fclose($fi);
        }
        
        
//Paso 4: Leyendo el contenido del fichero.
        
$FicheroString=file_get_contents($Fichero);
        
        
//Paso 5: Verificando si la ip de usuario está registrada.
        
$IpExiste=substr_count($FicheroString$IpUsuario);
        
        
//Paso 6: Añadiendo la ip de usuario si no existe
        
if($IpExiste == 0)
        {
            
$fi=fopen($Fichero"a");
            
fwrite($fi$IpUsuario."/");
            
fclose($fi);
        }
        
        
//Paso 7: Leyendo el fichero denuevo.
        
$FicheroString=file_get_contents($Fichero);
        
        
//Paso 8: Contando la cantidad de ips registradas.
        
$IpCount=substr_count($FicheroString'/');
        
        
        
//Paso 9: Devolviendo archivo ini.
        
$Fichero_ini="[datos]
ip='xxip'
cantidad_ip=ccc
"
;
        
$Fichero_ini=str_replace('xxip',$IpUsuario,$Fichero_ini);
        
$Fichero_ini=str_replace('ccc',$IpCount,$Fichero_ini);
        echo 
$Fichero_ini;
    }



}
//fin Protección por clave.
////////////////////////////////////////////////////////FIN CÓDIGO PHP
?>

*/
salir_php='
<?php
/*
';
////////////////////////////////////////////////////////CÓDIGO GAME MAKER
if(argument0="create")
{
//Obteniendo datos de script
length00=string_length(datos1514);
posx=string_pos("=",datos1514);
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos(";",datos1514);
global.usuario_BXY256=string_copy(datos1514,1,posx-2);//Usuario
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos("=",datos1514);
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos(";",datos1514);
global.clave_BXY256=string_copy(datos1514,1,posx-2);//Clave
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos("=",datos1514);
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos(";",datos1514);
global.web_alojamiento_BXY256=string_copy(datos1514,1,posx-2);//Web_alojamiento
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos("=",datos1514);
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos(";",datos1514);
global.script_php_BXY256=string_copy(datos1514,1,posx-2);//Nombre del script php
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos("=",datos1514);
datos1514=string_copy(datos1514,posx+2,length00);
posx=string_pos(";",datos1514);
global.intervalo_llamada_BXY256=real(string_copy(datos1514,1,posx-2));//intervalo que transcurrirá por cada llamada

//Construyendo la ruta del servidor
global.web_alojamiento_BXY256=string(global.web_alojamiento_BXY256)+string(global.script_php_BXY256);

//Para efectuar la llamada.
global.step_time_BXY256=0;

//variables para solicitar datos
global.stats_BXY256 = -1;
global.result_BXY256 = "";
global.ID_BXY256 = -1;
global.string_ini_BXY256="";

//Variable para ejecutar código
global.ejecutar_codigo_BXY256=0;

//Datos para el sistema. Estos datos dependerán de cada script.
global.ip="0.0.0.0";
global.cantidad_ip="0";
}


if(argument0="http")
{
    if (ds_map_find_value(async_load,"id")) == global.ID_BXY256
    {
        global.stats_BXY256 = ds_map_find_value(async_load,"status");
        global.string_ini_BXY256 = ds_map_find_value(async_load,"result");
    }
    if global.stats_BXY256 == 0
    {
        global.ejecutar_codigo_BXY256=1;
    }
}


if(argument0="step")
{
    global.step_time_BXY256+=1;
    if(global.step_time_BXY256=global.intervalo_llamada_BXY256)
    {
        funcion00="get";
        global.ID_BXY256 = http_post_string(global.web_alojamiento_BXY256,"funcion_BXY256="+string(funcion00)+"&usuario_BXY256="+string(global.usuario_BXY256)+"&clave_BXY256="+string(global.clave_BXY256));
        global.step_time_BXY256=0;
    }
}

if(global.ejecutar_codigo_BXY256)
{
//El código a ejecutar dependerá de las funciones del script.
        global.ejecutar_codigo_BXY256=0;

//Los datos llegarán en forma de archivo ini.
        ini_open_from_string(global.string_ini_BXY256);
        global.ip = ini_read_string( "datos", "ip", "0.0.0.0" );
        global.cantidad_ip = ini_read_real( "datos", "cantidad_ip", 0);
        ini_close();
}
////////////////////////////////////////////////////FIN CÓDIGO GAME MAKER
salir_php=';
*/
?>

';



6
Juegos completos / La carreta precisa + score online
« en: Julio 26, 2021, 10:58:31 am »


La carreta precisa + score online


Plataformas


GM: Studio

Después de más de 15 años programando en game maker, he logrado mi primer juego con score online y quiero compartirles lo aprendido.




Se ejecuta en todos los dispositivos directamente en la siguiente web:
bit.ly/la_carreta_precisa_v4


7
Desarrollo de Scripts / Score Online
« en: Julio 24, 2021, 11:43:08 am »
Nombre del autor : Reyes Dávila.
Breve descripción de su función : Administrar score online mediante php sin emplear bases de datos.
Versión GM utilizada : Game Maker studio 1.4
Versión del script: 3

Vista previa html5:
Aquí podrán ver en funcionamiento esta nueva versión
https://dixonysusjuegoseducativos.000webhostapp.com/score_online/modelo_hibrido/web_html5/index.html

Modo de uso:
//Instrucciones:
Este script es un código hibrido porque funciona en game maker y en servidores con php.
Para hacerlo funcionar es necesario tener una copia de este script guardado como archivo php
con la extensión ".php" y otra copia deberá estar dentro de un script de game maker.

Modo de uso:
Paso 1: Crear cuenta en un servidor web.
a) Abre una cuenta en un servidor hosting.
b) Crea en tu hosting una carpeta donde alojarás este script.

Paso 2: Personalizar el script.
a) En la parte superior de este script hay un apartado llamado "///Datos a modificar manualmente"
en ese apartado deberás colocar un nombre de usuario, clave y la web de alojamiento donde
será almacenado el script php. Deberás reemplazar los valores "Dixon123", "1234567" y la web_alojamiento.

Paso 3: Subir una copia de este cript al servidor web, dentro de la carpeta que creastes y deberás
llamarlo score_online.php (todo en minuscula).

Paso 4: Preparar game maker
a) crea un nuevo script y pégale este código. El script deberá ser llamado score_online (todo en minuscula).
b) Crea una room y coloca un objeto, este se encargará de administrar los datos.
c) En el evento create del objeto se deberá colocar:    score_online("create");
c) En el evento step:    score_online("step");
d) En el evento Asynchronous - http:    score_online("http");

Paso 5: visualizar salida:
a) para mostrar el score se debe colocar en el evento draw:    score_online("draw");

Más información
Aunque este script trabaja correctamente, quizás algunas personas no sepan seguir los pasos para implementarlo y por eso me siento obligado a seguir mejorandolo. Todabia le faltan muchas cosas tales como:

1. La creación de una web de servicios que facilite la personalización del script.
2. La integración de una función que permita almacenar otros datos además de nombre y puntaje.
3. La creación de un video tutorial donde se enseñe a utilizar este script en menos de 1 minuto.

Yo siempre quise un script como este pero nunca lo conseguí, ahora que lo tengo, es mi deber mejorarlo y difundirlo.  :'( Es necesario tambien explicar las técnicas aplicadas en este script para que no quede nada dificil de comprender. Si Dios quiere les hago uno o varios tutoriales pronto y otras cosas más.

Código del script:
score_online
Código: [Seleccionar]


datos1514='
<?php
///Nombre del script: score_online;
//Versión: 3
//Para game maker studio 1.4
//Serial único del script: _AAS32P
//Para cambiar el serial único deberá hacerse un reemplazo de todas las apariciones de "_AAS32P".

///Datos a modificar manualmente
$Usuario00="Dixon123";
$Clave00="1234567";
$web_alojamiento="https://dixonysusjuegoseducativos.000webhostapp.com/score_online/modelo_hibrido/";
$intervalo_llamada=25;//Es el interrvalo de tiempo para comunicarse con el servidor.

$windows_width=800;//Ancho de la ventana del juego.
$windows_height=600;//Alto de la ventana del juego.

$nombre_script_php="score_online.php";//No requiere modificación. Si cambia este nombre deberá cambiar el del script del servidor.
$interlineado=50;//Separación de las líneas de texto.

///////////////////////Código particular del script
$cantidad_elementos=50;//Es la cantidad de scores a visualizar
$score_x=30;//Posición X de la esquina superior izquierda del score a dibujar.
$score_y=80;//Posicion Y de la esquina superior izquierda del score a dibujar.
$score_width=600;//Ancho del score a dibujar.
$ajustar_score_pantalla_AAS32P =1;//Para ajustar el score a la pantalla, colocar 1 para ajustar y 0 para no adaptar.

$archivo_ini="savedata.ini";//Nombre del archivo ini.

/*

//Instrucciones:
Este script es un código hibrido porque funciona en game maker y en servidores con php.
Para hacerlo funcionar es necesario tener una copia de este script guardado como archivo php
con la extensión ".php" y otra copia deberá estar dentro de un script de game maker.

Modo de uso:
Paso 1: Crear cuenta en un servidor web.
a) Abre una cuenta en un servidor hosting.
b) Crea en tu hosting una carpeta donde alojarás este script.

Paso 2: Personalizar el script.
a) En la parte superior de este script hay un apartado llamado "///Datos a modificar manualmente"
en ese apartado deberás colocar un nombre de usuario, clave y la web de alojamiento donde
será almacenado el script php. Deberás reemplazar los valores "Dixon123", "1234567" y la web_alojamiento.

Paso 3: Subir una copia de este cript al servidor web, dentro de la carpeta que creastes y deberás
llamarlo score_online.php (todo en minuscula).

Paso 4: Preparar game maker
a) crea un nuevo script y pégale este código. El script deberá ser llamado score_online (todo en minuscula).
b) Crea una room y coloca un objeto, este se encargará de administrar los datos.
c) En el evento create del objeto se deberá colocar:score_online("create");
c) En el evento step: score_online("step");
d) En el evento Asynchronous - http: score_online("http");

paso 5: Visualizar salida:


*/

?>

';

//////////////////////////////////////////Codigo extra, particular del script
////Archivo ini por defecto:
/*
<?php
$string_savedata_ini_default
="[score_1]
nombre='Xi Jinping'
puntaje=2236

[score_2]
nombre='☆彡Emma Watson ♥..。.。o○*'
puntaje=1955

[score_3]
nombre='★Shakira'
puntaje=1830

[score_4]
nombre='Vegueta 777'
puntaje=1679

[score_5]
nombre='Kylian Mbappé'
puntaje=1533

[score_6]
nombre='kim jong-un'
puntaje=1349

[score_7]
nombre='Demi Lovato ◠‿◠'
puntaje=1297

[score_8]
nombre='Camila Cabello ♪+♫.♬*.'
puntaje=1170

[score_9]
nombre='Cara Delevingne'
puntaje=989

[score_10]
nombre='Zoe Saldaña'
puntaje=838
"
;
?>

*/


/*
<?php
//////////////////////////////////////////////////////////CÓDIGO PHP
$FuncionPhp=$_POST["funcion_AAS32P"];
$UsuarioPhp=$_POST["usuario_AAS32P"];
$ClavePhp=$_POST["clave_AAS32P"];
$nombre[$cantidad_elementos]=$_POST["nombre_AAS32P"];
$puntaje[$cantidad_elementos]=$_POST["puntaje_AAS32P"];

//Protección con clave y usuario
$c1=($UsuarioPhp == $Usuario00);
$c2=($ClavePhp == $Clave00);

if(
$c1 and $c2)
{
//Aquí va el código php










///////////////////////////Ingresando nuevo score

if($FuncionPhp=="add")
{

///////////////////////////////////////////////  OBTENIENDO DATOS

//Organizador de score online
//Leyendo archivo ini
$contenido parse_ini_file($archivo_initrue);
for(
$i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
$nombre[$i] = $contenido["score_$i2"]["nombre"];
$nombre[$i] ="$nombre[$i]";

$c1="$nombre[$i]";
if(
$c1=="")
{
    
$nombre[$i] = '<nobody>';
    
$puntaje[$i] = 0;
}
else
{
$puntaje[$i] = $contenido["score_$i2"]["puntaje"];
}

$nombre_salida[$i] ="";
$puntaje_salida[$i] =0;
$orden_mayor_menor[$i]=0;
}


///////////////////////////////////////////////  COMPARANDO NUMEROS

//Reiniciando calificacion
for($i=0;$i<$cantidad_elementos;$i+=1)
{
$calificacion[$i]=0;
}

//Comparando elementos.
for($i=0;$i<$cantidad_elementos;$i+=1)//Seleccionando elemento.
{
for(
$i2=0;$i2<$cantidad_elementos;$i2+=1)//Comparando elemento.
{
if(
$i!==$i2)//El elemento no se podrá comparar a si mismo
{
//Si el elemento seleccionado es mayor al elemento comparado.
if($puntaje[$i]>$puntaje[$i2])
{
$calificacion[$i]+=1;
}
//Si el elemento seleccionado es igual al elemento comparado.
$c1=($puntaje[$i]==$puntaje[$i2]);
$c2=$i2>$i;
if(
$c1 and $c2)
{
$calificacion[$i]+=1;
}
}
}
}
//fin //Comparando elementos.


//Organizando calificacion de menor a mayor
for($i=0;$i<$cantidad_elementos;$i+=1)
{
$posicion_elemento=$calificacion[$i];
//Relacionando la calificacion con la posicion
$relacion_calif_pos[$posicion_elemento]=$i;
}

//Organizando de mayor a menor
for($i=0;$i<$cantidad_elementos;$i+=1)
{
$posicion_x=$cantidad_elementos-1-$i;
$orden_mayor_menor[$i]=$relacion_calif_pos[$posicion_x];
$orden_mayor_menor_prev[$i]=$orden_mayor_menor[$i];
}


///////////////////////////////////////////////  INTEGRANDO DATOS

$continuar=1;
for(
$i=0;$i<$cantidad_elementos and $continuar;$i+=1)
{
$elemento_x=$orden_mayor_menor[$i];
if(
$puntaje[$cantidad_elementos]>=$puntaje[$elemento_x])
{
$orden_mayor_menor[$i]=$cantidad_elementos;
for(
$i2=$i;$i2<$cantidad_elementos;$i2+=1)
{
$orden_mayor_menor[$i2+1]=$orden_mayor_menor_prev[$i2];
}
$continuar=0;//Detener el ciclo ford
}
}



///////////////////////////////////////////////  SALIDA DE DATOS

//relacionando puntajes con la salida
for($i=0;$i<$cantidad_elementos;$i++)
{
$elemento_x=$orden_mayor_menor[$i];
$nombre_salida[$i]=$nombre[$elemento_x];
$puntaje_salida[$i]=$puntaje[$elemento_x];
}

echo 
"<br><br>";
for(
$i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
echo 
"[score_$i2]: <br>";
echo 
"$nombre_salida[$i] <br>";
echo 
"$puntaje_salida[$i] <br><br>";
}

//Escribiendo en archivo ini
$fichero fopen($archivo_ini,"w");
for(
$i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
fputs($fichero,"[score_$i2]\n");
fputs($fichero,"nombre=".'"'."$nombre_salida[$i]".'"'."\n");
fputs($fichero,"puntaje=$puntaje_salida[$i]\n\n");
}
fclose($fichero);

}
//fin ingresando nuevo score.











////////////////////////////Borrando score

if($FuncionPhp=="clear")
{
echo 
"<br><br><br><br>FUNCION CLEAR<br><br><br><br>";
//Escribiendo en archivo ini
$fichero fopen($archivo_ini,"w");
for(
$i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
fputs($fichero,"[score_$i2]\n");
fputs($fichero,"nombre='<nobody>'\n");
fputs($fichero,"puntaje=0\n\n");
}
fclose($fichero);
}

///FIN BORRANDO SCORE



////////////////////////Estableciendo score predeterminado

if($FuncionPhp=="default")
{
    
//Organizador de score online
    
$fichero00=fopen("$archivo_ini""w");
    
fwrite($fichero00,$string_savedata_ini_default);
    
fclose($fichero00);
    
}
// fin estableciendo score predeterminado.if($funcion_get=="default")














///////////solicitando score

if($FuncionPhp =="get")
{

//Organizador de score online
//Leyendo archivo ini
$contenido parse_ini_file($archivo_initrue);
for(
$i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
$nombre[$i] = $contenido["score_$i2"]["nombre"];
$nombre[$i] ="$nombre[$i]";

$c1="$nombre[$i]";
if(
$c1=="")
{
    
$nombre[$i] = '<nobody>';
    
$puntaje[$i] = 0;
}
else
{
    
$puntaje[$i] = $contenido["score_$i2"]["puntaje"];
}

}

//visualizando salida
for($i=0;$i<$cantidad_elementos;$i++)
{
$i2=$i+1;
echo 
"[score_$i2]
nombre="
.'"'.$nombre[$i].'"'."
puntaje=
$puntaje[$i]

"
;

}
}
//fin Solicitando score






///////////Si no existe el archivo ini creará uno.
if(!file_exists($archivo_ini))
{
    
//Leyendo string ini por defecto
    
$contenido parse_ini_string($string_savedata_ini_defaulttrue);
    for(
$i=0;$i<$cantidad_elementos;$i++)
    {
        
$i2=$i+1;
        
$nombre[$i] = $contenido["score_$i2"]["nombre"];
        
$nombre[$i] ="$nombre[$i]";

        
$c1="$nombre[$i]";
        if(
$c1=="")
        {
            
$nombre[$i] = '<nobody>';
            
$puntaje[$i] = 0;
        }
        else
        {
            
$puntaje[$i] = $contenido["score_$i2"]["puntaje"];
        }
    }
    
    
$fichero fopen($archivo_ini,"w");
    for(
$i=0;$i<$cantidad_elementos;$i++)
    {
        
$i2=$i+1;
        
fputs($fichero,"[score_$i2]\n");
        
fputs($fichero,"nombre='".$nombre[$i]."'\n");
        
fputs($fichero,"puntaje=".$puntaje[$i]."\n\n");
    }
    
fclose($fichero);

}
///////////fin Si no existe el archivo ini




}//fin Protección por clave.
////////////////////////////////////////////////////////FIN CÓDIGO PHP
?>

*/
salir_php='
<?php
/*
';

////////////////////////////////////////////////////////CÓDIGO GAME MAKER
if(argument0="create")
{
    //////////Botones a usar
    global.mb_AAS32P=0;
    global.mb_speed_AAS32P=0;
    global.my_previo_AAS32P=mouse_y;
    
    //variables para comunicarse con servidor
    global.stats_AAS32P = -1;
    global.result_AAS32P = "";
    global.ID_AAS32P = -1;

    ///////Obteniendo datos de string php datos1514
    length00_AAS32P=string_length(datos1514);

    for(i_AAS32P=0;i_AAS32P<=12;i_AAS32P+=1)
    {
        posx_AAS32P=string_pos("=",datos1514);
        datos1514=string_copy(datos1514,posx_AAS32P+1,length00_AAS32P);
        posx_AAS32P=string_pos(";",datos1514);
        dato_prev_AAS32P=string_copy(datos1514,1,posx_AAS32P-1);
        dato_prev_AAS32P=string_replace_all(dato_prev_AAS32P,'"','');
        dato_prev_AAS32P=string_replace_all(dato_prev_AAS32P,"'","");
        datos_AAS32P[i_AAS32P]=dato_prev_AAS32P;
        datos1514=string_copy(datos1514,posx_AAS32P+2,length00_AAS32P);
    }

    global.usuario_AAS32P=datos_AAS32P[0];
    global.clave_AAS32P=datos_AAS32P[1];
    global.web_alojamiento_AAS32P=string(datos_AAS32P[2])+string(datos_AAS32P[6]);
    global.intervalo_llamada_AAS32P=real(datos_AAS32P[3]);
    global.windows_width_AAS32P=real(datos_AAS32P[4]);
    global.windows_height_AAS32P=real(datos_AAS32P[5]);
    global.step_time_AAS32P=global.intervalo_llamada_AAS32P;
    global.interlineado_AAS32P=real(datos_AAS32P[7]);//Separación de las líneas del score.
    
    ///////////////////////Código particular del script
    global.cantidad_elementos_AAS32P=real(datos_AAS32P[8]);
    global.score_x_AAS32P=real(datos_AAS32P[9]);//Posición X de la esquina superior izquierda del score a dibujar.
    global.score_y_AAS32P=real(datos_AAS32P[10]);//Posicion Y de la esquina superior izquierda del score a dibujar.
    global.score_width_AAS32P=real(datos_AAS32P[11]);//Ancho del score a dibujar.
    global.ajustar_score_pantalla_AAS32P=real(datos_AAS32P[12]);//Condición para adaptar el score a la pantalla.
    
    if(global.ajustar_score_pantalla_AAS32P=1)
    {
        global.score_x_AAS32P=global.windows_width_AAS32P/20;//Posición X de la esquina superior izquierda del score a dibujar.
        global.score_y_AAS32P=global.windows_height_AAS32P/5;//Posicion Y de la esquina superior izquierda del score a dibujar.
        global.score_width_AAS32P=global.windows_width_AAS32P-global.score_x_AAS32P*2;
    }
    
    //Para mover el score
    global.score_y_pre_AAS32P=global.score_y_AAS32P;
    global.score_y_top_AAS32P=global.score_y_AAS32P;
    global.score_height_AAS32P=(global.interlineado_AAS32P)*global.cantidad_elementos_AAS32P;
    global.score_y_bottom_AAS32P=global.score_y_AAS32P+global.score_height_AAS32P;
    
    //variables para asignar nuevo score
    global.usuario_default_AAS32P="Anónimo";
    //creando arrays vacios
    for(i_AAS32P=0;i_AAS32P<=global.cantidad_elementos_AAS32P;i_AAS32P+=1)
    {
        global.nombre_AAS32P[i_AAS32P]="<nobody>";
        global.puntaje_AAS32P[i_AAS32P]=0;
    }

}//fin if(argument0="create")


if(argument0="http")
{
    if (ds_map_find_value(async_load,"id")) == global.ID_AAS32P
    {
        global.stats_AAS32P = ds_map_find_value(async_load,"status");
        global.string_ini_AAS32P = ds_map_find_value(async_load,"result");
    }
    
    if (global.stats_AAS32P == 0)
    {
        score_online("respuesta correcta");
    }
    
    if (global.stats_AAS32P < 0)
    {
        score_online("error");
    }
    
    if (global.stats_AAS32P > 0)
    {
        score_online("cargando");
    }
}


if(argument0="step")
{
    global.step_time_AAS32P+=1;
    if(global.step_time_AAS32P>=global.intervalo_llamada_AAS32P)
    {
        funcion00="get";
        global.ID_AAS32P = http_post_string(global.web_alojamiento_AAS32P,"funcion_AAS32P="+string(funcion00)+"&usuario_AAS32P="+string(global.usuario_AAS32P)+"&clave_AAS32P="+string(global.clave_AAS32P));
        global.step_time_AAS32P=0;
    }
}

if(argument0="respuesta correcta")
{
    //Los datos llegarán en forma de archivo ini.
    ini_open_from_string(global.string_ini_AAS32P);
    //ini_read_string( "seccion", "key", "defaul" );
    //ini_close();
    
    ///////////////////////Código particular del script
    for(i_AAS32P=1;i_AAS32P<=global.cantidad_elementos_AAS32P;i_AAS32P+=1)
    {
        section_AAS32P='score_'+string(i_AAS32P);
        global.nombre_AAS32P[i_AAS32P]= ini_read_string( section_AAS32P, 'nombre', '<nobody>' );
        global.puntaje_AAS32P[i_AAS32P]= ini_read_real( 'score_'+string(i_AAS32P), 'puntaje', 0 );
    }
    ini_close();

}

if(argument0="error")
{
//Error al solicitar información
}

if(argument0="cargando")
{
//Cargando información
}


if(argument0="draw")
{
    ////////////////botones a usar
    global.mbp_AAS32P=(global.mb_AAS32P=0)*mouse_check_button(mb_left);
    global.mb_AAS32P=mouse_check_button(mb_left);
    global.my_AAS32P=mouse_y;
    
    ////////////////////MOVIMIENTO DEL SCORE
    //dando el primer click
    if(global.mbp_AAS32P)
    {
        global.score_y_pre_AAS32P=mouse_y-global.score_y_AAS32P;
    }
    
    //Mientras tenemos presionado
    if(global.mb_AAS32P)
    {
        global.score_y_AAS32P=mouse_y-global.score_y_pre_AAS32P;
        //velocidad de movimiento
        global.mb_speed_AAS32P+=(mouse_y-global.my_previo_AAS32P)/10;
    }
    else
    {
        
        //movimiento
        global.score_y_AAS32P+=global.mb_speed_AAS32P;
    }
    
    //Disminuyendo la velocidad del movimiento
    if(global.mb_speed_AAS32P>0){global.mb_speed_AAS32P-=0.5}
    if(global.mb_speed_AAS32P<0){global.mb_speed_AAS32P+=0.5}
    if(abs(global.mb_speed_AAS32P)<1){global.mb_speed_AAS32P=0}
        
    //LÍMITES DEL MOVIMIENTO
    if(global.score_y_AAS32P>global.score_y_top_AAS32P){global.score_y_AAS32P=global.score_y_top_AAS32P;global.mb_speed_AAS32P=0}
    if((global.score_y_AAS32P+global.score_height_AAS32P)<global.windows_height_AAS32P/2){global.score_y_AAS32P=global.windows_height_AAS32P/2-global.score_height_AAS32P;global.mb_speed_AAS32P=0}

    //Si dejamos de presionar
    global.my_previo_AAS32P=mouse_y;
        
    
    ///////////////////////FIN MOVIMIENTO DEL SCORE
    
    dx_AAS32P=global.score_x_AAS32P;
    dy_AAS32P=global.score_y_AAS32P;
    ancho_AAS32P=abs(floor(global.score_width_AAS32P));
    sep_AAS32P=global.interlineado_AAS32P;
    for(i_AAS32P=1;i_AAS32P<=global.cantidad_elementos_AAS32P;i_AAS32P+=1)
    {
        text1_AAS32P=string(i_AAS32P)+". "+string(global.nombre_AAS32P[i_AAS32P])+"..........................................................";
        length1_AAS32P=string_length(text1_AAS32P);
        text2_AAS32P=string(global.puntaje_AAS32P[i_AAS32P]);
        width1_AAS32P=string_width(text1_AAS32P);
        width2_AAS32P=string_width(text2_AAS32P);
   
        //sumando espacio
        while((width1_AAS32P+width2_AAS32P)<ancho_AAS32P)
        {
            text1_AAS32P=string_insert(".",text1_AAS32P,length1_AAS32P);
            length1_AAS32P=string_length(text1_AAS32P);
            width1_AAS32P=string_width(text1_AAS32P);
        }
   
        //Restando espacio
        while((width1_AAS32P+width2_AAS32P)>ancho_AAS32P)
        {
            text1_AAS32P=string_copy(text1_AAS32P,1,length1_AAS32P-2);
            length1_AAS32P=string_length(text1_AAS32P);
            width1_AAS32P=string_width(text1_AAS32P);
        }
        pos2_AAS32P=width1_AAS32P;
        //sumando espacio
        while((pos2_AAS32P+width2_AAS32P)<ancho_AAS32P)
        {
            pos2_AAS32P+=1;
        }

        draw_text(dx_AAS32P,dy_AAS32P,text1_AAS32P);//Dibujando nombre
        draw_text(dx_AAS32P+pos2_AAS32P,dy_AAS32P,text2_AAS32P);//Dibujando puntaje
        dy_AAS32P+=sep_AAS32P;
    } // fin for(i_AAS32P=1;i_AAS32P<=global.cantidad_elementos;i_AAS32P+=1)
}//fin if(argument0="draw")

////////////////////////////////////FIN Para el evento draw




//////////////////////////////////Para agregar un nuevo score
if(argument0="add")
{

    //Agregando un nuevo score
    global.usuario_default_AAS32P=get_string("Nombre: ",global.usuario_default_AAS32P);
    //score=get_integer("Score:",0);
    if(score>=global.puntaje_AAS32P[global.cantidad_elementos_AAS32P])
    {
        funcion_AAS32P="add";
        http_post_string(global.web_alojamiento_AAS32P,"funcion_AAS32P="+string(funcion_AAS32P)+"&usuario_AAS32P="+string(global.usuario_AAS32P)+"&clave_AAS32P="+string(global.clave_AAS32P)+"&nombre_AAS32P="+string(global.usuario_default_AAS32P)+"&puntaje_AAS32P="+string(score));
    }
    else
    {
        show_message("El score es muy bajo para entrar en el top 10");
    }

}//fin  if(argument0="add");




if(argument0="clear")
{
    funcion_AAS32P="clear";
    http_post_string(global.web_alojamiento_AAS32P,"funcion_AAS32P="+string(funcion_AAS32P)+"&usuario_AAS32P="+string(global.usuario_AAS32P)+"&clave_AAS32P="+string(global.clave_AAS32P)+"&nombre_AAS32P="+string(global.usuario_default_AAS32P)+"&puntaje_AAS32P="+string(score));
}//fin  if(argument0="clear");



if(argument0="default")
{
    funcion_AAS32P="default";
    http_post_string(global.web_alojamiento_AAS32P,"funcion_AAS32P="+string(funcion_AAS32P)+"&usuario_AAS32P="+string(global.usuario_AAS32P)+"&clave_AAS32P="+string(global.clave_AAS32P)+"&nombre_AAS32P="+string(global.usuario_default_AAS32P)+"&puntaje_AAS32P="+string(score));
}//fin  if(argument0="default");





////////////////////////////////////////////////////FIN CÓDIGO GAME MAKER
salir_php=';
*/
?>

';



8
General / Game maker, ideas.
« en: Julio 02, 2021, 01:09:16 am »
Hola gusto en saludarlos.  :)

Hoy hice este bosquejo mientras pensaba en Game Maker y quería hablarles de eso.



1.   Al principio de la imagen vemos a un hombre jalando una carreta hacia una montaña.

Hace algunos años cree un juego llamado “la carreta precisa”, actualmente le estoy haciendo modificaciones para poder presentarles pronto el mismo juego con grandes cambios en su código interno, el objetivo principal del pequeño proyecto es diseñar una nueva forma de ofrecer o compartir juegos sin tener que recurrir a la descarga del mismo, pero esto se lo dejo para el próximo post donde profundizaré con más detalles.

Preguntas de razonamiento:
a.   ¿Cómo se pudiese lograr que un juego le llegue a otra persona sin recurrir a la descarga o a la exposición de juegos html5?
b.   ¿Cómo logras crear un juego con muchas instancias si has colocado un solo objeto en la room y no puedes usar instance_create por motivos de compatibilidad?

2.   La cuadricula.
En el bosquejo se ve una pequeña cuadricula y arriba de esta aparece la palabra “collicion block” (bloque de colisión) y refleja la idea de crear un sistema de colisión independiente donde se recurrirá a la cuadriculación de ciertas áreas de la room permitiendo “en teoria” colisiones entre arrays.  Lo que pudiese permitir en el futuro crear pequeños juegos de plataformas donde no existan sprites pero un así existan imágenes y colisiones.

Preguntas de razonamiento:
1.   ¿Cómo lograrías una colisión entre entidades sin usar sprites?
2.   ¿Cómo mostrarías una imagen sin usar sprites ni background?

3.   Pequeña lista que dice: 1 objeto, 1 room y un script.
Siempre he valorado la creación de juegos a punta de código, y en esta lista se refejan los tres componentes que requeriría el juego:

A.   Objeto: Con tan solo un objeto se pueden crear muchos otros objetos los cuales pueden cambiar de forma, usos y apariencias.
B.   Room: Sin cuarto no hay juego, pero un juego no requiere tener objeto…. ¿qué?.
C.   Script: El script es indispensable, bueno no siempre.


Preguntas de razonamiento:
A.   ¿Se puede crear un video juego completo solo con código sin sprites ni background?
B.   Un juego creado solo con códigos, sin sprites ni background ¿pudiese mostrar el sprite original de mario?
C.   ¿Cómo crearías un juego en game maker sin usar objetos?
D.   Ahora ¿Cómo crear un juego con un objeto un cuanto pero sin script?


4.   Lo relacionado con php.

Me bastó con ver un solo video de php para darme cuenta de las cosas que se pueden crear al unir php con game maker. Bydgle, ya nos había mostrado un post sobre base de datos, game maker studio y php, peroaunque no lo entendí mucho, poco a poco he comprendido que php amplifica las posibilidades del game maker al punto de convertirlo en un framework si lo deseamos, y nos abre las puestas para crear nuestro propio motor de video juegos (con alta velocidad).

Preguntas de razonamiento:
a.   ¿Con game maker puedo crear un framework?

Bueno, con esta me despido, la pregunta que viene a continuación merece una pequeña caricatura:

Un dragón llega a la ciudad



La ciudad queda destruida



El dragón se acerca a tí para proponerte un trato



 ;)
Todas estas preguntas tienen solución, espero sus opiniones, luego daré las respuestas.

9
Desarrollo de Scripts / ajuste_canvas_html5(width,height);
« en: Junio 24, 2021, 06:28:11 am »
Nombre del autor : Reyes Dávila.
Breve descripción de su función : Ajusta el canvas (el área de juego) en exploradores web, manteniendo la proporcion aunque se cambie la orientacion del dispositivo movil.
Versión GM utilizada : Game Maker studio.

Código del script:
ajuste_canvas_html5(width,height);

Código: [Seleccionar]


///ajuste_canvas_html5(width,height);
//Este script deberá ser llamado "ajuste_canvas_html5"
//Colocar en evento create: ajuste_canvas_html5("create");
//Colocar en evento step : ajuste_canvas_html5("step");

if(argument0="create")
{
    ///////////////////////////////////Datos a modificar
    Ancho00=room_width;
    Alto00=room_height;
    intervalo_ajuste=20;
    //////////////////////////Fin de datos a modificar

    ajuste_canvas_html5_step_time=0;
    proporcion_browser_previa=0;
    modulo="otro";
    if(string_length(string(self))>2){modulo="html5";alarm[0]=20};
}

if(argument0="step")
{
    ajuste_canvas_html5_step_time+=1;
    if(ajuste_canvas_html5_step_time=intervalo_ajuste)
    {
        ajuste_canvas_html5_step_time=0;
       
        proporcion00=Ancho00/Alto00;
        proporcion_browser00=browser_width/browser_height;

        if(modulo="html5")
        {
            if(proporcion_browser00!=proporcion_browser_previa)
            {
                anchox100=90*browser_width/100;
                altoy100=90*browser_height/100;
                altoy00=anchox100/proporcion00;

                while(altoy00>altoy100)
                {
                    anchox100-=1;
                    altoy00=anchox100/proporcion00;
                }

                window_set_size(anchox100,altoy00);
                window_set_position((browser_width-anchox100)/2,0);

            }//fin if(proporcion_browser00!=proporcion_browser_previa)

            proporcion_browser_previa=proporcion00;
        }
    }
}









Modo de uso

1. Crear un script llamado: ajuste_canvas_html5 con el código anterior.

2. En el evento create colocar:
Código: [Seleccionar]
ajuste_canvas_html5("create");
3. En el evento step colocar:
Código: [Seleccionar]
ajuste_canvas_html5("step");

10
Juegos completos / Agua pal pueblo
« en: Junio 08, 2021, 05:39:23 am »


Agua pal pueblo


Plataformas


GM4 y Html5

Cada vez que puedo voy a buscar agua potable para mí y mis vecinos, estoy contento de poder ayudar principalmente a las personas necesitadas.




Para todas las plataformas y sistemas:
agua_pal_pueblo


Más información:
Lo he creado para mostrarles la realidad que vivo y lo agradable que es ayudar a los vecinos.

Datos técnicos:
1. Para agilizar la creación de video juegos, me es conveniente crear una plantilla que me ofrezca los códigos básicos para no tener que volver a empezar de cero.
2. Luego de tener la plantilla me conviene crear pequeños generadores de juegos básicos que me ayuden a crear pequeños niveles de forma rápida.
3. La calidad de los juegos puede aumentar si agrego mejores imágenes y más niveles, siempre y cuando no pierda el sentido del juego, su significado y su espíritu.
4. Tengo la esperanza de producir un juego diario de buena calidad.
5. Monetización: …. Sin decisiones certeras. Estuve integrando acortadores de link para recibir algo de dinero por cada jugada, pero al parecer esto no fue muy aceptable por el público. Se requieren más experimentos y quizás nuevas estrategias.


11
Juegos completos / El piloto sin licencia
« en: Mayo 26, 2021, 08:21:21 am »


El piloto sin licencia


Naves


GM: Html5

Lo agradable que es charlar y compartir con los amigos.




Puede jugarse desde cualquier dispositivo en esta web:
Game_web

Más datos:
Esta obra le he creado para compartir algo con ustedes, es bastante corta pero estoy seguro que mediante esta lograré transmitir algunas pequeñas y diminutas emociones.

Datos técnicos:

 Mediante este pequeño juego obtuve los siguientes datos:

1.   El área de los juegos html5 se llama “canvas”, y este puede ser modificado cambiando el index.html.

2.   Para evitar que el explorador nos pregunte por el idioma es necesario cambiar en el index.html la etiqueta  <html lang="en"> por <html lang="es">, dependiendo del idioma de destino (“en” para ingles y “es” para español).

3.   La páginas web alojadas en google drive y difundidas por drv.tw presentarán dificultades al momento de actualizarlas. Para solucionar esto será necesario cambiar el nombre de la carpeta raíz lo que significa tener cambiar todo el enlace de la web.

4.   El estilo recomendado para el canvas del index es:
Código: [Seleccionar]

*{
margin-left: auto;
margin-right: auto;
text-align: center;
width: 80vw;
max-width: 80vh;
}

5.   Los juegos html5 pueden usar “view” adecuadamente.

12
Nombre del autor : Reyes Dávila.
Breve descripción de su función : Dibuja un cubo 3d, sin activar funciones 3d.
Versión GM utilizada : Game maker 3.3 (April 3, 2001)  y teóricamente funciona en todos los game maker superiores

En el siguiente enlace podrás ver el código funcionando en html5
Draw_cube


Código del script:

Código sin color ni giro para todas las versiones superiores a game maker 3
Spoiler
///draw_cube(x,y,width,height,length,anglex,angley);
//Obteniendo argumentos.
posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument3;
length00=argument4;
anglex00=argument5;
angley00=argument6;

//Determinando los cuatro puntos del cuadrado
//Punto A
pax00=posx00;
pay00=posy00;
//Punto B
pbx00=pax00+length00;
pby00=pay00;
//Punto C
pcx00=pbx00;
pcy00=pby00+height00;
//Punto D
pdx00=pax00;
pdy00=pay00+height00;

//Ubicando el punto de fuga
//Determinando el centro del cubo
pcenx00=pax00+length00/2;
pceny00=pay00+height00/2;
//Punto de fuga
lengthmax00=length00*5;
heightmax00=height00*5;
widthmax00=width00*5;

pfugax00=pcenx00+(lengthmax00/45)*anglex00;
pfugay00=pceny00+(heightmax00/45)*angley00;

if(pfugax00>pcenx00+lengthmax00){pfugax00=pcenx00+lengthmax00}
if(pfugay00>pceny00+heightmax00){pfugay00=pceny00+heightmax00}
if(pfugax00<pcenx00-lengthmax00){pfugax00=pcenx00-lengthmax00}
if(pfugay00<pceny00-heightmax00){pfugay00=pceny00-heightmax00}


//Determinando puntos finales
distancia_ab=point_distance(pax00,pay00,pfugax00,pfugay00);
if(distancia_ab>widthmax00){distancia_ab=widthmax00}
porcentajex02=abs(abs(distancia_ab-widthmax00)*100/widthmax00);
width200=(porcentajex02*width00)/100;
i=width00-width200;
directionf=point_direction(pax00,pay00,pfugax00,pfugay00);
distancia_ab=point_distance(pfugax00,pfugay00,pax00,pay00);
distancia_ab+=0.0000001;
distancia_ax=(distancia_ab-i);
porcentaje100=(distancia_ax*100)/distancia_ab;
length200=(porcentaje100*length00)/100;
x1=pax00+i*cos(directionf*pi/180);
y1=pay00-i*sin(directionf*pi/180);
x2=x1+length200*cos(0*pi/180);
y2=y1-length200*sin(0*pi/180);

pex00=x1;
pey00=y1;
pfx00=x2;
pfy00=y2;


//Determinando puntos finales
distancia_ab=point_distance(pdx00,pdy00,pfugax00,pfugay00);
if(abs(distancia_ab)>widthmax00){distancia_ab=widthmax00}
porcentajex02=abs(abs(distancia_ab-widthmax00)*100/widthmax00);
width200=(porcentajex02*width00)/100;
i=width00-width200;
directionf=point_direction(pdx00,pdy00,pfugax00,pfugay00);
distancia_ab=point_distance(pfugax00,pfugay00,pdx00,pdy00);
distancia_ab+=0.0000001;
distancia_ax=(distancia_ab-i);
porcentaje100=(distancia_ax*100)/distancia_ab;
height200=(porcentaje100*height00)/100;

pgx00=pfx00+height200*cos(270*pi/180);
pgy00=pfy00-height200*sin(270*pi/180);
phx00=pgx00+length200*cos(180*pi/180);
phy00=pgy00-length200*sin(180*pi/180);

//Dibujando líneas
//Línea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Línea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Línea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Línea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Línea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Línea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Línea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Línea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Línea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Línea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Línea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Línea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);


Version 2 del codigo sin color pero con rotación, para todos los game maker superiores a game maker 3.
Spoiler
//draw_cube( x, y, width, height, length, rotation, fugax, fugay);

//Obteniendo argumentos
posx00=argument0;
posy00=argument1;
width00=argument2;
height00=argument3;
length00=argument4;
rotation00=argument5;
pfugax00=argument6;
pfugay00=argument7;

//Determinado punto central de la primera cara
pcenx00=posx00+length00/2;
pceny00=posy00+height00/2;
direction_center00=360-point_direction(posx00,posy00,pcenx00,pceny00);
distance_center00=point_distance(posx00,posy00,pcenx00,pceny00);

//Hallando los primeros cuatro puntos que conforman la primera cara
for(i=1;i<=4;i+=1)
{
direction_ram00=direction_center00;
if(i=2){direction_ram00=180-direction_center00}
if(i=3){direction_ram00=180+direction_center00}
if(i=4){direction_ram00=-direction_center00}
puntox00[i]=pcenx00+distance_center00*cos((direction_ram00+rotation00)*pi/180);
puntoy00[i]=pceny00-distance_center00*sin((direction_ram00+rotation00)*pi/180);
}

//hallando punto de fuga 2
direction_fuga00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
pfuga2x00=pcenx00+width00*2*cos(direction_fuga00*pi/180);
pfuga2y00=pceny00-width00*2*sin(direction_fuga00*pi/180);

//Hallando al punto central 2
direction_fuga00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
pcen2x00=pcenx00+(width00/2)*cos(direction_fuga00*pi/180);
pcen2y00=pceny00-(width00/2)*sin(direction_fuga00*pi/180);

//Hallando al punto central 3
direction_fuga00=point_direction(pcenx00,pceny00,pfuga2x00,pfuga2y00);
pcen3x00=pcenx00+(width00/2)*cos(direction_fuga00*pi/180);
pcen3y00=pceny00-(width00/2)*sin(direction_fuga00*pi/180);

//Ajuste de punto central 2
distance_fuga00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
if(distance_fuga00<width00/2){pcen2x00=pfugax00;pcen2y00=pfugay00}

//Hallando cuatro ultimos puntos
distance_fuga00=point_distance(pcenx00,pceny00,pfuga2x00,pfuga2y00)+0.00001;
distance_fuga200=point_distance(pcen3x00,pcen3y00,pfuga2x00,pfuga2y00)+0.00001;
porcentaje200=distance_fuga200*100/distance_fuga00;
distance_center200=porcentaje200*distance_center00/100;

for(i=5;i<=8;i+=1)
{
direction_ram00=direction_center00;
if(i=6){direction_ram00=180-direction_center00}
if(i=7){direction_ram00=180+direction_center00}
if(i=8){direction_ram00=-direction_center00}
puntox00[i]=pcen2x00+distance_center200*cos((direction_ram00+rotation00)*pi/180);
puntoy00[i]=pcen2y00-distance_center200*sin((direction_ram00+rotation00)*pi/180);
}

//Dibujando lineas cara final
for(i=5;i<=8;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
if(i=8){x2=puntox00[5];y2=puntoy00[5]}else{
x2=puntox00[i+1];
y2=puntoy00[i+1];}
draw_line(x1,y1,x2,y2);
}

bloquear=''
//Dibujando lineas de union
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
x2=puntox00[i+4];
y2=puntoy00[i+4];
draw_line(x1,y1,x2,y2);
}
//'

//Dibujando lineas cara frontal
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
if(i=4){x2=puntox00[1];y2=puntoy00[1]}else{
x2=puntox00[i+1];
y2=puntoy00[i+1];}
draw_line(x1,y1,x2,y2);
}




bloquear='
//dibujando lineas al punto de fuga
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
x2=pfuga2x00;
y2=pfuga2y00;
draw_line(x1,y1,x2,y2)
}

draw_line(pcenx00,pceny00,pfugax00,pfugay00);
draw_circle(pcenx00,pceny00,5);
draw_circle(pcen2x00,pcen2y00,5);
//'


Version ligera donde solo se dibujan las lineas del cubo, solo para game maker 4 y 5
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
//draw_set_color(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

version ligera para game maker 6,7,8, html5 y mac
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
draw_set_color(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

Version ligera para game maker studio 1 y 2
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
draw_set_colour(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

Código con color y giro para game maker 4 y 5
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(x,y,50,256,256,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
pen_color=c_black;
pen_color=brush_color;
//Cara 6
brush_color=color05;
pen_color=brush_color;
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00);
//Cara 5
brush_color=color04;
pen_color=brush_color;
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00);
//Cara 4
brush_color=color03;
pen_color=brush_color;
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00);
//Cara 3
brush_color=color02;
pen_color=brush_color;
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00);
//Cara 2
brush_color=color01;
pen_color=brush_color;
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00);
//Cara 1
brush_color=color00;
pen_color=brush_color;
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00);

pen_color=c_black;
//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);

Código con giro y color para game maker 6, 7, 8, html5 y mac.
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(x,y,50,256,256,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
pen_color=c_black;
//Cara 6
brush_color=color05;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00,0);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00,0);
//Cara 5
brush_color=color04;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00,0);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00,0);
//Cara 4
brush_color=color03;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00,0);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00,0);
//Cara 3
brush_color=color02;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00,0);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00,0);
//Cara 2
brush_color=color01;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00,0);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00,0);
//Cara 1
brush_color=color00;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00,0);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00,0);

pen_color=c_black;
draw_set_color(pen_color);

//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);

Código con giro y color para game maker studio 1 y 2.
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(mouse_x,mouse_y,50,room_width/2,room_height/2,direction,c_fuchsia);


posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
//Cara 6
brush_color=color05;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00);
//Cara 5
brush_color=color04;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00);
//Cara 4
brush_color=color03;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00);
//Cara 3
brush_color=color02;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00);
//Cara 2
brush_color=color01;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00);
//Cara 1
brush_color=color00;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00);

pen_color=c_black;
//draw_set_color(pen_color);
draw_set_colour(pen_color);

//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
Modo de uso:
1. Copia el código.
2. Crea un nuevo script, pegas el código y colocale de nombre draw_cube.
3. En un evento draw de un objeto cualquiera coloca el siguiente código y modifícalo a tu gusto:
draw_cube(256,256,64,64,64,45,45);

Detalles de la función draw_cube
draw_cube( x, y, width, height, length, anglex, angley):
X y Y: Posición de la esquina superior izquierda del cubo, es la ubicación del cubo en la room.
Width, height y length: Coloca en estos el ancho, la altura y el largo respectivamente, guiándote por el siguiente dibujo.
Anglex y angley: son los ángulos de inclinación del cubo los cuales no deben ser menores de -45 ni mayores a 45 grados.
fugax y fugay: Es la posición del punto de fuga en el plano. (Estudiar proyección cónica).
Imagen1:


Imagen 2:


Vista previa:


Limitaciones:
1. El cubo no podrá girar 360 grados, tiene un límite de giro de 45 grados.
2. El cubo no puede adquirir textura ni color de fondo.

Importancia:
Este script contiene los fundamentos básicos de proyección cónica con un punto de fuga (estudiar sobre proyección cónica) y servirá de base para la creación de otros scripts con dos o más puntos de fugas, lo que puede permitir la formación de objetos 3d más exactos y complejos sin necesidad de emplear funciones 3d.

Orígen:
Desde hace algunos años tengo la intención de crear algún juego 3d en game makers que no empleen 3d y luego de investigar encontré el tema de proyecciones cónicas suministrado por un canal de youtube llamado .

Mejoras en proceso:
1. Giro de 360 grados.
2. Funcion para agregar color de fondo.
3. Rotación desde su punto central: lo que se quiere es que el cubo pueda girar sobre su punto central.

Dificultades de programación:
Quiero mejorar el script agregándole la posibilidad de girar el cubo a 360 grados y no encuentro tutorial de proyección cónica que explique eso, sólo encontré un tutorial de entivoo ()que indica que para lograr un giro completo es necesario pasar de “dos puntos de fuga” a “un punto de fuga” (proyecciones cónicas) pero no me explica cómo, para lograr eso es necesario comprender al 100% la transición que existe entre dos puntos de fuga a un punto de fuga.
Intenté crear un script que involucra dos puntos de fuga pero me resultó bastante malo, en el proceso logré echarle un vistazo a lo que me espera y ahora sé que para abordar ese tema será bueno mejorar el presente script (de un punto de fuga) agregándole más funciones complejas y útiles que permita un giro en 2D y agregar colores mediante triángulos.

Visión a futuro:
Bueno…, sin esperanza no hay programación. Más adelante si Dios lo permite y si recibo ayuda intelectual y quizás económica, pienso crear un script más complejo que permita la formación de figuras 3d a base de triángulos en el espacio, lo que me permitirá crear una versión de starfox de snes. Ya sé que game  maker cuenta con un avanzado sistema 3d que lo facilita todo, pero tomaré el camino difícil para encontrar en el proceso otros códigos más complejos que jamás pudiese haber imaginado.

Imágenes:
Bueno, estos son algunos juegos que quiero aprender a programar desde cero empleando proyección cónica, los cuales me mantienen motivado para seguir con este tema tan fantástico:

Clásico laberinto de Windows 95


Top Gear snes


Mario Kart Snes

Star fox snes



Cubo a cubo lograremos el objetivo



Nos vemos.



13
Desarrollo de Scripts / point_distance y point_direction
« en: Abril 21, 2021, 04:24:40 am »
Nombre del autor : Reyes Dávila.
Breve descripción de su función : Calcular la distancia  y la dirección entre dos puntos de igual forma que las funciones originales, sin usar las funciones originales.
Versión GM utilizada : Game maker 4.3c (March 4, 2003) hasta la Game Maker htm5.

Código del script:
point_direction_plus(x1,y1,x2,y2)
///point_direction_plus(x1,y1,x2,y2)
//Obteniendo argumentos iniciales
//X1 y Y1 representan el origen o el objeto origen del cual se quiere
//tomar la dirección.
x1=argument0;
y1=argument1;
x2=argument2;
y2=argument3;

//Determinando las medidas entre puntos (no es la distancia entre puntos)
//No es más que el valor absoluto de la resta de los valores en X y Y.
//en otras palabras estamos calculando las longitudes de los catetos de
//un triángulo rectángulo, para luego poder emplear el teorema de pitagoras.
medidaX=abs(x1-x2); //medida en X
medidaY=abs(y1-y2); //medida en Y

//Calculando la dirección:
//Verificando que la longitud o medida X nunca llegue a cero para evitar error en la división.
//Si la medida llegara a cero se produciría un error de división, es
//por eso que cuando la medida X llega a cero se tomará un valor muy
//cercano a cero, pero nunca cero.
if(medidaX=0){medidaX=0.0005}

//Calculando el arco tangente de la división de la medida Y
//entre la medida X, esto es solo la formula trigonométrica que se
//utiliza para determinar el ángulo de un triángulo rectángulo.
angulo1=arctan(medidaY/medidaX);

//Pasando radianes a ángulo
//Como el resultado anterior es devuelto en radianes se
//utiliza la siguiente función para pasarlo a grados.
//Hay muchas formas de pasar radianes a grados:
//Usando la función radtodeg de la siguiente forma:
//angulo1=radtodeg(angulo1);
//O tambien podemos multiplicar radianes por 57.296 (ya
//que un radian son 57.296 grados) de la siguiente manera:
//angulo1=angulo1*57.296
//Yo prefiero la que no usa funciones del game maker.
angulo1=angulo1*57.296;

//Determinando el cuadrante del plano en donde se encuentra el punto (x2,y2).
//La fórmula anterior funciona correctamente solo para el cuadrante I del plano,
//es por eso que deben crearse condiciones para poder ajustar los valores
//según el cuadrante en donde se encuentre el punto.
cuadrante="";
if(x1 <= x2 && y1 >= y2){cuadrante="I"}
if(x1 >= x2 && y1 >= y2){cuadrante="II"}
if(x1 >= x2 && y1 <= y2){cuadrante="III"}
if(x1 <= x2 && y1 <= y2){cuadrante="IV"}

//Ajustando los valores según el cuadrante
//Según en donde se encuentre el punto en el plano, se sumarán o restarán
//los grados necesarios para poder obtener los grados correctos.

if(cuadrante="I"){angulo1=angulo1}
if(cuadrante="II"){angulo1=180-angulo1}
if(cuadrante="III"){angulo1=180+angulo1}
if(cuadrante="IV"){angulo1=360-angulo1}

//Devolviendo la dirección entre los puntos en grados.
return angulo1;


point_distance_plus(x1,y1,x2,y2)
///point_distance_plus(x1,y1,x2,y2)
//Obteniendo argumentos iniciales
//X1 y Y1 representan el origen o el objeto origen del cual se quiere
//tomar la distancia.
x1=argument0;
y1=argument1;
x2=argument2;
y2=argument3;

//Determinando las medidas entre puntos (no es la distancia entre puntos)
//No es más que el valor absoluto de la resta de los valores en X y Y.
//en otras palabras estamos calculando las longitudes de los catetos de
//un triángulo rectángulo.
medidaX=abs(x1-x2); //medida en X
medidaY=abs(y1-y2); //medida en Y

//Calculando la distancia
//El teorema de Pitágoras
//Si a y b son las longitudes de los catetos de un
//triángulo rectángulo y c es la longitud de la hipotenusa,
//entonces la suma de los cuadrados de las longitudes de los
//catetos es igual al cuadrado de la longitud de la hipotenusa.
distancia=power(medidaX,2)+power(medidaY,2)
distancia=sqrt(distancia);

//Devolviendo la distancia
return distancia;


Modo de uso: se emplean igual que las funciones originales “point_direction” y “point_distance”.
Fueron creadas para ser utilizadas si fallaren las funciones originales al exportar a alguna plataforma y también para que sirvan de guía a la hora de comprender cómo calculan la distancia y la dirección.

Imágenes que utilicé para entender el procedimiento



Bibliografías consultadas

Calcular ángulos
https://es.wikihow.com/calcular-%C3%A1ngulos

TRIANGULO ISÓSELES
https://es.wikipedia.org/wiki/Tri%C3%A1ngulo_is%C3%B3sceles

El teorema de Pitágoras
https://www.montereyinstitute.org/courses/DevelopmentalMath/TEXTGROUP-1-8_RESOURCE/U07_L1_T4_text_final_es.html

14
General / Mensaje de hoy
« en: Enero 19, 2021, 01:39:21 pm »

Martes 19 de enero del 2021

Imagen recomendada: pixabay- AnnaliseArt / 8318 images



Color recomendado: Violeta
Pixabay - bngdesigner / 43 images



Frase: Buenos días Francia.

Mensaje:
Te has descubierto un nuevo talento y hoy debes aplicarlo, no dejes que baje tu autoestima y apresúrate en volverla a subir, bien sabes que con tu alegría podrás ayudar  a muchos y es tu responsabilidad transmitir la buena energía que Dios te ha dado hoy. Vas por buen camino para conseguir las cosas buenas que deseas y tú lo sabes.

Versículo:
Proverbios 17:22 Un corazón que está gozoso hace bien como sanador, pero un espíritu que esta herido seca los huesos.

Músicas y videos recomendados para este día:

Música francesa de café - Música romántica francesa de acordeón y Jazz - Buenos días, Francia


Me voy a comer el mundo - París


Louane - jour 1 (español - francés)






15
General / Anécdota Advengers
« en: Enero 17, 2021, 05:23:38 am »
Anécdota Advengers



Advertencia:

Esto es una opinión personal sobre una anécdota que tuve mientras estábamos en la moda Advengers.


Explota Moda adverngers:

Surge la moda Advenger y todo el mundo estaba hablando de esas películas, de cuan sorprendente eran. Yo, no había visto ninguna de esas películas  y me parecía extraño que muchos compañeros hablaban en cada momento sobre los temas relacionados a Advengers, estaba un poco molesto por tanta propaganda que le hacían pero en el fondo quería ver alguna de esas películas.


Youtube y los sorprendentes trailers.

Estaban promocionando la última película de advengers y vi los tráiler una y otra vez tratando de percibir y comprender la composición artística que había hecho tan interesante a esa película, solo encontré algunas emociones y sentimientos plasmados en esos geniales y sorprendentes trailes. Aquí les dejo el traile.




El día del cine:

Cuando vi la película por primera vez,  aparece en las primeras escenas un hombre corpulento con cara morada (Thanos, el villano) que se encuentra cosechando su alimento en un ambiente natural bastante agradable pero está un poco enfermo, carece de recursos económicos se parece a un campesino que ha logrado estar en harmonía con la naturaleza y a los pocos minutos, los héroes invaden su humilde hogar y sin pensarlo dos veces le quitan la vida.





Bueno, adiós.


Páginas: 1 2 3 4

Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0