Avatar utente
Legend3D
Membro
Messaggi: 59
Iscritto il: 14/12/2008, 22:45
Contatta:

Suoni

Messaggio da Legend3D »

salve sn di nuovo io ^^ ... >.< ho notato che caricando i suoni di formato mp3 il caricamento dell'eseguibile del gioco diventa abbastanza lungo... avevo pensato a cambiare il formato in midi ma penso che la cosa sia abbastanza brutta >.< quindi mi chiedo se esiste altra soluzione per caricare i suoni evitando di appesantire troppo il loading eccetto quello di tenere solo 3 musichette per tt il game grazie ^^
Immagine
LegendDarkDemonDragon

Game Completi:
Spins - Serie1 (2004)
Spins - Serie2 (2004)
Spins 2 - La leggenda della spada sacra (2004-2005)
Spins 3 - Demone guerriero (2006 - 2007)

Game in Corso:
Last Adventure: The Rune's Key
Pring Adventure
sggsoftware
Membro
Messaggi: 178
Iscritto il: 01/07/2007, 15:09
Uso: GM:Studio 2
Località: Sicilia
Contatta:

Re: Suoni

Messaggio da sggsoftware »

Legend3D ha scritto:salve sn di nuovo io ^^ ... >.< ho notato che caricando i suoni di formato mp3 il caricamento dell'eseguibile del gioco diventa abbastanza lungo... avevo pensato a cambiare il formato in midi ma penso che la cosa sia abbastanza brutta >.< quindi mi chiedo se esiste altra soluzione per caricare i suoni evitando di appesantire troppo il loading eccetto quello di tenere solo 3 musichette per tt il game grazie ^^
Sì, la soluzione c'è: invece di includere i suoni nel progetto, ti conviene lasciare i file mp3 sfusi, e caricarli solo quando necessario, utilizzando le funzioni di Game Maker per gestire le risorse.

Crea un suono nel tuo progetto e chiamalo soMusica, ma non caricare alcun file: lascialo vuoto. Poi aggiungi questo script (chiamalo come vuoi, per esempio play_music):

Codice: Seleziona tutto

sound_stop(soMusica);
sound_replace(soMusica,argument0,3,true);
sound_loop(soMusica);
Fatto questo, ogni volta che vuoi riprodurre un file mp3 (e non solo) nel tuo gioco, basta chiamare lo script play_music, passando come parametro il nome del file. Esempio:

Codice: Seleziona tutto

