Creador:
El script original es de HelpTheWretched.
Las modificaciones son mias.
Versión:
Debiese funcionar en cualquier versión de Game Maker que cuente con las funciones de strings. Estimo -sin mirar los manuales- que ésto abarca desde Game Maker 4 hasta 8.1.
Breve explicación
explode() es una función presente en muchos lenguajes, como javascript o php, y sirve básicamente para convertir una string compuesta por dos o más valores separados por un caracter en un array ordenado.
Por ejemplo, explode convertiría la siguiente string
"24,48,36,2,8"
en el siguiente array:
array[0] = 24;
array[1] = 48;
array[2] = 36;
array[3] = 2;
array[4] = 8;
Game Maker no cuenta con una función explode(), y hace un tiempo necesitaba un script que cumpliese ésa función. Me dió pereza hacer uno yo mismo, y encontré uno programado por HelpTheWretched, posteado en la GMC. El problema era que utilizaba la funesta función variable_local_array_set para ingresar los valores al array. No siendo muy entusiasta de ésa familia de funciones, y dándome cuenta que es un poco difícil programar una función explode sin hacer cosas sucias, decidí modificar el script para que no las utilizase.
A continación les ofrezco el script modificado :)
Uso
explode(n,substr,str);
n = la posición del valor a devolver (0 el primer valor, 1 el segundo, etc.)
substr = el caracter o el string a utilizar como separador de cada valor (por ejemplo, ",")
str = la string que contiene los valores (por ejemplo, "4,8,12")
El script
var seps, substr, str;
seps = string_count(argument1,argument2);
if (argument0 > seps)
{
return "-1";
}
else
{
for (i=0; i<seps+1; i+=1) {
if (i < seps)
{
substr[i] = string_copy(argument2,1,string_pos(argument1,argument2)-1);
}
else
{
substr[i] = argument2;
}
argument2 = string_delete(argument2,1,string_length(string(substr[i])+string(argument1)));
}
return (substr[argument0]);
}
El script sólo devuelve un valor, asignado a través del primer argumento. Para ingresar todos los valores en un array, ésta función debe ser puesta dentro de un ciclo for. A continuación, un ejemplo de ésta función utilizada.
var array, string;
string = "Hola,Esto,Es,Una,String";
for (n = 0; n < (string_count(",",string)); n += 1)
{
string[n] = explode(n, ",", string); /*El ciclo for asigna el n-avo valor dentro de string al elemento del array con índice n.*/
}
show_message(string[4]); //Ésto debiese mostrar un mensaje que diga "String".
Como se pueden dar cuenta, el script no funciona exactamente como en otros lenguajes, pero cumple su cometido sin recurrir a funciones lentas y obsoletas.
Ojalá les sea útil en sus proyectos :)
hola buenas , muy interesante y muy util tu script , pero no lo he podido arrancar :C me sale error al ejecutarlo con los scripts que colocaste
Ni idea qué podrá ser... Quizás si lo estás ejecutando en GM:Studio puede ser que no funcione de forma correcta. Yo probé éste script en GM 7 y 8 y en ambos funciona de forma correcta, hasta donde recuerdo.
Por cierto, las últimas versiones de GM:S permiten devolver arrays en un return, así que lo voy a actualizar un poco:
Esta versión sólo funciona en GM:S, procura estar trabajando desde la última versión disponible para que los resultados funcionen de forma correcta.
Ok, algunos cambios en los argumentos.
explode(separator, string);
separator es el string a ocupar como separador.
string es el string a separar.
La función devuelve un array.
///explode(separator, string);
var i, str, separator, seps, substr;
str = argument[1];
separator = argument[0];
seps = string_count(separator, str);
if (seps == 0)
{
substr[0] = str;
return substr;
}
else
{
for (i = 0; i < (seps + 1); i++)
{
if (i < seps)
{
substr[i] = string_copy(str, 1, string_pos(str,separator)-1);
}
else
{
substr[i] = str;
}
str = string_delete(str, 1, string_length(string(substr[i])+string(sep)));
}
return substr;
}
Y usando el mismo código de antes, el siguiente ejemplo
var array, string;
string = "Hola,Esto,Es,Una,String";
array = explode(",", string);
}
show_message(array[4]); //Ésto debiese mostrar un mensaje que diga "String".
No lo he probado aún, pero apenas pueda lo pruebo. Si sigue mostrándote un error, envíame un mensaje privado y te contesto por ahí. :)
Saludos.