scribble

Tactics DS

Sobre nosotros Blog de desarrollo GitHub

24 Mar 2015
Sonido

¿Qué sería de un juego sin sonido? Exacto. Así que hemos diseñado un API para manejar sonidos. Por debajo, en Nintendo DS, nuestro framework recurre a maxmod, mientras que en el caso de OpenGL recurriría un API de bajo nivel diferente.

La página oficial ha sido convertida en una web de spam japonesa, afortunadamente hemos encontrado la documentación del maxmod en otras fuentes.

De nuevo nuestro objetivo es ofrecer un API que resulta cómoda de usar y de implementar. Tras un estudio de la situación llegamos a la declaración siguiente:

/**
 * Registers given special effect.
 * @param  fx Effect to register.
 * @return    ID of registered FX.
 */
int registerFX(FX fx);

/**
 * Starts playing given special effect, will return an identifier to cancel this
 * exact reproduction.
 * @param  effectID ID of special effect to play.
 * @return          ID of this reproduction, so it can be cancelled later.
 */
playID playEffect(int effectID);

/**
 * Stops playing given reproduction of special effect.
 * @param  reproductionID ID of reproduction to stop.
 * @return                Whether reproduction has been stopped or not.
 */
bool stopEffect(playID reproductionID);

/**
 * Starts playing given background music.
 * @param musicID Music to be played in background.
 */
void setBackgroundMusic(int musicID);

/**
 * Pauses background music.
 */
void stopBackgroundMusic();

El funcionamiento es algo curioso. Maxmod compila todos los archivos de sonido en un banco de sonido, donde cada uno de los sonidos iniciales tiene asignado un identificador. Este identificador es el que se usa para indicarle a Maxmod cuál es la música de fondo o cuál es el sonido asociado con un efecto especial.

Se puede observar que existe un método int registerFX(FX fx) para registrar efectos de sonido sin embargo no existe ningún método para registrar música de fondo. Esto se debe a que la música de fondo es más sencilla de registrar: únicamente se permite tener una en reproducción, de modo que ésta reemplaza a la anterior. Por simplicidad hemos unificado ambos comportamientos en un único método void setBackgroundMusic(int musicID).

La música de fondo puede ser detenida y los efectos de sonido también. Como puede haber múltiples efectos de sonido siendo reproducidos al mismo tiempo cada reproducción tiene asociado un identificador para poder detener una instancia de un efecto de sonido en concreto.

Los efectos de sonido se manejan mediante el struct FX:

typedef struct FX {
    // MaxMod, low-level ID.
    unsigned int id;
    short unsigned int rate;
    short unsigned int handle;
    unsigned char volume;
    unsigned char panning;
} FX;

// Returns a struct with default values.
FX effectWithSoundID(int ID);

Con todo esto logramos un API que resulta sencilla de implementar y ofrece suficiente flexibilidad para nuestros objetivos.


Hasta la próxima,
Mark, Víctor y Lluís at 09:40

scribble

Sobre nosotros Blog de desarrollo GitHub