Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* 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
General / Scripts de otros lenguajes.
« en: Mayo 11, 2022, 07:03:18 pm »
Hola, que tengan un buen día.


Algunos quizás se pregunten ¿para qué necesitamos scripts de otros lenguajes?, la respuesta que considero adecuada: Para romper los límites del game maker y permitir por ejemplo que un juego se ejecute directamente en esta web.

Hay muchos scripts en distintos lenguajes que requieren ser definidos y ajustados. En este post colocaré algunos scripts que considero importantes, de los cuales a  algunos les he dado una apariencia parecida a la de los de game maker.

Para JavaScript: Si empleamos el siguiente código en javascript podremos programar con algunas funciones del game maker.

Código: [Seleccionar]



function random(x)
{
var min = 0;
var max = x;
return Math.random() * (max - min) + min;
}

function abs(x)
{
return Math.abs(x);
}

function sign(x)
{
return Math.sign(x);
}

function floor(x)
{
return Math.trunc(x);
}

function frac(x)
{
int_part = Math.trunc(x); // returns 3
return Number((x-int_part).toFixed(2));
}





function chr(val){
return String.fromCodePoint(val);
}

function ord(str){
return str.charCodeAt();
}

function real(str){
return Number(str)
}

function string(val){
return val.toString()
}

function string_length(str){
return str.length;
}

function string_pos(substr,str){
return str.indexOf(substr)+1;
}

function string_copy(str,index,count){
num=index-1;
return str.substr(num,count);
}

function string_delete(str,index,count){
str1 = str.substr(0, index);
str2 = str.substr(index+count, str.length-count);
str3 = str1+str2;
return str3;
}

function string_insert(substr,str,index){
num=index-1;
return str.slice(0, num) + substr + str.slice(num);
}

function string_replace(str,substr,newstr){
return str.replace(substr,newstr);
}

function string_replace_all(str,substr,newstr){
return str.replaceAll(substr,newstr);
}


function string_count(substr,str)
{
return str.split(substr).length-1;
}


function string_count(substr,str)
{
contador=0;
while(str.includes(substr))
{
str=str.replace(substr,"");
contador+=1;
}
return contador;
}

function string_lower(str)
{
return str.toLowerCase();
}

function string_upper(str)
{
return str.toUpperCase();
}

function string_digits(str)
{
return str.replace(/\D/g,"");
}

function string_letters(str)
{
return str.replace(/\d/g,"");
}

function string_repeat(str,count)
{
return str.repeat(count);
}

function string_lettersdigits(str)
{
return str.replace(/[^a-zA-Z]/g, "");
}





Las funciones habilitadas con el script son:

random(x): Devuelve un número real aleatorio entre 0 y x. El numero es siempre menor que x.
abs(x): Devuelve el valor absoluto de x.
sign(x): Devuelve el signo de x (-1 o 1).
floor(x): Devuelve el piso de x, es decir, x redondeado a un número entero.
frac(x): Devuelve la parte fraccionaria de x, es decir, la parte detrás del punto decimal.

chr(val):Devuelve una cadena que contiene el carácter con código asci val.
ord(str):Devuelve el código asci del primer carácter en str.
real(str):Convierte str en un número real. str puede contener un signo menos, un decimal punto e incluso una parte exponencial.
string(val):Convierte el valor real en una cadena.
string_length(str):Devuelve el número de caracteres de la cadena.
string_pos(substr,str):Devuelve la posición de substr en str (0 = no ocurrencia).
string_copy(str,index,count):Devuelve una subcadena de str, comenzando en índice de posición y de conteo de longitud.
string_delete(str,index,count):Devuelve una copia de str con la parte eliminado que comienza en el índice de posición y tiene un recuento de longitud.
string_insert(substr,str,index):Devuelve una copia de str con substr agregado en el índice de posición.
string_replace(str,substr,newstr):Devuelve una copia de str con la primera ocurrencia de substr reemplazada por newstr.
string_replace_all(str,substr,newstr):Devuelve una copia de str con todos ocurrencias de substr reemplazadas por newstr.
string_count(substr,str):Devuelve el número de apariciones de substr en la cadena
string_lower(str):Devuelve una copia en minúsculas de str.
string_upper(str):Devuelve una copia en mayúsculas de str.
string_repeat(str,count):Devuelve una cadena que consiste en contar copias de str.
string_letters(str):Devuelve una cadena que solo contiene las letras en str.
string_digits(str):Devuelve una cadena que solo contiene los dígitos en str.
string_lettersdigits(str):Devuelve una cadena que contiene las letras y dígitos en str.







2
General / Juegos abandonados
« en: Enero 27, 2022, 07:16:18 pm »
Hola amigos espero que se encuentren bien en este magnifico dia.




Aquí en este post voy a ir colocando los video juegos que he abandonado.





Nombre: Under the Water.

Tiempo aproximado que  se emplearía para su desarrollo de principio a fin por una sola persona: 2 semanas aproximadamente, trabajando unas 5 horas diarias.

Más detalles:
Under the Water es un proyecto de juego inspirado en la música de Aurora Aksnes titulada , lo he abandonado porque actualmente no puedo alcanzar la calidad gráfica mínima  que me he exigido y además de eso la programación interna que requiere es algo exigente aunque el proyecto puede ser concretado en 2 semanas aproximadamente.

