scr_RoomSave - scr_RoomLoad

Scripts e snippets scritti in GameMaker Language (gml)
Rispondi
Will
Newbie
Messaggi: 27
Iscritto il: 14/10/2013, 18:01
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

scr_RoomSave - scr_RoomLoad

Messaggio da Will »

Salve, vi propongo due script che utilizzo per salvare e caricare le posizioni (x,y) di tutte le instance all'interno della room.

scr_RoomSave( string );

Codice: Seleziona tutto

///scr_RoomSave(String); ( String = <[percorso]+file.ext> )
///scr_RoomSave: numero instance uByte, x instance uWord, y instance uWord

var fileID=file_bin_open(argument0,1), nObj=0, MSBx, lsBx, MSBy, lsBy;      // Dichiarazione variabili ed apertura del file per la scrittura
file_bin_rewrite(fileID);                                                   // se il file esiste viene ricreato vuoto
show_message("Select data for "+argument0);                                 // messaggio di inizio scrittura
while (object_exists(nObj))                                                 // inizio ciclo di scrittura (finchè esistono oggetti da salvare)
{
    if (show_question("Save data for (n."+string(nObj)+") "+object_get_name(nObj)+" x"+string(instance_number(nObj))+"?"))  // richiesta salvataggio oggetto
    {
        file_bin_write_byte(fileID,instance_number(nObj));                                                                  // scrittura numero instance dell'oggetto
        with(nObj)                                                                                                          // inizio ciclo instance dell'oggetto
        {
            MSBx=(x >> 8);                      // calcolo Byte più significativo per la x dell'instance
            lsBx=(x & 255);                     // calcolo Byte meno significativo per la x dell'instance
            file_bin_write_byte(fileID,MSBx);   // scrittura Byte più significativo per la x dell'instance
            file_bin_write_byte(fileID,lsBx);   // scrittura Byte meno significativo per la x dell'instance

            MSBy=(y >> 8);                      // calcolo Byte più significativo per la y dell'instance
            lsBy=(y & 255);                     // calcolo Byte meno significativo per la y dell'instance
            file_bin_write_byte(fileID,MSBy);   // scrittura Byte più significativo per la y dell'instance
            file_bin_write_byte(fileID,lsBy);   // scrittura Byte meno significativo per la y dell'instance
        }
    } else {
        file_bin_write_byte(fileID,0);                                                                                      // scrittura 0 (nessuna instance dell'oggetto verrà salvata)
    }
    nObj++;                                                                                                                 // incremento contatore prossimo oggetto
}                                                                           // fine ciclo di scrittura

file_bin_close(fileID);                                                     // chiusura del file
show_message(argument0+"...Saved!");                                        // messaggio di avvenuto salvataggio
return 1;                                                                   // ritorno al codice
scr_RoomLoad( string );

Codice: Seleziona tutto

///scr_RoomLoad(String); ( String = <[percorso]+file.ext> )
///scr_RoomLoad: numero instance uByte, x instance uWord, y instance uWord

var fileID=file_bin_open(argument0,0), nObj, n, slcObj=0, MSBx, lsBx, MSBy, lsBy;   // Dichiarazione variabili ed apertura del file per la lettura
while (file_bin_position(fileID)<file_bin_size(fileID))                             // inizio ciclo di lettura (finchè non viene raggiunta la fine del file)
{
    nObj=file_bin_read_byte(fileID);                                    // lettura numero instance dell'oggetto
    for (n=1;n<=nObj;n++)                                               // inizio ciclo di lettura delle instance dell'oggetto
    {
        MSBx=(file_bin_read_byte(fileID) << 8);         // lettura Byte più significativo per la x dell'instance
        lsBx=file_bin_read_byte(fileID);                // lettura Byte meno significativo per la x dell'instance
        MSBy=(file_bin_read_byte(fileID) << 8);         // lettura Byte più significativo per la y dell'instance
        lsBy=file_bin_read_byte(fileID);                // lettura Byte meno significativo per la y dell'instance
        instance_create(MSBx+lsBx,MSBy+lsBy,slcObj);    // creazione instance dell'oggetto
    }
    slcObj++;                                                           // incremento contatore prossimo oggetto
}                                                                                   // fine ciclo di lettura

file_bin_close(fileID);                                                             // chiusura del file
return 1;                                                                           // ritorno al codice
Download: http://www.datafilehost.com/d/db141fae (3Kb)

Entrambi gli script accettano, come unico argomento, una stringa contenente il nome del file con eventuale percorso ( [percorso]+file.ext ) e accettano valori di 1 Byte massimo per il numero delle instance di un oggetto e 2 Bytes massimo sia per la x che per la y di ogni instance.
In altre parole, potete salvare un numero massimo di 255 instance per ogni oggetto ed avere cordinate per la x e per la y non superiori a 65535px rispettivamente.
Questi limiti si adattano perfettamente alle mie necessità ma voi potete modificare gli script secondo le vostre.
Spero possano tornare utili a qualcuno. ;)

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti