Mostrar Mensajes

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

Mensajes - dixon

61
Hola, gusto en salidarlo...

Cambia el numero uno "1" por la letra v. En tu script estas usando la letra v para definir velocidad y posiblemente la velocidad de movimiento sea mayor que uno, por lo tanto la distancia de colision no debería se uno sinó que debería ser mayor que la velocidad o igual.

Te quedaría algo como esto:

if keyboard_check(vk_right) && place_free(x+v,y)
{
direction = 0;
speed = v;
}

if keyboard_check(vk_up) && place_free(x,y-v)
{
direction = 90;
speed = v;
}   

if keyboard_check(vk_left) && place_free(x-v,y)
{
direction = 180;
speed = v;
}

if keyboard_check(vk_down) && place_free(x,y+v)
{
direction = 270;
speed = v;
}



Para moverte diagonalmente puedes sumarle o restarle 45 grados a las direcciones, dependiendo de la tecla que se presione, ejemplo:

if keyboard_check(vk_right) && place_free(x+v,y)
{
direction = 0;
if (keyboard_check(vk_up)) {diection=direction+45}
speed = v;
}

62
Desarrollo de Scripts / tabla_array_ini(tabla_string);
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:


///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:

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.

63
Desarrollo de Scripts / draw_button_plus
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

//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:

draw_button_plus_create=1;

5. Luego en el evento DRAW deberán colocar:

//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:

//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:

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:

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:

draw_button_plus("Ver,10,10")

64
Hola, gusto en saludarlo camarada.






Nunca había escuchado en el GML la palabra semilla y si intento relacionar las semillas con game maker mi mente solo dibuja a Mario Bros recogiendo una  hortaliza llamada nabo la cual se siembra con semillas.






No conocía la palabra semilla aleatoria ahora lo entiendo:
https://es.wikipedia.org/wiki/Semilla_aleatoria

Aquí hay una función para game maker studio 2 que emplea ese concepto:
https://manual-es.yoyogames.com/GameMaker_Language/GML_Reference/Maths_And_Numbers/Number_Functions/random_get_seed.htm

Yo, también tuve problemas con el random, ya que no funcionaba  en juegos html5 hasta que se reiniciaba el juego. Estas son algunas  soluciones planteadas:

1.   Obtener los últimos números del current_time.
Bueno, la variable current_time que indica el tiempo de ejecución del sistema, siempre tendrá números diferentes en en tiempo, por lo tanto se pudiesen tomar sus últimos dígitos para obtener un numero aleatorio. Luego pudieses multiplicarlos por otro numero y producir algo más random.

2.   Dejarle el trabajo a php:
Para eso game maker se tendría que comunicar con un código php para que este le devuelva un numero aleatorio sin problemas, pero solo funcionaria si hay internet. Voy a trabajar en eso.

3.   Pedirle ayuda al cmd de Windows, (para juegos en Windows).
Crear un script que cree un fichero tipo bath (.bat), el cual tenga los códigos necesarios para generar un numero aleatorio mediante el lenguaje del Msdos y que este devuelva un numero aleatorio para game maker.


También estos métodos funcionarían para crear una larga lista de números aleatorios los cuales pudiesen emplearse para crear mundos aleatorios.
65
Hola, gusto en saludarlos:


Al final de este post se encuentra la ultima versión del código de joysticks táctiles para juegos html5.



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
66
Hola, gusto en saludarlos.

Aquí les traigo la actualización 4 de este juego y estos fueron los principales cambios:

1.   Dificultad: Se reguló un poco la dificultad como me aconsejó nuestro amigo Marth.
2.   Reproducción de partida: Ahora podemos ver la jugada de los players que entren en el top 10.
3.   Ajuste de score: Se ajustó un poco el score para poder competir con nuestro amigo AlexWood XD.


Bueno adiós nos vemos.

67
Preguntas y respuestas / Re: Variable global
Agosto 06, 2021, 05:04:49 PM
Hola ikaro espero que estes muy bien.






