Visto che le funzioni ds_* di game maker sono un'esclusiva della pro, ho pensato di strizzare l'occhio a chi utilizza gm lite (ma non necessariamente) implementando un paio di funzioni utili per la gestione di array. Si tratta di una funzione che mescola a caso i valori di un'array, e una funzione che ordina gli elementi di un array.
Gli algoritmi utilizzati dovrebbero essere piuttosto veloci, purtroppo però immagino che ci siano problemi di performance dovuti al fatto che non si puo passare array agli script di gm se non indicando il nome come stringa (che viene poi interpretata al volo, generalmente un'operazione lenta)
array_shuffle
Riordina a caso gli elementi di un'array
Spoiler
Codice: Seleziona tutto
//Prende come argomento il nome di un array in stringa e la sua grandezza, e mescola i valori
//argomenti: nome_array,dimensione_array
var array,size,i,rnd,temp;
array = argument0;
size = argument1;
for(i=0;i<size;i+=1) {
rnd = floor(random(size-i))+i;
temp = variable_local_array_get(array,i);
variable_local_array_set(array,i,variable_local_array_get(array,rnd));
variable_local_array_set(array,rnd,temp);
}
array_sort
Ordina gli elementi di un array in modo ascendente (stringhe o numeri, non funziona con array misti) utilizzando l'algoritmo quicksort. La funzione necessita dello script array_partition.
Spoiler
Codice: Seleziona tutto
//Ordina un array in modo ascendente. Prende come argomenti il nome dell'array in stringa
//e la sua dimensione - 1 .
//argomenti: nome_array,dimensione-1
var array,lo,hi,pivot;
array = argument0;
lo = argument2;
hi = argument1;
if(lo < hi) {
pivot = array_partition(array,hi,lo);
array_sort(array,pivot-1,lo);
array_sort(array,hi,pivot+1);
}
array_partition
funzione utilizzata in array_sort
Codice: Seleziona tutto
var array,i,j,pivot,lo,hi,temp;
array = argument0;
lo = argument2;
hi = argument1;
pivot = variable_local_array_get(array,hi);
i = lo - 1;
for(j=lo;j<hi;j+=1) {
if(variable_local_array_get(array,j) <= pivot) {
i += 1;
temp = variable_local_array_get(array,i);
variable_local_array_set(array,i,variable_local_array_get(array,j));
variable_local_array_set(array,j,temp);
}
}
temp = variable_local_array_get(array,i+1);
variable_local_array_set(array,i+1,variable_local_array_get(array,hi));
variable_local_array_set(array,hi,temp);
return i+1;