play_music("intro.mp3");
In generale, conviene sempre non includere risorse grandi, e caricarle invece da file esterni quando occorre, in modo da alleggerire il caricamento del gioco (nonchè le dimensioni dell'exe) e occupare meno memoria (che sia memoria video o RAM).
Avatar utente
Legend3D
Membro
Messaggi: 59
Iscritto il: 14/12/2008, 22:45
Contatta:

Re: Suoni

Messaggio da Legend3D »

sggsoftware ha scritto:
Legend3D ha scritto:salve sn di nuovo io ^^ ... >.< ho notato che caricando i suoni di formato mp3 il caricamento dell'eseguibile del gioco diventa abbastanza lungo... avevo pensato a cambiare il formato in midi ma penso che la cosa sia abbastanza brutta >.< quindi mi chiedo se esiste altra soluzione per caricare i suoni evitando di appesantire troppo il loading eccetto quello di tenere solo 3 musichette per tt il game grazie ^^
Sì, la soluzione c'è. Invece di includere i suoni nel progetto, ti conviene lasciare i file MP3 sfusi e caricarli solo quando necessario, utilizzando le funzioni di Game Maker per gestire le risorse.

Crea un suono nel tuo progetto e chiamalo soMusica, ma non caricare alcun file, lascialo vuoto. Poi aggiungi questo script (chiamalo come vuoi, per esempio play_music):

Codice: Seleziona tutto

sound_stop(soMusica);
sound_replace(soMusica,argument0,3,true);
sound_loop(soMusica);
Fatto questo, ogni volta che vuoi riprodurre un file mp3 (e non solo) nel tuo gioco, basta chiamare lo script play_music, passando come parametro il nome del file. Esempio:

Codice: Seleziona tutto

play_music("intro.mp3");
In generale, conviene sempre non includere risorse grandi e caricarle invece da file esterni quando occorre, in modo da alleggerire il caricamento del gioco (nonchè le dimensioni dell'EXE) e occupare meno memoria, che sia memoria video o RAM.
quindi se ho ben capito cosa devo fa:
1) cancello i suoni mp3 che uso come musica sui livelli e creo 1 solo suond soMusica vuoto, poi faccio new script nome e ci metto il codice... quando voglio eseguire una musica metto nell'object che mi crea la musica il codice che me la riproduce dal file giusto? ma i suoni devo tenerli nella stessa cartella dove sta il progetto del gioco no?
si ok funziona ma ora sorge un'altro problema io prima nello step dell'oggetto del suono tenevo un controllo che attivava questo suono solo se nn era ancora attivo perchè se cambiando room (dove il suono deve essere uguale) nn ce bisogno che ricomincia a suonoarlo dall'inizio ma è continuo finchè nn si arriva ad una room con suono different, che codice metto per creare un if per controllare se il suono è in play o no?
Immagine
LegendDarkDemonDragon

Game Completi:
Spins - Serie1 (2004)
Spins - Serie2 (2004)
Spins 2 - La leggenda della spada sacra (2004-2005)
Spins 3 - Demone guerriero (2006 - 2007)

Game in Corso:
Last Adventure: The Rune's Key
Pring Adventure
sggsoftware
Membro
Messaggi: 178
Iscritto il: 01/07/2007, 15:09
Uso: GM:Studio 2
Località: Sicilia
Contatta:

Re: Suoni

Messaggio da sggsoftware »

Legend3D ha scritto:quindi se ho ben capito cosa devo fa:
1) cancello i suoni mp3 che uso come musica sui livelli e creo 1 solo suond soMusica vuoto, poi faccio new script nome e ci metto il codice... quando voglio eseguire una musica metto nell'object che mi crea la musica il codice che me la riproduce dal file giusto? ma i suoni devo tenerli nella stessa cartella dove sta il progetto del gioco no?
si ok funziona ma ora sorge un'altro problema io prima nello step dell'oggetto del suono tenevo un controllo che attivava questo suono solo se nn era ancora attivo perchè se cambiando room (dove il suono deve essere uguale) nn ce bisogno che ricomincia a suonoarlo dall'inizio ma è continuo finchè nn si arriva ad una room con suono different, che codice metto per creare un if per controllare se il suono è in play o no?
Ok, ritocco un po' lo script precedente in modo che faccia questo controllo in automatico:

Codice: Seleziona tutto

if (!variable_global_exists("musica")) global.musica="";
if (global.musica!=argument0)
{
    global.musica=argument0;
    sound_stop(soMusica);
    sound_replace(soMusica,argument0,3,true);
    sound_loop(soMusica);
}
Basta, come sempre, chiamare lo script play_music; se la musica è già in esecuzione, lo script non ha alcun effetto.
Legend3D ha scritto:ma i suoni devo tenerli nella stessa cartella dove sta il progetto del gioco no?
Preferibilmente sì. In alternativa potresti metterli in sottocartelle, ma alla funzione play_music dovrai passare il percorso file. Dovrebbe funzionare.
Avatar utente
Legend3D
Membro
Messaggi: 59
Iscritto il: 14/12/2008, 22:45
Contatta:

Re: Suoni

Messaggio da Legend3D »

