mirror of
https://github.com/Motschen/Adventura.git
synced 2025-12-13 10:25:09 +01:00
feat: sound effects & working death
This commit is contained in:
@@ -154,6 +154,8 @@ else()
|
|||||||
copy_helper("assets/Inter-VariableFont.ttf")
|
copy_helper("assets/Inter-VariableFont.ttf")
|
||||||
copy_helper("assets/MartianMono-VariableFont.ttf")
|
copy_helper("assets/MartianMono-VariableFont.ttf")
|
||||||
copy_helper("assets/sunset_on_the_beach.ogg")
|
copy_helper("assets/sunset_on_the_beach.ogg")
|
||||||
|
copy_helper("assets/success.ogg")
|
||||||
|
copy_helper("assets/failure.ogg")
|
||||||
copy_helper("assets/gs_tiger.svg")
|
copy_helper("assets/gs_tiger.svg")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
"Sunset On The Beach" Kumiku
|
"Sunset On The Beach" Kumiku
|
||||||
Licensed under CC0 1.0
|
Licensed under CC0 1.0
|
||||||
https://freemusicarchive.org/music/Komiku/Poupis_incredible_adventures_/Komiku_-_Poupis_incredible_adventures__-_55_Sunset_on_the_beach/
|
https://freemusicarchive.org/music/Komiku/Poupis_incredible_adventures_/Komiku_-_Poupis_incredible_adventures__-_55_Sunset_on_the_beach/
|
||||||
|
|
||||||
|
Success sound (CC0): https://freesound.org/people/jolup123/sounds/668791/
|
||||||
|
Failure sound (CC0): https://freesound.org/people/_def/sounds/751863/
|
||||||
BIN
src/assets/failure.ogg
Normal file
BIN
src/assets/failure.ogg
Normal file
Binary file not shown.
BIN
src/assets/success.ogg
Normal file
BIN
src/assets/success.ogg
Normal file
Binary file not shown.
18
src/events.hpp
Normal file
18
src/events.hpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
|
const Uint32 playerDeathEvent = SDL_RegisterEvents(1);
|
||||||
|
static SDL_Event ADVENTURA_DEATH_EVENT;
|
||||||
|
|
||||||
|
static void registerEvents() {
|
||||||
|
if (playerDeathEvent != 0) {
|
||||||
|
SDL_Event event;
|
||||||
|
SDL_zero(ADVENTURA_DEATH_EVENT);
|
||||||
|
ADVENTURA_DEATH_EVENT.type = playerDeathEvent;
|
||||||
|
ADVENTURA_DEATH_EVENT.user.code = 1;
|
||||||
|
SDL_PushEvent(&event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void emitDeathEvent() {
|
||||||
|
SDL_PushEvent(&ADVENTURA_DEATH_EVENT);
|
||||||
|
}
|
||||||
22
src/main.cpp
22
src/main.cpp
@@ -9,6 +9,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include "adventura.cpp"
|
#include "adventura.cpp"
|
||||||
|
#include "events.hpp"
|
||||||
|
|
||||||
constexpr uint32_t windowStartWidth = 1200;
|
constexpr uint32_t windowStartWidth = 1200;
|
||||||
constexpr uint32_t windowStartHeight = 800;
|
constexpr uint32_t windowStartHeight = 800;
|
||||||
@@ -16,6 +17,7 @@ constexpr uint32_t windowStartHeight = 800;
|
|||||||
void loadWorld(void* appstate, string worldFile);
|
void loadWorld(void* appstate, string worldFile);
|
||||||
void resetWorld(void* appstate);
|
void resetWorld(void* appstate);
|
||||||
void loadNextWorld(void* appstate);
|
void loadNextWorld(void* appstate);
|
||||||
|
void playSound(void* appstate, string soundFile);
|
||||||
|
|
||||||
struct AppContext {
|
struct AppContext {
|
||||||
SDL_Window* window;
|
SDL_Window* window;
|
||||||
@@ -28,6 +30,7 @@ struct AppContext {
|
|||||||
Player* player;
|
Player* player;
|
||||||
World* world;
|
World* world;
|
||||||
TTF_Font* font;
|
TTF_Font* font;
|
||||||
|
std::filesystem::path basePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
SDL_AppResult SDL_Fail(){
|
SDL_AppResult SDL_Fail(){
|
||||||
@@ -40,6 +43,7 @@ SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[]) {
|
|||||||
if (not SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)){
|
if (not SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)){
|
||||||
return SDL_Fail();
|
return SDL_Fail();
|
||||||
}
|
}
|
||||||
|
registerEvents();
|
||||||
|
|
||||||
// init TTF
|
// init TTF
|
||||||
if (not TTF_Init()) {
|
if (not TTF_Init()) {
|
||||||
@@ -148,7 +152,8 @@ SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[]) {
|
|||||||
.music = music,
|
.music = music,
|
||||||
.player = player,
|
.player = player,
|
||||||
.world = world,
|
.world = world,
|
||||||
.font = font
|
.font = font,
|
||||||
|
.basePath = basePath
|
||||||
};
|
};
|
||||||
loadNextWorld(*appstate);
|
loadNextWorld(*appstate);
|
||||||
|
|
||||||
@@ -177,8 +182,13 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event* event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((*app->player).hasReachedGoal()) {
|
if ((*app->player).hasReachedGoal()) {
|
||||||
|
playSound(appstate, "assets/success.ogg");
|
||||||
loadNextWorld(appstate);
|
loadNextWorld(appstate);
|
||||||
}
|
}
|
||||||
|
if (event->type == playerDeathEvent) {
|
||||||
|
playSound(appstate, "assets/failure.ogg");
|
||||||
|
resetWorld(appstate);
|
||||||
|
}
|
||||||
|
|
||||||
if (event->type == SDL_EVENT_QUIT) {
|
if (event->type == SDL_EVENT_QUIT) {
|
||||||
app->app_quit = SDL_APP_SUCCESS;
|
app->app_quit = SDL_APP_SUCCESS;
|
||||||
@@ -281,4 +291,14 @@ void loadNextWorld(void* appstate) {
|
|||||||
resetWorld(appstate);
|
resetWorld(appstate);
|
||||||
// You won
|
// You won
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
void playSound(void* appstate, string soundFile) {
|
||||||
|
auto* app = (AppContext*)appstate;
|
||||||
|
// load the sound
|
||||||
|
auto soundPath = app->basePath / soundFile;
|
||||||
|
auto sound = Mix_LoadWAV(soundPath.string().c_str());
|
||||||
|
if (not sound) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Mix_PlayChannel(-1, sound, 0);
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "blockPos.hpp"
|
#include "blockPos.hpp"
|
||||||
#include "output.hpp"
|
#include "output.hpp"
|
||||||
|
#include "events.hpp"
|
||||||
|
|
||||||
class Player {
|
class Player {
|
||||||
public:
|
public:
|
||||||
@@ -55,7 +56,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setPos(BlockPos newPos) {
|
void setPos(BlockPos newPos) {
|
||||||
if (!world.containsPos(newPos)) {
|
if (!world.containsPos(newPos)) {
|
||||||
alive = false;
|
unalive();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->pos = newPos;
|
this->pos = newPos;
|
||||||
@@ -90,6 +91,7 @@ public:
|
|||||||
playerTexture = DEAD_PLAYER_TEXTURE;
|
playerTexture = DEAD_PLAYER_TEXTURE;
|
||||||
//redraw(world, this->mapToWorldspace());
|
//redraw(world, this->mapToWorldspace());
|
||||||
alive = false;
|
alive = false;
|
||||||
|
emitDeathEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user