Cuando me propongo a crear un video juego lo hago con el objetivo principal de transmitir sentimientos y en este caso el sentimiento es de suspenso y miedo, realmente estoy seguro que si en algún momento logro concretar el proyecto el video juego resultante hará que algunos espectadores sientan una sensación de misterio que roza lo sobrenatural.

Interesados en participar en el proyecto contactarme en el Facebook  https://m.facebook.com/reyes.davila.52459

3
General / Galeria de imagenes
« en: Enero 25, 2022, 12:15:19 am »
Hola saludos, espero que estén muy bien.



Este post va dirigido a la creación de imágenes.

Aqui dejo una web para dibujo verctorial.
https://editor.method.ac/

A continuación un conjunto de imagenes que he creado con paint, gifanimator.exe y game maker.

Citar





























4
Juegos completos / La chica del campamento
« en: Enero 11, 2022, 09:50:46 pm »




5
Juegos completos / 30pepas 😅
« en: Enero 04, 2022, 08:16:10 am »

6
General / fastGame
« en: Diciembre 26, 2021, 02:05:02 am »
Hola saludos cordiales.



Aquí les dejo un video donde se presenta la primera etapa de mi nueva idea para hacer video juegos.





Por ahora mi objetivo es enseñar a hacer video juegos sencillos con materiales reciclados aplicando una técnica fácil.
1.   Primero se hace la maqueta real.
2.   Luego se grava el video.
3.   Se le agregan los efectos de sonido.
4.   Por último se sube a una plataforma online que estoy construyendo la cual no está terminada.
5.   Finalmente se obtiene un video juego muy básico.






Aquí les dejo un bosquejo de un juego que tengo en mente.


chao, nos vemos.

7
General / GAME CGM
« en: Diciembre 11, 2021, 01:53:33 am »



Este juego lo cree gracias al canal Jeff Aporta de youtube, el cual ofrece el siguiente tutorial:

8
General / Crash Orient Express
« en: Diciembre 04, 2021, 04:12:08 am »

9
General / Historias
« en: Noviembre 22, 2021, 03:17:23 am »

10
Desarrollo de Scripts / draw_text_ext_html5(x,y,str,w);
« en: Noviembre 05, 2021, 03:36:22 am »
Autor del script: Reyes Dávila
Nombre del script: draw_text_ext_html5(x,y,str,w);
Breve descripción de su función: Ajusta un texto al ancho indicado al exportar a html5.
Versiones usadas: Game maker html5, debe funcionar en studio.
Version del script: 1

Código del script
Código: [Seleccionar]
//draw_text_ext_html5(x,y,str,w);
//Para crear textos ajustados a un ancho al exportar a html5.
//Serial del script: _WXP2F

posicion_x_WXP2F=argument0;
posicion_y_WXP2F=argument1;
string_x_WXP2F=argument2;
ancho_x_WXP2F=argument3;

length_x_WXP2F=string_length(string_x_WXP2F);
length_x_prev_WXP2F=length_x_WXP2F;
index_WXP2F=1;
count_WXP2F=1;
width_min_WXP2F=string_width("X");
for(i_WXP2F=1;i_WXP2F<=length_x_WXP2F;i_WXP2F+=1)
{

copy_x_WXP2F=string_copy(string_x_WXP2F,index_WXP2F,count_WXP2F);
width_x_WXP2F=string_width(copy_x_WXP2F);

count_x_WXP2F=string_count(" ",copy_x_WXP2F);
c1_WXP2F=(width_x_WXP2F>ancho_x_WXP2F);
c2_WXP2F=(ancho_x_WXP2F>width_min_WXP2F);
c3_WXP2F=(i_WXP2F>1);
c4_WXP2F=(length_x_WXP2F<length_x_prev_WXP2F*2);
c5_WXP2F=(count_x_WXP2F);

if(c1_WXP2F and c2_WXP2F and c3_WXP2F and c4_WXP2F and c5_WXP2F)
{

index_WXP2F=i_WXP2F;count_WXP2F=1;
copy_x2_WXP2F=string_copy(string_x_WXP2F,index_WXP2F,count_WXP2F);
while(copy_x2_WXP2F!=" " and i_WXP2F>2)
    {
        i_WXP2F-=1;
        index_WXP2F=i_WXP2F;count_WXP2F=1;
        copy_x2_WXP2F=string_copy(string_x_WXP2F,index_WXP2F,count_WXP2F);
    }

string_x_WXP2F=string_insert(chr(35),string_x_WXP2F,i_WXP2F+1);
length_x_WXP2F+=1;
index_WXP2F=i_WXP2F+3;
count_WXP2F=0;
}

count_WXP2F+=1;
}

draw_text(posicion_x_WXP2F,posicion_y_WXP2F,string_x_WXP2F);


Detalles:
La función original draw_text_ext(x,y,str,sep,w) no funciona al exportar a html5 por esta causa se ha creado este script como sustituto, el cual en su primera versión no emplea el argumento “sep” que hace referencia a la separación de las líneas.

Mejoras a futuro:
1. Agregar el argumento sep.
2. Correcciones internas.
3. Mejorar precisión.
4. Crear conjunto de script para el control de textos que permita medir el alto de los párrafos con gran precisión al exportar en html5.

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


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


13
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")

14
General / Joystick táctiles para juegos html5 en proceso.
« en: Agosto 13, 2021, 04:04:16 am »
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

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

';



Páginas: 1 2 3 4