Add background music
5
NOTICE
@@ -1,7 +1,8 @@
|
|||||||
Assets used by this project:
|
Assets used by this project:
|
||||||
|
|
||||||
- "Fruit+" by SciGho — https://ninjikin.itch.io/fruit
|
- "Fruit+" by SciGho - https://ninjikin.itch.io/fruit
|
||||||
License: https://creativecommons.org/licenses/by/4.0/
|
License: https://creativecommons.org/licenses/by/4.0/
|
||||||
- "Jungle Background (Parallax)" by TrashBoat93
|
- "Jungle Background (Parallax)" by TrashBoat93
|
||||||
URL: https://trashboat93.itch.io/jungle-background-parallax
|
URL: https://trashboat93.itch.io/jungle-background-parallax
|
||||||
|
- "Jamaican Sunrise - Reggae" by DavidKBD
|
||||||
|
URL: https://davidkbd.itch.io/tropical-dreams-spring-and-summer-music-pack
|
||||||
|
|||||||
25
assets.cpp
@@ -1,4 +1,5 @@
|
|||||||
#include "assets.hpp"
|
#include "assets.hpp"
|
||||||
|
#include "audio.hpp"
|
||||||
#include "sdl_types.hpp"
|
#include "sdl_types.hpp"
|
||||||
|
|
||||||
#include <SDL3_image/SDL_image.h>
|
#include <SDL3_image/SDL_image.h>
|
||||||
@@ -6,11 +7,15 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
static constexpr uint8_t BACKGROUND_DATA[] = {
|
static constexpr uint8_t BACKGROUND_DATA[] = {
|
||||||
#embed "jungle.jpg"
|
#embed "assets/images/jungle.jpg"
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr uint8_t FRUITS_DATA[] = {
|
static constexpr uint8_t FRUITS_DATA[] = {
|
||||||
#embed "fruits.jpg"
|
#embed "assets/images/fruits.jpg"
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr uint8_t BACKGROUND_MUSIC_DATA[] = {
|
||||||
|
#embed "assets/sounds/JamaicanSunrise.wav"
|
||||||
};
|
};
|
||||||
|
|
||||||
SDL_Texture *load_texture(uint8_t const *data, size_t size,
|
SDL_Texture *load_texture(uint8_t const *data, size_t size,
|
||||||
@@ -24,6 +29,18 @@ SDL_Texture *load_texture(uint8_t const *data, size_t size,
|
|||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AudioAsset load_audio(uint8_t const *data, size_t size) {
|
||||||
|
AudioAsset audio_asset;
|
||||||
|
|
||||||
|
auto *iostream = SDL_IOFromConstMem(data, size);
|
||||||
|
bool res = SDL_LoadWAV_IO(iostream, false, &audio_asset.spec,
|
||||||
|
&audio_asset.buffer, &audio_asset.buffer_length);
|
||||||
|
if (!res) {
|
||||||
|
spdlog::error("Failed to load audio file!\nCause: {}", SDL_GetError());
|
||||||
|
}
|
||||||
|
return audio_asset;
|
||||||
|
}
|
||||||
|
|
||||||
void init_assets(flecs::world &world) {
|
void init_assets(flecs::world &world) {
|
||||||
auto *renderer = world.get<SdlHandles>()->renderer;
|
auto *renderer = world.get<SdlHandles>()->renderer;
|
||||||
|
|
||||||
@@ -41,4 +58,8 @@ void init_assets(flecs::world &world) {
|
|||||||
.texture_atlas_layout = background_layout},
|
.texture_atlas_layout = background_layout},
|
||||||
.fruits = Texture{.sdl_texture = fruits,
|
.fruits = Texture{.sdl_texture = fruits,
|
||||||
.texture_atlas_layout = fruits_layout}});
|
.texture_atlas_layout = fruits_layout}});
|
||||||
|
|
||||||
|
auto background_music =
|
||||||
|
load_audio(BACKGROUND_MUSIC_DATA, sizeof(BACKGROUND_MUSIC_DATA));
|
||||||
|
world.set<AudioAssets>(AudioAssets{.background_music = background_music});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "audio.hpp"
|
||||||
|
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
#include <flecs.h>
|
#include <flecs.h>
|
||||||
|
|
||||||
@@ -20,4 +22,8 @@ struct TextureAssets {
|
|||||||
Texture fruits;
|
Texture fruits;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AudioAssets {
|
||||||
|
AudioAsset background_music;
|
||||||
|
};
|
||||||
|
|
||||||
void init_assets(flecs::world &world);
|
void init_assets(flecs::world &world);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
BIN
assets/sounds/JamaicanSunrise.ogg
Normal file
BIN
assets/sounds/JamaicanSunrise.wav
Normal file
BIN
assets/sounds/blip.wav
Normal file
10
audio.hpp
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SDL3/SDL.h>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct AudioAsset {
|
||||||
|
SDL_AudioSpec spec;
|
||||||
|
uint8_t *buffer;
|
||||||
|
uint32_t buffer_length;
|
||||||
|
};
|
||||||
14
main.cpp
@@ -34,7 +34,7 @@ int main() {
|
|||||||
|
|
||||||
SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");
|
SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");
|
||||||
|
|
||||||
if (!SDL_Init(SDL_INIT_VIDEO)) {
|
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
|
||||||
spdlog::critical("Failed to initialize SDL!\nCause: {}", SDL_GetError());
|
spdlog::critical("Failed to initialize SDL!\nCause: {}", SDL_GetError());
|
||||||
std::terminate();
|
std::terminate();
|
||||||
}
|
}
|
||||||
@@ -152,6 +152,15 @@ int main() {
|
|||||||
pos.y += vel.y;
|
pos.y += vel.y;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
auto *audio_assets = world.get<AudioAssets>();
|
||||||
|
auto *stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &audio_assets->background_music.spec, NULL, NULL);
|
||||||
|
if (!stream) {
|
||||||
|
SDL_Log("Couldn't create audio stream: %s", SDL_GetError());
|
||||||
|
return SDL_APP_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_ResumeAudioStreamDevice(stream);
|
||||||
|
|
||||||
bool exit_gameloop = false;
|
bool exit_gameloop = false;
|
||||||
while (!exit_gameloop) {
|
while (!exit_gameloop) {
|
||||||
auto *input = world.get_mut<ButtonInput>();
|
auto *input = world.get_mut<ButtonInput>();
|
||||||
@@ -184,6 +193,9 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Game Logic
|
// Game Logic
|
||||||
|
if (SDL_GetAudioStreamQueued(stream) < (int)audio_assets->background_music.buffer_length) {
|
||||||
|
SDL_PutAudioStreamData(stream, audio_assets->background_music.buffer, audio_assets->background_music.buffer_length);
|
||||||
|
}
|
||||||
|
|
||||||
// Render
|
// Render
|
||||||
SDL_RenderClear(renderer);
|
SDL_RenderClear(renderer);
|
||||||
|
|||||||