Così mi sono costruito un metodo forse un po' macchinoso ma decisamente efficace che vi illustro subito:
innanzi tutto creiamo uno script script_execute_delayed :
Codice: Seleziona tutto
///script_execute_delayed( position, delay_seconds, function, arg0, arg1, arg2, ...);
var time = argument[1]*room_speed;
if(argument[1] == 0){
time = 1;
}
with(instance_create(0,0,obj_delay_function)){
if(!is_undefined(argument[0])){
position = argument[0];
}
alarm[0] = time;
script = argument[2];
for(var i = 3; i < argument_count; i++){
_argument[i-3] = argument[i];
}
}
position, ovvero il riferimento (id di istanza o oggetto) all'interno del quale verrà eseguito lo script.
delay_seconds, ovvero il numero di secondi di ritardo rispetto all'esecuzione della funzione (per me è comodo così, ma se volete potete usare millisecondi o cicli step).
function, che è ovviamente la funzione da eseguire
arg0, arg1, ... gli argomenti vari da passare alla funzione (diciamo da zero a molti).
Ora se vedete com'è fatto lo script, il tutto viene gestito attraverso la creazione di un fantomatico oggetto obj_delay_function
obj_delay_function è un oggetto invisibile e senza sprite con al suo interno solo un evento create e il famigerato alarm[0] che non mi piace ma che essendo wrappato dallo scipt non da più di tanto fastidio.
nel create dove dichiaro le variabili derivate dallo script:
Codice: Seleziona tutto
position = undefined;
script = undefined;
_argument = undefined;
Codice: Seleziona tutto
var _scr, _arg;
_scr = script;
_arg = _argument;
if(is_undefined(position)){
position = id;
}
with(position){
if(_arg != undefined){
switch(array_length_1d(_arg)){
case 1:
script_execute(_scr,_arg[0]);
break;
case 2:
script_execute(_scr,_arg[0],_arg[1]);
break;
case 3:
script_execute(_scr,_arg[0],_arg[1],_arg[2]);
break;
case 4:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3]);
break;
case 5:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4]);
break;
case 6:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4],_arg[5]);
break;
case 7:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4],_arg[5],_arg[6]);
break;
case 8:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4],_arg[5],_arg[6],_arg[7]);
break;
case 9:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4],_arg[5],_arg[6],_arg[7],_arg[8]);
break;
case 10:
script_execute(_scr,_arg[0],_arg[1],_arg[2],_arg[3],_arg[4],_arg[5],_arg[6],_arg[7],_arg[8],_arg[9]);
break;
}
} else {
script_execute(_scr);
}
}
instance_destroy();
comunque l'effetto finale è molto bello, quando scrivo script_execute_delayed(this,2,stampa,"ciao mondo") provo una gran soddisfazione.