En game maker studio existe una variable llamada "persistent", que puede valer uno o cero. Si un objeto tiene esta variable en 1, el objeto pasará de un room a otro con su misma posición. Si los circulos blancos son objetos entonces colocale en su evento create

[gml]persistent=1;[/gml]

Luego ajusta tu juego para que quede todo perfecto y al finalizar la animación tendrás que destruir a todos tus circulos porque si no lo haces seguirán apareciendo en todos tus rooms, para destruirlas a todas podrás usar el siguiente código dobde obj_circulo_blanco es el nombre de tu objeto circulo.

[gml]with (obj_circulo_blanco)
{
    instance_destroy();
}[/gml]



Bueno, nos vemos, adiós.


68
Preguntas y respuestas / Re: Problemas con HTML5
Agosto 03, 2021, 03:01:36 AM
Hola, amigo Marth.


Bienvenido al mundo html5...... tus problemas acaban de comenzar, jejejeje.  XD


¿Full screen en exploradores?  :o.....Llevo como un año desde que me hice esa misma pregunta y he hecho varios intentos para comprender lo que se debe hacer. Pues ya debes saber que el full screen es con f10 y f11. Pero si decides que quieres un full screen automatico al inicio del juego solo tedigo que es toda una aventura interminable.


La aventura interminable del full screen automático en html5.




1.   Game maker ofrece la opción de agregar un botón para hacer un full screen en exploradores, pero estos botones son fastidiosos y orribles, y si el usuario no los apriera simplemente no tendrá full screen y no generan el full screen automatico.
2.   El problema con el full screen es el siguiente: Google no quiere que sean posibles los fullscreen. Por motivos de seguridad web un full screen puede convertirse en una menaza para los usuarios web ya que un programador malicioso pudiese hacerle un full screen, evitar que use sus dispositivos (raton, teclado, etc...). Por eso google y otros intelectuales informáticos tomaron la decisión de que no fuera posible hacer fullscren automatico, fin.
3.   Bueno de tanto buscar esa solución solo encontré una pequeña pista que me puede conducir a esa respuesta.
4.   Ahora bien, esta es lo último que encontré para hacer un full screen en navegadores, no te asustes por ningún lado mencionan a game maker, tranquilo. https://tutobasico.com/poner-navegador-en-pantalla-completa-con-jquery/


Carta al señor Mart:


Para encontrar el diamante perdido de la fullscreen tendrás que atravesar las fronteras del game maker y llegar  a los bosques tenebrosos de JavaScript y conseguir la espada mágica de Jquery. Primero ve a la provincia de Php hay encontrarás a un aliado llamado http_pos_string, pero ten cuidado porque te asechará un gran enemigo, "la desmotivación". No te podré acompañar porque estoy combatiendo en otra batalla informática para alcanzar la liberación del game maker. Ve  amigo..................que el código te acompañe.
















Aquí podemos ver a Mart en el nivel 5000 con su espada php.






69
Preguntas y respuestas / Re: Problemas con HTML5
Agosto 02, 2021, 05:51:39 PM
Hola Marth, espero que estés bien.

Desde hace algún tiempo me he dedicado a crear juegos html5 y en el proceso me he encontrado con muchos problemas tales como:
1.   Problemas de sonido: La carga de sonido es bastante lenta.
2.   Problemas con funciones: Algunas funciones como string_copy tienen pequeñas diferencias y hay otras que simplemente no trabajan como otras que producen errores.
3.   Problemas con notificación de errores: Hay errores que aparecen en html5 y son difíciles de detectar, muchos de ellos se basan en problemas con funciones.
4.   Problemas de carga de los juegos: Si el juego usa muchas imágenes grandes tardará en cargar.
5.   Problemas con el canvas (área del juego en el explorador).
6.   Problemas con las fuentes de texto: a beses al escalar las imágenes o la view se distorsionan las letras y simplemente se ven muy mal.
7.   Problemas con la función random: He notado que esta función falla hasta que se reinicie el juego, pero debe existir alguna solución..... ha ya se quizás alguna ayuda de php.
Un juego puede correr muy bien en Windows y muy mal en html5.
Recomendaciones:
1.   Crea un "loading" que aparezca al iniciar el juego para que detecte si ya ha cargado completamente y luego que inicie el juego.
2.   Existen 2 grupos de funciones para controlar el mouse, las que conocen todos los mortales (mouse_check_button(mb_left)...) y las otras que se basan en el multi touch (funciones para detectar más de un mouse), quizás estas últimas puedan corregir el error.
3.   En cuanto al sonido también existen os grupos de funciones, las normales y las actuales.

