From 4cbe55c2d4e6bd8a2ff745def2b6a4e6cb7188da Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 1 Dec 2022 19:51:53 +0100 Subject: [PATCH] =?UTF-8?q?Actualizado=20jail=5Faudio=20a=20la=20=C3=BAlti?= =?UTF-8?q?ma=20versi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/room/18.tmx | 10 +-- data/tilesets/standard.png | Bin 9069 -> 8994 bytes data/tilesets/standard_zxarne.png | Bin 10544 -> 10544 bytes source/common/jail_audio.cpp | 28 +++---- source/common/jail_audio.h | 18 ++--- source/common/jail_audio_sdlmixer.cpp | 101 ++++++++++++++++++++++++++ source/common/menu.h | 6 +- source/common/notify.h | 2 +- source/director.h | 2 +- source/ending.h | 2 +- source/ending2.h | 2 +- source/game.h | 4 +- source/game_over.h | 2 +- source/intro.h | 6 +- source/player.h | 4 +- source/room.h | 2 +- 16 files changed, 146 insertions(+), 43 deletions(-) create mode 100644 source/common/jail_audio_sdlmixer.cpp diff --git a/data/room/18.tmx b/data/room/18.tmx index 7f5b968..0a5892d 100644 --- a/data/room/18.tmx +++ b/data/room/18.tmx @@ -3,16 +3,16 @@ -5,5,5,5,5,5,5,5,5,5,173,0,0,0,506,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,173,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,5,5, -5,5,5,5,5,5,5,173,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,0,506,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,173,0,134,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 557,557,557,557,557,557,134,0,415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,415,415,415,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, -5,5,5,5,5,5,173,0,0,0,0,530,0,0,0,0,0,0,449,449,449,449,449,449,449,449,449,449,449,449,449,5, -5,5,5,5,5,173,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +5,5,5,5,5,5,0,0,0,0,0,530,0,0,0,0,0,0,449,449,449,449,449,449,449,449,449,449,449,449,449,5, +5,5,5,5,5,0,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,517,367,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,367,367,367,367,429,429,0,429,429,367,367,367,367,367,367,367,367,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5, diff --git a/data/tilesets/standard.png b/data/tilesets/standard.png index 8d8a8992b2332db415ba2766308cc3e199fc9cfb..ef7fa4485c64d9924a7447e2c9d76e1e7214ce5c 100644 GIT binary patch delta 8984 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 delta 9059 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 Cdu#{* diff --git a/data/tilesets/standard_zxarne.png b/data/tilesets/standard_zxarne.png index a09f9c719062872d538ddaa118dd36e9fd84ed06..7902e0ee3020d192ae0930c2a843e553f39af649 100644 GIT binary patch literal 10544 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 MyL##ss!u}x7cx?F-T(jq literal 10544 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 diff --git a/source/common/jail_audio.cpp b/source/common/jail_audio.cpp index 7ce9aec..42907fe 100644 --- a/source/common/jail_audio.cpp +++ b/source/common/jail_audio.cpp @@ -1,3 +1,4 @@ +#ifndef JA_USESDLMIXER #include "jail_audio.h" #include "stb_vorbis.c" #include @@ -11,7 +12,7 @@ struct JA_Sound_t { }; struct JA_Channel_t { - JA_Sound sound; + JA_Sound_t *sound; int pos {0}; int times {0}; JA_Channel_state state { JA_CHANNEL_FREE }; @@ -25,7 +26,7 @@ struct JA_Music_t { JA_Music_state state {JA_MUSIC_INVALID}; }; -JA_Music current_music{NULL}; +JA_Music_t *current_music{NULL}; JA_Channel_t channels[JA_MAX_SIMULTANEOUS_CHANNELS]; int JA_freq {48000}; @@ -86,7 +87,7 @@ void JA_Quit() { sdlAudioDevice = 0; } -JA_Music JA_LoadMusic(const char* filename) { +JA_Music_t *JA_LoadMusic(const char* filename) { int chan, samplerate; // [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid. @@ -98,7 +99,7 @@ JA_Music JA_LoadMusic(const char* filename) { if (fread(buffer, fsize, 1, f)!=1) return NULL; fclose(f); - JA_Music music = new JA_Music_t(); + JA_Music_t *music = new JA_Music_t(); music->samples = stb_vorbis_decode_memory(buffer, fsize, &chan, &samplerate, &music->output); free(buffer); @@ -121,7 +122,7 @@ JA_Music JA_LoadMusic(const char* filename) { return music; } -void JA_PlayMusic(JA_Music music, const int loop) { +void JA_PlayMusic(JA_Music_t *music, const int loop) { if (current_music != NULL) { current_music->pos = 0; current_music->state = JA_MUSIC_STOPPED; @@ -153,21 +154,21 @@ JA_Music_state JA_GetMusicState() { return current_music->state; } -void JA_DeleteMusic(JA_Music music) { +void JA_DeleteMusic(JA_Music_t *music) { if (current_music == music) current_music = NULL; free(music->output); delete music; } -JA_Sound JA_NewSound(Uint8* buffer, Uint32 length) { - JA_Sound sound = new JA_Sound_t(); +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) { + JA_Sound_t *sound = new JA_Sound_t(); sound->buffer = buffer; sound->length = length; return sound; } -JA_Sound JA_LoadSound(const char* filename) { - JA_Sound sound = new JA_Sound_t(); +JA_Sound_t *JA_LoadSound(const char* filename) { + JA_Sound_t *sound = new JA_Sound_t(); SDL_AudioSpec wavSpec; SDL_LoadWAV(filename, &wavSpec, &sound->buffer, &sound->length); @@ -184,7 +185,7 @@ JA_Sound JA_LoadSound(const char* filename) { return sound; } -int JA_PlaySound(JA_Sound sound, const int loop) { +int JA_PlaySound(JA_Sound_t *sound, const int loop) { int channel = 0; while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; } if (channel == JA_MAX_SIMULTANEOUS_CHANNELS) channel = 0; @@ -196,7 +197,7 @@ int JA_PlaySound(JA_Sound sound, const int loop) { return channel; } -void JA_DeleteSound(JA_Sound sound) { +void JA_DeleteSound(JA_Sound_t *sound) { for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) { if (channels[i].sound == sound) JA_StopChannel(i); } @@ -246,4 +247,5 @@ JA_Channel_state JA_GetChannelState(const int channel) { int JA_SetVolume(int volume) { JA_volume = volume > 128 ? 128 : volume < 0 ? 0 : volume; return JA_volume; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/source/common/jail_audio.h b/source/common/jail_audio.h index 7d03400..4c4d7f9 100644 --- a/source/common/jail_audio.h +++ b/source/common/jail_audio.h @@ -4,27 +4,27 @@ enum JA_Channel_state { JA_CHANNEL_INVALID, JA_CHANNEL_FREE, JA_CHANNEL_PLAYING, JA_CHANNEL_PAUSED }; enum JA_Music_state { JA_MUSIC_INVALID, JA_MUSIC_PLAYING, JA_MUSIC_PAUSED, JA_MUSIC_STOPPED }; -typedef struct JA_Sound_t *JA_Sound; -typedef struct JA_Music_t *JA_Music; +struct JA_Sound_t; +struct JA_Music_t; void JA_Init(const int freq, const SDL_AudioFormat format, const int channels); void JA_Quit(); -JA_Music JA_LoadMusic(const char* filename); -void JA_PlayMusic(JA_Music music, const int loop = -1); +JA_Music_t *JA_LoadMusic(const char* filename); +void JA_PlayMusic(JA_Music_t *music, const int loop = -1); void JA_PauseMusic(); void JA_ResumeMusic(); void JA_StopMusic(); JA_Music_state JA_GetMusicState(); -void JA_DeleteMusic(JA_Music music); +void JA_DeleteMusic(JA_Music_t *music); -JA_Sound JA_NewSound(Uint8* buffer, Uint32 length); -JA_Sound JA_LoadSound(const char* filename); -int JA_PlaySound(JA_Sound sound, const int loop = 0); +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length); +JA_Sound_t *JA_LoadSound(const char* filename); +int JA_PlaySound(JA_Sound_t *sound, const int loop = 0); void JA_PauseChannel(const int channel); void JA_ResumeChannel(const int channel); void JA_StopChannel(const int channel); JA_Channel_state JA_GetChannelState(const int channel); -void JA_DeleteSound(JA_Sound sound); +void JA_DeleteSound(JA_Sound_t *sound); int JA_SetVolume(int volume); \ No newline at end of file diff --git a/source/common/jail_audio_sdlmixer.cpp b/source/common/jail_audio_sdlmixer.cpp new file mode 100644 index 0000000..ddb6b61 --- /dev/null +++ b/source/common/jail_audio_sdlmixer.cpp @@ -0,0 +1,101 @@ +#ifdef JA_USESDLMIXER +#include "jail_audio.h" +#include +#include +#include + +struct JA_Sound_t {}; // Dummy structs +struct JA_Music_t {}; + +int JA_freq {48000}; +SDL_AudioFormat JA_format {AUDIO_S16}; +Uint8 JA_channels {2}; + +void JA_Init(const int freq, const SDL_AudioFormat format, const int channels) { + JA_freq = freq; + JA_format = format; + JA_channels = channels; + Mix_OpenAudio(JA_freq, JA_format, JA_channels, 1024); +} + +void JA_Quit() { + Mix_CloseAudio(); +} + +JA_Music_t *JA_LoadMusic(const char* filename) { + return (JA_Music_t*)Mix_LoadMUS(filename); +} + +void JA_PlayMusic(JA_Music_t *music, const int loop) { + Mix_PlayMusic((Mix_Music*)music, loop); +} + +void JA_PauseMusic() { + Mix_PauseMusic(); +} + +void JA_ResumeMusic() { + Mix_ResumeMusic(); +} + +void JA_StopMusic() { + Mix_HaltMusic(); +} + +JA_Music_state JA_GetMusicState() { + if (Mix_PausedMusic()) { + return JA_MUSIC_PAUSED; + } else if (Mix_PlayingMusic()) { + return JA_MUSIC_PLAYING; + } else { + return JA_MUSIC_STOPPED; + } +} + +void JA_DeleteMusic(JA_Music_t *music) { + Mix_FreeMusic((Mix_Music*)music); +} + +JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) { + return NULL; +} + +JA_Sound_t *JA_LoadSound(const char* filename) { + JA_Sound_t *sound = (JA_Sound_t*)Mix_LoadWAV(filename); + return sound; +} + +int JA_PlaySound(JA_Sound_t *sound, const int loop) { + return Mix_PlayChannel(-1, (Mix_Chunk*)sound, loop); +} + +void JA_DeleteSound(JA_Sound_t *sound) { + Mix_FreeChunk((Mix_Chunk*)sound); +} + +void JA_PauseChannel(const int channel) { + Mix_Pause(channel); +} + +void JA_ResumeChannel(const int channel) { + Mix_Resume(channel); +} + +void JA_StopChannel(const int channel) { + Mix_HaltChannel(channel); +} + +JA_Channel_state JA_GetChannelState(const int channel) { + if (Mix_Paused(channel)) { + return JA_CHANNEL_PAUSED; + } else if (Mix_Playing(channel)) { + return JA_CHANNEL_PLAYING; + } else { + return JA_CHANNEL_FREE; + } +} + +int JA_SetVolume(int volume) { + return Mix_Volume(-1, volume); +} +#endif diff --git a/source/common/menu.h b/source/common/menu.h index f2a93f3..6164b7c 100644 --- a/source/common/menu.h +++ b/source/common/menu.h @@ -91,9 +91,9 @@ private: bool isCenteredOnY; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y bool areElementsCenteredOnX; // Variable para saber si los elementos van centrados en el eje X int widestItem; // Anchura del elemento más ancho - JA_Sound soundAccept; // Sonido al aceptar o elegir una opción del menu - JA_Sound soundCancel; // Sonido al cancelar el menu - JA_Sound soundMove; // Sonido al mover el selector + JA_Sound_t* soundAccept; // Sonido al aceptar o elegir una opción del menu + JA_Sound_t* soundCancel; // Sonido al cancelar el menu + JA_Sound_t* soundMove; // Sonido al mover el selector color_t colorGreyed; // Color para los elementos agrisados rectangle_t rectBG; // Rectangulo de fondo del menu std::vector item; // Estructura para cada elemento del menu diff --git a/source/common/notify.h b/source/common/notify.h index 40e5026..746055d 100644 --- a/source/common/notify.h +++ b/source/common/notify.h @@ -57,7 +57,7 @@ private: color_t bgColor; // Color de fondo de las notificaciones int waitTime; // Tiempo que se ve la notificación std::vector notifications; // La lista de notificaciones activas - JA_Sound sound; // Sonido a reproducir cuando suena la notificación + JA_Sound_t* sound; // Sonido a reproducir cuando suena la notificación // Elimina las notificaciones finalizadas void clearFinishedNotifications(); diff --git a/source/director.h b/source/director.h index c86657c..c600399 100644 --- a/source/director.h +++ b/source/director.h @@ -49,7 +49,7 @@ private: // Variables section_t section; // Sección y subsección actual del programa; - JA_Music music; // Musica del titulo + JA_Music_t* music; // Musica del titulo std::string executablePath; // Path del ejecutable std::string systemFolder; // Carpeta del sistema donde guardar datos diff --git a/source/ending.h b/source/ending.h index d17fe87..2ce95b7 100644 --- a/source/ending.h +++ b/source/ending.h @@ -70,7 +70,7 @@ private: std::vector spritePics; // Vector con los sprites de texto con su cortinilla int scene; // Escena actual std::vector scenes; // Vector con los textos e imagenes de cada escena - JA_Music music; // Musica que suena durante el final + JA_Music_t* music; // Musica que suena durante el final // Actualiza el objeto void update(); diff --git a/source/ending2.h b/source/ending2.h index 9469b66..e193e5b 100644 --- a/source/ending2.h +++ b/source/ending2.h @@ -39,7 +39,7 @@ private: section_t section; // Estado del bucle principal para saber si continua o se sale Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa - JA_Music music; // Musica que suena durante el final + JA_Music_t* music; // Musica que suena durante el final std::vector spriteList; // Lista con todos los sprites a dibujar std::vector colors; // Vector con los colores para el fade int maxSpriteWidth; // El valor de ancho del sprite mas ancho diff --git a/source/game.h b/source/game.h index 2ed281b..f56dec0 100644 --- a/source/game.h +++ b/source/game.h @@ -43,13 +43,13 @@ private: Stats *stats; // Objeto encargado de gestionar las estadísticas // Variables - JA_Music music; // Musica que suena durante el juego + JA_Music_t* music; // Musica que suena durante el juego Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa section_t section; // Seccion actual dentro del juego std::string currentRoom; // Fichero de la habitación actual playerSpawn_t spawnPoint; // Lugar de la habitación donde aparece el jugador - JA_Sound deathSound; // Sonido a reproducir cuando muere el jugador + JA_Sound_t* deathSound; // Sonido a reproducir cuando muere el jugador board_t board; // Estructura con los datos del marcador bool paused; // Indica si el juego se encuentra en pausa bool blackScreen; // Indica si la pantalla está en negro. Se utiliza para la muerte del jugador diff --git a/source/game_over.h b/source/game_over.h index 42db3b8..33575aa 100644 --- a/source/game_over.h +++ b/source/game_over.h @@ -40,7 +40,7 @@ private: int endSection; // Contador: cuando acaba la sección int iniFade; // Contador: cuando emiepza el fade int fadeLenght; // Contador: duración del fade - JA_Music music; // Musica que suena durante el juego + JA_Music_t* music; // Musica que suena durante el juego // Actualiza el objeto void update(); diff --git a/source/intro.h b/source/intro.h index 691827e..33215a3 100644 --- a/source/intro.h +++ b/source/intro.h @@ -39,9 +39,9 @@ private: Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa int loadCounter; // Contador para controlar las cargas bool loadingFirstPart; // Para saber en que parte de la carga se encuentra - JA_Music loadingSound1; // Sonidos para imitar la carga tipo spectrum - JA_Music loadingSound2; // Sonidos para imitar la carga tipo spectrum - JA_Music loadingSound3; // Sonidos para imitar la carga tipo spectrum + JA_Music_t* loadingSound1; // Sonidos para imitar la carga tipo spectrum + JA_Music_t* loadingSound2; // Sonidos para imitar la carga tipo spectrum + JA_Music_t* loadingSound3; // Sonidos para imitar la carga tipo spectrum int lineIndex[192]; // El orden en el que se procesan las 192 lineas de la pantalla de carga SDL_Rect loadRect; // Rectangulo para dibujar la pantalla de carga diff --git a/source/player.h b/source/player.h index 2c635e8..e614fc1 100644 --- a/source/player.h +++ b/source/player.h @@ -81,8 +81,8 @@ public: SDL_Rect lastPosition; // Contiene la ultima posición del jugador, por si hay que deshacer algun movimiento int jumpIni; // Valor del eje Y en el que se inicia el salto float maxVY; // Velocidad máxima que puede alcanzar al desplazarse en vertical - std::vector jumpSound; // Vecor con todos los sonidos del salto - std::vector fallSound; // Vecor con todos los sonidos de la caída + std::vector jumpSound; // Vecor con todos los sonidos del salto + std::vector fallSound; // Vecor con todos los sonidos de la caída int jumpCounter; // Cuenta el tiempo de salto int fallCounter; // Cuenta el tiempo de caida bool alive; // Indica si el jugador esta vivo o no diff --git a/source/room.h b/source/room.h index 87e17f5..600b7eb 100644 --- a/source/room.h +++ b/source/room.h @@ -104,7 +104,7 @@ private: std::string tileMapFile; // Fichero con el mapa de indices de tile std::vector tileMap; // Indice de los tiles a dibujar en la habitación int autoSurfaceDirection; // Sentido en el que arrastran las superficies automáticas de la habitación - JA_Sound itemSound; // Sonido producido al coger un objeto + JA_Sound_t* itemSound; // Sonido producido al coger un objeto std::vector bottomSurfaces; // Lista con las superficies inferiores de la habitación std::vector topSurfaces; // Lista con las superficies superiores de la habitación std::vector leftSurfaces; // Lista con las superficies laterales de la parte izquierda de la habitación