Junio 20, 2014, 09:53:24 PM Ultima modificación: Junio 21, 2014, 09:16:03 PM por anse
Muy buenas. Estoy haciendo un juego el cual llevo ya bastante avanzado, pero me gustaría hacerle un menú de pausa. Por lógica, he creado un objeto "pause" al cual le he añadido un evento de presionar la tecla P, el cual dice que hará un "save game" y cambiará de room a la room de pause. al entrar aquí, se escuchará una música gracias a un objeto "reanudar" el cual tiene un evento create para poner esa música y un evento de presionar la tecla P para hacer un "load game" y cortar el sonido (me daba problemas de que seguía escuchándose tras volver a la room del juego). El problema viene cuando al volver a la room del juego, no se escucha la música del juego, pero me interesaría que se escuchara por donde lo pausé, ya que tiene una intro adecuada a la propia introducción de la fase del juego causada por un evento de colisión (para que suene la música acorde con la introducción a la pantalla). Lo que quiero conseguir es que, se guarde el tiempo por donde iba la música al pulsar la P y que se vaya a la pantalla de pause. Cuando vuelva, se quite la música del menú pause y siga la música del juego por donde se había quedado.

¿Alguna sugerencia?

Pues el Game maker 8 no tiene para pausar audio (me parece que tampoco el 8.1), la unica forma seria que cortaras la musica como dos archivos, para que asi no suene de nuevo la parte del intro al re ingresar al juego, respecto al por que no suena cuando vuelves a entrar al room, es por que el sistema de "save" y "load" de game maker no guarda los sonidos activos ni tampoco particulas entre otras cosas,
ahora que si apenas estas iniciando tu proyecto, podrias importarlo al Game maker Studio, eh escuchado que ese si tiene sistema de pausado, aun que la verdad no lo se ya que mi game maker es el 8 xD
Suerte!

Y aunque no sea mediante eventos y funciones, ¿no hay ningún código script para ello? Llevo el juego ya bastante avanzado

Gracias por tu respuesta

Hola

Podrías usar una extensión/dll que pueda pausar la música.
Busca en http://www.gmtoolbox.com/
De esa lista leí las características de "SAudio" y parece que tiene lo que necesitas, aunque hay otros plugins que tienen características similares.

Otra forma, que se me ocurre, es que podrías hacer que el volumen de la música principal sea cero, y que la música de pausa se reproduzca como efecto de sonido. Pero el método tiene varios inconvenientes, porque la música principal no continuará en la misma posición, y no funcionará si ambas pistas son midi.

He visto esa extensión, pero su uso es para cargar sonidos de forma externa sin tener que cargarlos desde el programa, para no tener que importarlos por si tarda mucho en cargar el sonido. ¿No existe una función en código que pause el sonido y vuelva a retomarlo al volver a la room?

Gracias a ti también por tu respuesta ;)

Dentro del game maker 8 no hay forma, la dll ciertamente te carga los archivos externamente, no son complicadas de usar, si real mente quieres hacer pausa, necesitarias usar una

Pero ¿puedo cargar un sonido externo y pausar dicho sonido para luego reanudarlo?

#7 Junio 21, 2014, 10:08:56 PM Ultima modificación: Junio 21, 2014, 10:10:51 PM por penumbra
No. El método de cargar el sonido (localmente o externamente) no hace diferencia. GM8 no tiene ninguna función para reanudar el sonido en un punto "intermedio". Esas función sí está disponible nativamente en GM:Stidio, aunque creo recordar que sí hay al menos una dll para GM8 que da la opción de reanudar en un punto, pero no recuerdo su nombre, sólo que llegué a verla en el foro de YoYo. Así sin DLL, con las funciones proipias de GM8, no se puede reanudar.

Acabo de mirar por san google algun dll para game maker 8 con más opciones en el sonido, no he encontrado el que me comentas, penumbra :/

Gracias por tu respuesta de todas formas, a ver como me las apaño para simular

#9 Junio 21, 2014, 10:39:24 PM Ultima modificación: Junio 21, 2014, 10:41:33 PM por penumbra
Mmm pues resulta que es la mismísima SAudio. Yo no loa he probado, pero por lo que dice el post, no sólo es para cargar archivos externamente, sino que ahí dice que puede pausar y reanudar e incluso es capaz de devolver la longitud del tema y la posición.

Eso dice, yo no la he usado, pero dejo el enlace al post
http://gmc.yoyogames.com/?showtopic=153450

Features:

- Init DLL
- Open sound (uses an id so you could have literally 700+ sounds open)
- Play sound
- Play looped
- Pause sound
- Resume sound
- Stop sound
- Stop all sounds
- Sound position
- Sound length
- Sound seek to position
- Sound mode (playing, paused, ect)
- Channels (wav-only compatible)
- Bytes per second (again only compatible with wavs)
- Can play (checks if the sound is fully compatible)
- Load id for recording (creates an id for use in record functions)
- Record (physical recording)
- Save record (saves the recorded file)
- Close sound (frees the memory)
- Close all

Se ve bastante buena para hacer una juego de dj o remix, si es que funciona bien, claro.

Acabo de probarlo, pero parece que algo estoy haciendo mal. Me han dado, entre muchos otros, estos 2 scripts que son los que me interesan:

Pausar
// Pauses a file
// Arg 0 = The id of the file.

return external_call(global.Pause,argument0);

aqui he sustituir "argument0" por la id del sonido y me ha quedado tal que asi
// Pauses a file
// Arg 0 = The id of the file.

return external_call(global.Pause,sound_fase1cortado);


Reanudar
// Resumes a paused file
// Arg 0 = The id of the file.

return external_call(global.Resume,argument0);

igual que en el otro, sustituyo:

// Resumes a paused file
// Arg 0 = The id of the file.

return external_call(global.Resume,sound_fase1cortado);


en ambos me salta el mismo error:

ERROR in
action number 2
of Key Press Event for P-key Key
for object ob_pausa:

Illegal argument count calling script "saud_Pause".
Script requires 0 arguments, 5 have been supplied.

___________________________________________
ERROR in
action number 2
of Mouse Event for Left Button
for object obj_continuar:

Illegal argument count calling script "saud_Resume".
Script requires 0 arguments, 5 have been supplied.

esto a que es debido?

Siento el doble post, pero necesito una respuesta. ¿Alguien sabe el por qué de esos errores?

Gracias por adelantado

No sé qué fuente estás consultando o qué ejemplo estés usando, pero me parece que los scripts que pusiste anteriormente no son los adecuados para trabajar con audio directamente. No sé mucho del tema, pero creo que esas son las llamadas externas que usa GM para acceder a las funciones de la DLL, y tú no deberías tocar ni modificar nada de eso o SAudio puede que te quede sin funcionar

Los errores avisan que estás introduciendo un número mayor que el necesario de argumentos. ¿De dónde descargaste la dll? A mi el enlace en el foro de YoYo no me funciona.

En ese mismo post, en la última pagina un usuario ha puesto un enlace arreglado. Lo que hice, busqué en internet, fue poner el DLL en el mismo lugar que donde tengo mi proyecto guardado e importar una serie de scripts, en formato gml, que trae el mismo .rar que descargué. En esos scripts al principio pone esa aclaración, en el argument0 debe estar la ID del archivo. No se si lo estoy haciendo mal, pero incluso dejándolo sin tocar sale el mismo error :/

Siento todas las molestias que estoy causando

Como te dijo Penumbra, los scripts de Saudio no los debes modificar, lo que debes hacer es hacer una llamada a esos scripts entregándoles los argumentos apropiados. Yo usaba esa dll para incorporar sonidos mp3 a mis proyectos pero cuando cambié a windows 7 x64 la dll dejó de funcionar. Espero que no sea tu caso, yo me puse a buscar una alternativa compatible con Windows 7 x64 y luego de mucho buscar encontré SXMS-3.dll.

Para usar saudio haz esto:

1. Importar los scripts que vienen con el ejemplo editable de GM (lo cual entiendo que ya hiciste).
2. Copiar el archivo saudio.dll a la misma carpeta donde está el editable del juego
3. Inicializar la dll:

saud_Init();

4. Cargar el archivo de música (donde Musica.mp3 es el nombre del archivo que contiene el sonido, o la ruta hasta él; cámbialo según corresponda):

path="Musica.mp3";
saud_Load(path,"sonido1");
if saud_CanPlay("sonido1")!="true"
    show_message("Sonido incompatible");


El string "sonido1" es simplemente un identificador que usa la dll para ese sonido cargado y que se usa al llamar a los scripts.

5. Reproducir el archivo:

saud_Loop("sonido1");

Luego, si quieres pausar el sonido, haces una llamada al script saud_Pause:

saud_Pause("sonido1");

Si quieres que continúe sonando:

saud_Resume("sonido1");

Recuerda cerrar el sonido cuando ya no lo necesites:

saud_Close("sonido1");

O cierra todos si el juego termina:

saud_CloseAll();