Por mi parte al programar en html5 creo imágenes muy pequeñas y no les coloco sonido para que el juego cargue inmediatamente, no tengo idea de como programar un "loadin" de carga pero creo que es posible.











Bueno eso es todo te deseo las muchas de las mejores suertes y felicidades, amigo.





Por cierto si ganas me invitas a Madrid, quiero conocer a Veronica zumalacárregui.  XD


Veronica zumalacárregui del progama "Me voy a comer el mundo".

70
Hola, gusto en saludarlo.

la función que usted busca es:

keyboard_check_pressed( key );

En key colocarás la tecla que vas a usar, y obtendrás algo como esto
[gml]
if(keyboard_check_pressed( vk_space ))
{
// función a realizar.
}
[/gml]

Aqui puedes descargar el manual de game maker studio 2 en español el cual te ayudará a comprender esas funciones, para usarlo debes descargar el archivo, abrir la carpeta y abrir el archivo index.html
http://www.mediafire.com/file/z2ym96s5pdiz1y8/GMS2_Spanish-master.zip/file
71
Desarrollo de Scripts / ip_admin.php
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









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=';
*/
?>

';


72
Hola Marth, saludos.  :-[

Mi principal deseo era actualizar el post original pero como tiene su historia se me hiso imposible alterarlo.

En cuanto a la dificultad, no pensaba que fuera tan difícil, pero ya veo que hasta la hora nadie ha entrado ni al último nivel del score. Yo trato de no jugarlo para no entrar en el score porque eso aumentaría la dificultad, lo jugaré solo si alguien sube al primer puesto. La montaña colosal del inicio la estaba utilizando para testear al momento de programar, pero entre tantas actividades no consideré necesario quitarla, pero ahora comprendo.... Admito que tienes razón, sería bueno regular la dificultad y que esta aumente poco a poco.

Lo que en verdad quiero es dejarlo como está, con sus defectos y finalizar su programación, para pronto comenzar a crear un nuevo juego desde cero basado en este, donde pueda aplicar tus consejos agregándole nuevas ideas y otras cosas interesantes que no le pude programar a este.

Gracias por el feedback. ;D
73
Juegos completos / La carreta precisa + score online
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

74
Desarrollo de Scripts / highscore_online instantaneo
Julio 24, 2021, 11:43:08 AM
Nombre del autor : Reyes Dávila.
Breve descripción de su función : Habilitar highcore online.
Versión GM utilizada : Game Maker studio 1.4 y studio 2
Versión del script: 4


Solo copien el siguiente script y adquirirán highcore_online instantáneamente.




/*
Instrucciones:
1. Este script debe ser llamado: highscore_online;
2. En game maker studio 2 utilizar: function highscore_online(argument0,argument1){
3. Reemplazar el id del script ejemplo: global.highscore_id_DXNS0005="WXP2F05056";
4. Colocar en evento Asynchronous - http: highscore_online("http","");
5. Para agregar nuevo score: highscore_online(nombre,puntaje);
6. Para actualizar el highscore: highscore_online("get","");
7. Para borrar todo el highscore: highscore_online("clear","");
*/

//Es importante cambiar el valor de la siguiente variable:
global.highscore_id_DXNS0005="XJ5327843wxp2f";

if(argument0="http")
{
    ini_open_from_string(ds_map_find_value(async_load,"result"));
    if(ini_section_exists("score_1"))
    {
        highscore_clear();
        for(i_DXNS0005=1;i_DXNS0005<=10;i_DXNS0005+=1)
        {
            str_DXNS0005=ini_read_string("score_"+string(i_DXNS0005),"nombre","<nobody>");
            numb_DXNS0005=ini_read_real("score_"+string(i_DXNS0005),"puntaje",0);
            highscore_add(str_DXNS0005,numb_DXNS0005);
        }
    }
    ini_close();
}
else
{
    str_DXNS0005 = "highscore_id="+string(global.highscore_id_DXNS0005)+"&nombre="+string(argument0)+"&puntaje="+string(argument1);
    http_post_string("http://estudiosistemas.infinityfreeapp.com/Dixon/web/highscore_online/highscore_online.php",str_DXNS0005);
}

75
Juegos completos / Re: La carreta precisa
Julio 04, 2021, 09:44:39 PM
Hola un gusto en saludarlos, otra vez.





   La carreta precisa v2   




Jugar desde la siguiente web
Para todas las plataformas.
bit.ly/la_carreta_precisa


Más información:
Hoy he venido a compartir con ustedes la primera actualización de este juego llamado "la carreta precisa", mi objetivo era crear un juego que se pudiese ejecutar en todos los game makers y que fuera fácil de armar y cuyos recursos fueran fáciles de obtener.

COMPATIBILIDAD: el juego podrá ejecutarse en cualquier Game Maker desde la versión 4 del año 2000 hasta la actual game maker studio 2.
MULTIPLATAFORMA: el juego podrá exportarse a cualquier plataforma.
ARMABILIDAD: El juego puede armase fácilmente siguiendo los siguienes pasos.

Para armar este juego necesitas:

Materiales:

1.   Dos sprites, son las dos imágenes llamadas: sprite0 y sprite1
sprite0
sprite1

2.   El script: es el código llamado "script";
3.   Cualquier game maker superior a la versión 3.3 (April 3, 2001), se incluye la versión 4.

Instrucciones:

a.   Abre tu game maker.
a.   Cargar el sprite0, el cual debe ser llamado "sprite0".
b.   Cargar el sprite1, el cual debe ser llamado "sprite1".
c.   Crear un objeto.
d.   Crear una room con un tamaño de 320x240.
e.   Colocar el objeto en cualquier parte de la room.
f.   Colocar en el evento draw (dibujo) del objeto, el siguiente script:


Script que controla todo el juego:


//Simulando el evento create con la variable direction
if(direction=0)
{
//highscore_clear();
font_size=12;
//font_name="Arial";

if(highscore_value(1)=0)
{
highscore_add("Viajes pokémon",5500);
highscore_add("Festival de Cannes",3542);
highscore_add("Tom Holland",3339);
highscore_add("El sr d los Anillos",3332);
highscore_add("NFT y criptoarte",1078);
highscore_add("The Game of Life",896);
highscore_add("Princesa Diana",789);
highscore_add("Huracán Elsa",492);
highscore_add("Vehículo Tesla",448);
highscore_add("COVID-19",200);
}
//Para el objeto mapa
sprite_index=sprite0;
x=0;
y=0;
image_index=0;
image_speed=0;
mapa_activo=0;
click_time=0;
secuencia_image=1;//secuencia de imagenes
estado="portada";//Estado del juego
show_score=0;
velocidad=1;

//Para el mapa
idmap0_x=x;
idmap0_y=y;
idmap0_image=image_index;
ancho_mapa=319;

//Para el mapa 2
idmap1_x=idmap0_x+320;
idmap1_y=y;
idmap1_image=1+floor(random(image_number-1));
idmap1_image=11;

//Para el objeto player
idman_x=149;
idman_y=143;
idman_image=0;
idman_image_inicio=0;
idman_image_final=3;

//Para la rueda
idrueda_x=80;
idrueda_y=151;
idrueda_image=4;
idrueda_image_inicio=4;
idrueda_image_final=23;
idrueda_direction=0;
idrueda_gravedad=0;

//para el centro de la rueda
idcentro_rueda_x=idrueda_x+20;
idcentro_rueda_y=idrueda_y+20;

//Para la carreta
idcarreta_x=48;
idcarreta_y=idrueda_y-32;
idcarreta_image=42;
idcarreta_direction=0;
idcarreta_gravedad=0;

//para el centro de la carreta
idcentro_carreta_x=idcarreta_x+52;
idcentro_carreta_y=idcarreta_y+52;

//Para el titulo
idtitulo_x=90;
idtitulo_y=40;
idtitulo_image=61;

//Para el texto de portada
idtexto_portada_x=100;
idtexto_portada_y=70;
nombre=highscore_name(1);
puntaje=highscore_value(1);
idtexto_texto=string(nombre)+"..."+string(puntaje);

//para el boton comenzar
idcomenzar_x=room_width-64-10;
idcomenzar_y=106;
idcomenzar_image=62;
idcomenzar_estado=0;

//para el boton reiniciar
idreiniciar_x=10;
idreiniciar_y=106+64+10;
idreiniciar_image=64;
idreiniciar_estado=0;

//para el boton TOP 10
idtop10_x=room_width-64-10;
idtop10_y=106+32+10;
idtop10_image=66;
idtop10_estado=0;

//para el boton volver
idvolver_x=5;
idvolver_y=5;
idvolver_image=68;
idvolver_estado=0;

//para la cuerda
idcuerda_x1=idcentro_rueda_x+35*cos(idcarreta_direction*pi/180);
idcuerda_y1=idcentro_rueda_y-35*sin(idcarreta_direction*pi/180);
idcuerda_x2=idman_x+23;
idcuerda_y2=idman_y+13;

//para el punto de colision A
idcoliciona_x=idcentro_rueda_x-36*cos(idcarreta_direction*pi/180);
idcoliciona_y=idcentro_rueda_y+36*sin(idcarreta_direction*pi/180);

//para el punto de colicion con el player;
idcolicion_man_x=idman_x+26;
idcolicion_man_y=idman_y+46;

direction=1
}//fin if(direction=0)



//Evento draw
//Botones a usar
if(keyboard_check(vk_f2)){game_restart()}








//////////////////////////////Juego iniciado
if(estado="juego iniciado")
{
//aumentando velocidad
velocidad+=0.003;

//Para la carreta
//Movimiento y
idcarreta_gravedad+=1;
if(idrueda_gravedad>10){idrueda_gravedad=10}
while((idcarreta_y+idcarreta_gravedad>idrueda_y-32)and (idcarreta_gravedad)){idcarreta_gravedad-=1}

idcarreta_y+=idcarreta_gravedad;
if(idcarreta_y>idrueda_y-32){idcarreta_y=idrueda_y-32;idcarreta_gravedad=0}

//cambiando la direccion de la carreta
if(mouse_y>0 && mouse_y<240)idcarreta_direction=90-floor(mouse_y/6.6)*5;
//Cambiando la imagen de la carreta
if(mouse_y>0 && mouse_y<240){idcarreta_image=42-18+floor(mouse_y/6.6)};

//para el centro de la carreta
idcentro_carreta_x=idcarreta_x+52;
idcentro_carreta_y=idcarreta_y+52;

//para el punto de colision A
idcoliciona_x=idcentro_carreta_x-36*cos(idcarreta_direction*pi/180);
idcoliciona_y=idcentro_carreta_y+36*sin(idcarreta_direction*pi/180);



for(i2=0;i2<=1;i2+=1)
{
if(i2=0){x=idmap0_x;image_index=idmap0_image}
if(i2=1){x=idmap1_x;image_index=idmap1_image}

//Detectando colicion
for(i=0;i<=72;i+=5)
{
posx=idcoliciona_x;
posy=idcoliciona_y;
posx+=i*cos(idcarreta_direction*pi/180);
posy-=i*sin(idcarreta_direction*pi/180);

//Colisionando y finalizando el juego
if((instance_position(posx,posy,0)=id) and (estado="juego iniciado")){estado="game over"}
}


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

/////////////////para la cuerda
idcuerda_x1=idcentro_carreta_x+35*cos(idcarreta_direction*pi/180);
idcuerda_y1=idcentro_carreta_y-35*sin(idcarreta_direction*pi/180);
idcuerda_x2=idman_x+23;
idcuerda_y2=idman_y+13;

}//fin if(estado="juego iniciado")
/////////////////////////////////////////////////////////////////////


//////////////////////////////Juego iniciado
if(estado="juego iniciado"){

//sumando puntos;
score+=1;

//Para los mapas
if(idmap0_x>idmap1_x){idmap1_x-=velocidad;idmap0_x=idmap1_x+ancho_mapa}
if(idmap1_x>idmap0_x){idmap0_x-=velocidad;idmap1_x=idmap0_x+ancho_mapa}
if(idmap0_x<-ancho_mapa){idmap0_x=idmap1_x+ancho_mapa;idmap0_image=1+floor(random(image_number-1))}
if(idmap1_x<-ancho_mapa){idmap1_x=idmap0_x+ancho_mapa;idmap1_image=1+floor(random(image_number-1))}









//Para La rueda
//Movimiento y
idrueda_gravedad+=2;
if(idrueda_gravedad>10){idrueda_gravedad=10}

//Para el player
//Movimiento y
vs=5






////////////////////////////////////Duplicando la posicion del objeto
for(i2=0;i2<=1;i2+=1)
{
if(i2=0){x=idmap0_x;image_index=idmap0_image}
if(i2=1){x=idmap1_x;image_index=idmap1_image}


//Para el player
//para el punto de colicion con el player;
idcolicion_man_x=idman_x+26;
idcolicion_man_y=idman_y+46;

//Movimiento y

while((instance_position(idcolicion_man_x,idcolicion_man_y+vs,0)=id)and vs){vs-=1}
idman_y+=vs;

while(instance_position(idcolicion_man_x,idcolicion_man_y,0)=id)
{
idman_y-=1;
//para el punto de colicion con el player;
idcolicion_man_x=idman_x+26;
idcolicion_man_y=idman_y+46;
}


//Para La rueda
//Movimiento y

idrueda_direction-=(1+velocidad);
if(idrueda_direction>360){idrueda_direction-=360}
if(idrueda_direction<0){idrueda_direction+=360}

posx=0;
posy=0;
for(i=0;i<360;i+=5)
{
direction_ram=(idrueda_direction+i-15);
//if(direction_ram>360){direction_ram-=360}
//if(direction_ram<0){direction_ram+=360}

dis=28;
if(frac(i/180)=0){dis=30}

posx=idcentro_rueda_x+dis*cos(direction_ram*pi/180);
posy=idcentro_rueda_y-dis*sin(direction_ram*pi/180);

while(instance_position(posx,posy,0)=id)
{
idrueda_y-=1;
//para el centro de la rueda
idcentro_rueda_x=idrueda_x+20;
idcentro_rueda_y=idrueda_y+20;
posx=idcentro_rueda_x+dis*cos(direction_ram*pi/180);
posy=idcentro_rueda_y-dis*sin(direction_ram*pi/180);
}

//if(frac(i/120)=0)
//if(dis=27 and i2=0)
{
//draw_circle(posx,posy,2);
//draw_line(idcentro_rueda_x,idcentro_rueda_y,posx,posy);
}

while((instance_position(posx,posy,0)=id) and (idrueda_gravedad))
{
//gravedad
idrueda_gravedad-=1;
}

}// fin for(i=0;i<360;i+=5)






}//fin for(i2=0;i2<=1;i2+=1)
////////////////////////////////////////Fin Duplicando la posicion del objeto


idrueda_y+=idrueda_gravedad;

//para el centro de la rueda
idcentro_rueda_x=idrueda_x+20;
idcentro_rueda_y=idrueda_y+20;

////////////////secuencia de imagenes
//Para la rueda
idrueda_image=idrueda_image_inicio+floor(idrueda_direction/18);
idman_image+=0.2;
//para el hombre
if(idman_image>idman_image_final){idman_image=idman_image_inicio}
/////////////Fin secuencia de imagenes

}//fin if(estado="juego iniciado")
/////////////////////////////////////////////////////////////////////













//////////////////////////////////////Seccion de dibujos
//Dibujando objetos



c1=(estado!="top 10");
if(c1)
{
//dibujando el mapa 1
draw_sprite(sprite_index,idmap0_image,idmap0_x,idmap0_y);
//dibujando el mapa 2
draw_sprite(sprite_index,idmap1_image,idmap1_x,idmap1_y);
//dibujando cuerda
draw_line(idcuerda_x1,idcuerda_y1,idcuerda_x2,idcuerda_y2);
//dibujando el player
draw_sprite(sprite1,idman_image,idman_x,idman_y);
//dibujando la carreta
draw_sprite(sprite1,idcarreta_image,idcarreta_x,idcarreta_y);
//dibujando la rueda
draw_sprite(sprite1,idrueda_image,idrueda_x,idrueda_y);
}





bloquear='
///Para la carreta
for(i=0;i<=72;i+=5)
{

posx=idcoliciona_x;
posy=idcoliciona_y;
posx+=i*cos(idcarreta_direction*pi/180);
posy-=i*sin(idcarreta_direction*pi/180);
draw_circle(posx,posy,2);
}
draw_circle(idcentro_carreta_x,idcentro_carreta_y,2);
//'





//dibujando score
c1=(estado="juego iniciado");
c2=(estado="game over");
if(c1 || c2){draw_text(280,10,score)}


///////////////////////////////Dibujos de portada
if(estado="portada")
{

//controlando botones
click=0;
click_id="";

//dibujando boton comenzar
boton_id="comenzar";
boton_x=idcomenzar_x;
boton_y=idcomenzar_y;
boton_image=idcomenzar_image;
boton_estado=idcomenzar_estado;

c1=(mouse_x>boton_x);
c2=(mouse_x<boton_x+64);
c3=(mouse_y>boton_y);
c4=(mouse_y<boton_y+32);
c5=(c1 and c2 and c3 and c4);
if(c5){boton_estado=1;click=1;click_id=boton_id}else{boton_estado=0}
draw_sprite(sprite1,boton_image+boton_estado,boton_x,boton_y);


//dibujando boton top 10
boton_id="top 10";
boton_x=idtop10_x;
boton_y=idtop10_y;
boton_image=idtop10_image;
boton_estado=idtop10_estado;

c1=(mouse_x>boton_x);
c2=(mouse_x<boton_x+64);
c3=(mouse_y>boton_y);
c4=(mouse_y<boton_y+32);
c5=(c1 and c2 and c3 and c4);
if(c5){boton_estado=1;click=1;click_id=boton_id}else{boton_estado=0}
draw_sprite(sprite1,boton_image+boton_estado,boton_x,boton_y);

//Al hacer click
if(click)
{
click_time+=1;
if(click_time>10)
{
if(click_id="comenzar"){estado="juego iniciado"}
if(click_id="top 10"){estado="top 10"}
}
}
else
{
click_time=0;
}


//dibujando texto portada
draw_text(idtexto_portada_x,idtexto_portada_y,idtexto_texto);

//dibujando titulo del juego
draw_sprite(sprite1,idtitulo_image,idtitulo_x,idtitulo_y);
}
/////////////////////////////   Fin dibujos de portada



//////////////////////////////Dibujos del top 10
if(estado="top 10")
{
draw_text(85,10,"Los 10 puntos más altos:");
dx=75;
dy=35;

for(i=1;i<=10;i+=1)
{
nombre=highscore_name(i);
puntaje=highscore_value(i);
puntos=".";
texto=string(i)+". "+string(nombre)+" "+string(puntos)+" "+string(puntaje);

while((string_width(texto)>200) and string_length(nombre))
{
nombre=string_delete(nombre,string_length(nombre),1);
texto=string(i)+". "+string(nombre)+" "+string(puntos)+" "+string(puntaje);
}

while(string_width(texto)<200)
{
puntos+=".";
texto=string(i)+". "+string(nombre)+" "+string(puntos)+" "+string(puntaje);

}

while(string_width(texto)>200 and string_length(puntos))
{
puntos=string_delete(puntos,1,1);
texto=string(i)+". "+string(nombre)+" "+string(puntos)+" "+string(puntaje);

}




draw_text(dx,dy,texto);
dy+=20;
}

//controlando botones
click=0;
click_id="";

//dibujando boton volver
boton_id="volver";
boton_x=idvolver_x;
boton_y=idvolver_y;
boton_image=idvolver_image;
boton_estado=idvolver_estado;

c1=(mouse_x>boton_x);
c2=(mouse_x<boton_x+64);
c3=(mouse_y>boton_y);
c4=(mouse_y<boton_y+32);
c5=(c1 and c2 and c3 and c4);
if(c5){boton_estado=1;click=1;click_id=boton_id}else{boton_estado=0}
draw_sprite(sprite1,boton_image+boton_estado,boton_x,boton_y);

//Al hacer click
if(click)
{
click_time+=1;
if(click_time>10)
{
if(click_id="volver")
{
game_restart();
}
}
}
else
{
click_time=0;
}

}//fin if(estado="top 10")



////////////////////////////Dibujos de game over
if(estado="game over")
{
//controlando botones
click=0;
click_id="";

//dibujando boton reiniciar
boton_id="reiniciar";
boton_x=idreiniciar_x;
boton_y=10+idreiniciar_y*(idcentro_carreta_y<100);
boton_image=idreiniciar_image;
boton_estado=idreiniciar_estado;

c1=(mouse_x>boton_x);
c2=(mouse_x<boton_x+64);
c3=(mouse_y>boton_y);
c4=(mouse_y<boton_y+32);
c5=(c1 and c2 and c3 and c4);
if(c5){boton_estado=1;click=1;click_id=boton_id}else{boton_estado=0}
draw_sprite(sprite1,boton_image+boton_estado,boton_x,boton_y);

//Al hacer click
if(click)
{
click_time+=1;
if(click_time>10)
{
if(click_id="reiniciar")
{

if(score>highscore_value(10))
{
mensaje="!Has entrado en el top 10!
Escribe tu nombre:";
nombre=get_string(mensaje,"Anónimo");


c1=(string_length(nombre)>10);
c2=(string_length(nombre)<3);

while(c1 || c2)
{

if(string_length(nombre)>10)
{
mensaje="Los nombres no pueden tener más de 10 caracteres.
Vuelve a intentarlo:";
nombre=get_string(mensaje,nombre);
}

if(string_length(nombre)<3)
{
mensaje="Los nombres no deben tener menos de tres caracteres.
Vuelve a intentarlo:";
nombre=get_string(mensaje,nombre);
}
c1=(string_length(nombre)>10);
c2=(string_length(nombre)<3);
}

highscore_add(nombre,score);
}
game_restart();

}
}
}
else
{
click_time=0;
}
}
////////////////////////////Fin Dibujos de game over

//////////////////Fin seccion de dibujos





//texto
vw00=room_width;
vh00=room_height;
dx=0;
dy=0;
txt="";
ver="txt";

//Posicionar cursor aquí
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
if(ver!='txt'){draw_text(dx,dy,'txt: '+string(txt));dy+=20;if(dy>vh00-20){dy=0;dx+=vw00/2}}
//fin codigo



Desventajas de la primera versión:
1. Presentó algunas fallas en el código.
2. Los pasos para armar el juego eran complicados.
3. La exposición html5 dificultaba la entrada de dispositivos móviles.

Mejoras:
1. Ahora los pasos para armar el juego son fáciles de seguir, evitando la modificación de sprites y el uso de varios objetos.
2. La exposición html5 es más agradable y permite móviles.

Datos técnicos:
1. Se desarrolló un sistema de colisiones que no emplea el place_empty, place_meeting o place_free, el cual está compuesto principalmente por la función instance_position.
2. Al principio se requería el uso de varios objetos (la carreta, la rueda, el hombre, la superficie y el objeto controlador),  Ahora en la room existe un solo objeto sin instancias, el cual se encarga de interpretar todo.
3. Lamentablemente el score no es online, ya que carezco de conocimientos para crear un score online html5.