ok problema quasi risolto solo che quando carico la partita il suono nn parte :( devo cambiare room per far partire il suono... mi spiego meglio nella room 1, 2 e 3 sta lo stessa musica ... iniziando un new game arrivo alla room 2 e salvo (fin qui la musica si sente) ora chiudo il gioco lo riapro e carico la partita, mi ritrovo nella room 2 ma senza musica , se mi dirigo verso la room 4 (Che ha musica differente) il suono riparte e si riattiva pure nelle room precedenti quando torno indietro e quindi ritorna tt normale, ho provato a mettere anche la musica di intro esterna ma quando carico stavolta invece di nn sentire nulla, sento la musica di intro finchè nn arrivo ad una room con un suono nuovo :(
Immagine
LegendDarkDemonDragon

Game Completi:
Spins - Serie1 (2004)
Spins - Serie2 (2004)
Spins 2 - La leggenda della spada sacra (2004-2005)
Spins 3 - Demone guerriero (2006 - 2007)

Game in Corso:
Last Adventure: The Rune's Key
Pring Adventure
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: Suoni

Messaggio da Sla »

Purtroppo game maker non ha integrate delle funzioni per il pause/resume delle canzoni, quindi quando carichi la partita non puoi far riprendere il suono dove era rimasto quando hai salvato, ma devi farlo ricominciare.
Ma se ho ben capito il tuo problema è come farlo ricominciare quando si carica la partita..
quindi proviamo a trovare delle soluzioni:
se facciamo ripartire il suono appena prima del game_load non si sentirebbe comunque in quanto quando il gioco è caricato
valgono i codici utilizzati quando lo avevi salvato...
Potresti fare che quando salvi la partita scrivi in un file txt il nome della canzone da aprire, e nello step del personaggio o di un controller
metti che subito dopo aver caricato il gioco legge il file e fa partire la canzone scritta.
Quindi crei un file nella cartella del gioco e lo chiami "musica.txt".
Poi, nell'oggetto che salva la partita fai:
a = file_text_open_write("musica.txt");
file_text_write_string(a,"song.mp3");
E, subito dopo averla caricata:
a = file_text_open_read("musica.txt");
if file_text_read_string(a)!="" play_music(file_text_read_string(a));

forse ci sono degli errori perchè ho scritto così a occhio, ma non credo.
Ciao :salut:
eppure mi sembra tutto giusto...
Avatar utente
Legend3D
Membro
Messaggi: 59
Iscritto il: 14/12/2008, 22:45
Contatta:

Re: Suoni

Messaggio da Legend3D »

si infatti nn intendevo ricominciare la canzone da dove viene salvata ma farla ripartire da capo il fatto è che anche se l'istance c'è nn la suonava ora provo questa soluzione e ti faccio sape ^^
allora ho provato nell'object che salva ho messo che scrive su musica.txt la foresta1.mp3 (che sarebbe il suono che voglio che salvi) e nell'object per caricare che legge sta stringa... e mi sorge sto problema quindi: quando salva non scrive nulla sul file musica.txt ma nn da errore per salvare , l'errore spunta quando provo a caricare che nn mi apre musica.txt.... asp forse ho fatto una cavolato provo una cosa... niente ho provato a mettere il read nello step del personaggio ma mi dice che nn ha nulla da leggere anche se inizio una partita nuova nn penso vada meso li... se lo metto nel pulsante che uso per caricare nn apre il file... e ora quando salvo mi da pure impossibile scrivere eppure il musica.txt è presente nella cartella del gioco bho nn so proprio dove mettere le mani T_T
Immagine
LegendDarkDemonDragon

Game Completi:
Spins - Serie1 (2004)
Spins - Serie2 (2004)
Spins 2 - La leggenda della spada sacra (2004-2005)
Spins 3 - Demone guerriero (2006 - 2007)

Game in Corso:
Last Adventure: The Rune's Key
Pring Adventure
Avatar utente
NoCode
GMI VIP
Messaggi: 3403
Iscritto il: 01/09/2008, 8:08
Specialità: Grafica e Musica
Uso: GM:Studio 1.4 Pro
Località: My houuuse... Where is my houuuuse?!?
Contatta:

Re: Suoni

Messaggio da NoCode »

la musica che vuoi riprodurre la copi nella cartella del gioco, non nel progetto, poi crei un obj e in create gli metti:

Codice: Seleziona tutto

global.musica = sound_add("musica.mp3",1,true)
sound_loop(global.musica)
naturalmente al posto di musica.mp3 gli metti il nome del file musicale
poi se vuoi fermarlo per qualsiasi motivo:

Codice: Seleziona tutto

sound_stop(global.musica)
tutto qui...

EDIT: per la storia del salvataggio: metti in ogni room l'obj della musica, solo che devi aggiungere una cosetta nel codice per la musica:

Codice: Seleziona tutto

global.musica = sound_add("musica.mp3",1,true)
if not sound_isplaying(global.musica)
sound_loop(global.musica)
Avatar utente
Legend3D
Membro
Messaggi: 59
Iscritto il: 14/12/2008, 22:45
Contatta:

Re: Suoni

Messaggio da Legend3D »

ok provo anche questa ^^ e vedo che succede :)grazie; cmq Auguri di buona vigilia a tutti quanti sopratutto a quelli che mi hanno e continuano a darmi aiuto ^^ GRAZIE!

ho provato ma nn abbiamo concluso nulla siamo tornati un po indietro anzi XD:
siccome le room sono persistent mettendo il il codice nel create la musica la suona solo 1 volta appena cambio room con un suono differente rimane il suono nuovo anche nelle room vecchie, inoltre il caricamento è sempre quello rimane il suono del titolo, e all'inizio del game quando ancora nn ho visitato le altre room (sempre che hanno lo stesso obj con la stessa musica) appena entro il suono riparte da capo mentre prima nn lo ricominciava da capo perchè effetuava il controllo se lo stesso suono era attivo allora nn fare nulla... ho provato a mettere nello step ma si impalla tt bhe ^^ se nn ci sn altre soluzioni sistemo a modo mio con un metodo poco elegante e grezzo: metto il save game in una room a parte senza suono ma con un object che ferma tt i suoni delle altre room così quando carico nn ho proprio musica in quella room e quando esco parte la musica della room dove mi trovo, magari ho spiegato un po con confusione, proverò così grazie a tt cmq ^^
Immagine
LegendDarkDemonDragon

Game Completi:
Spins - Serie1 (2004)
Spins - Serie2 (2004)
Spins 2 - La leggenda della spada sacra (2004-2005)
Spins 3 - Demone guerriero (2006 - 2007)

Game in Corso:
Last Adventure: The Rune's Key
Pring Adventure
sggsoftware
Membro
Messaggi: 178
Iscritto il: 01/07/2007, 15:09
Uso: GM:Studio 2
Località: Sicilia
Contatta:

Re: Suoni

Messaggio da sggsoftware »

No-Code93 ha scritto:la musica che vuoi riprodurre la copi nella cartella del gioco, non nel progetto, poi crei un obj e in create gli metti:

Codice: Seleziona tutto

global.musica = sound_add("musica.mp3",1,true)
sound_loop(global.musica)
naturalmente al posto di musica.mp3 gli metti il nome del file musicale
C'è qualcosa che non mi convince! Scusa, in questo modo tu aggiungi una nuova risorsa al progetto ogni volta che riproduci un file musicale, non sostituisci una risorsa esistente.

Se esegui per esempio questo codice:

Codice: Seleziona tutto

play_music("a.mp3");
play_music("b.mp3");
play_music("a.mp3");
play_music("b.mp3");
play_music("a.mp3");
play_music("b.mp3");
avrai aggiunto al progetto (in fase di runtime ovviamente) ben 6 risorse, con inutile spreco di memoria (ammettendo ad esempio che un mp3 occupi circa 3MB, sono 18MB di RAM bruciati!!).

Il fatto che tu stia usando la stessa variabile global.musica ogni volta che carichi un suono non implica che tu stia sostituendo una risorsa preesistente: stai semplicemente assegnando a global.musica un diverso riferimento. In pratica global.musica punterà ad un'altra risorsa, ma quella vecchia resterà allocata in memoria. O meglio, può darsi che Game Maker abbia un garbage collector, ma non credo Overmars sia arrivato a tanto.
Avatar utente
NoCode
GMI VIP
Messaggi: 3403
Iscritto il: 01/09/2008, 8:08
Specialità: Grafica e Musica
Uso: GM:Studio 1.4 Pro
Località: My houuuse... Where is my houuuuse?!?
Contatta:

Re: Suoni

Messaggio da NoCode »

segui la logica, la variabile è la stessa, quindi la musica che viene aggiunta sostituisce quella precedente, di conseguenza la memoria ovvupata è solo quella della musica in uso, quella di prima si è tolta
Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Suoni

Messaggio da Homunculus »

No-Code93 ha scritto:segui la logica, la variabile è la stessa, quindi la musica che viene aggiunta sostituisce quella precedente, di conseguenza la memoria ovvupata è solo quella della musica in uso, quella di prima si è tolta
Sbagliato, questo vale per numeri stringhe o altri tipi primitivi, le risorse che aggiungi sono permanenti, la variabile é solo una "referenza" alla risorsa, non rappresenta la risorsa stessa. Questo vuol dire che sovrascrivendo la variiabile stai solo cambiando una referenza, non una risorsa.

È proprio per questo che esistono funzioni specifiche per rimuovere risorse.