diff options
-rw-r--r-- | mwe/audio/miniaudio/CMakeLists.txt | 19 | ||||
-rw-r--r-- | mwe/audio/miniaudio/main.cpp | 46 | ||||
-rw-r--r-- | readme.md | 27 | ||||
-rw-r--r-- | src/crepe/ScriptSystem.cpp | 1 | ||||
-rw-r--r-- | src/crepe/api/Transform.cpp | 2 | ||||
-rw-r--r-- | src/crepe/api/Transform.h | 2 | ||||
-rw-r--r-- | src/example/audio_internal.cpp | 27 | ||||
-rw-r--r-- | src/example/log.cpp | 17 | ||||
-rw-r--r-- | src/example/script.cpp | 31 | ||||
-rw-r--r-- | src/readme.md | 8 |
10 files changed, 139 insertions, 41 deletions
diff --git a/mwe/audio/miniaudio/CMakeLists.txt b/mwe/audio/miniaudio/CMakeLists.txt new file mode 100644 index 0000000..6dd0191 --- /dev/null +++ b/mwe/audio/miniaudio/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.28) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_EXPORT_COMPILE_COMMANDS 1) +set(CMAKE_BUILD_TYPE Debug) + +add_subdirectory(../../../lib/miniaudio miniaudio) + +project(poc C CXX) + +add_executable(main + main.cpp +) + +target_link_libraries(main + miniaudio +) + diff --git a/mwe/audio/miniaudio/main.cpp b/mwe/audio/miniaudio/main.cpp new file mode 100644 index 0000000..bf31898 --- /dev/null +++ b/mwe/audio/miniaudio/main.cpp @@ -0,0 +1,46 @@ +#include <miniaudio.h> + +#include <chrono> +#include <thread> + +using namespace std; +using namespace std::chrono_literals; + +int main() { + ma_engine engine; + ma_engine_init(NULL, &engine); + + // 1. load background track (ogg vorbis) + ma_sound bgm; + ma_sound_init_from_file(&engine, "../bgm.ogg", 0, NULL, NULL, &bgm); + + // 2. load samples (wav) + ma_sound sfx[3]; + ma_sound_init_from_file(&engine, "../sfx1.wav", 0, NULL, NULL, &sfx[0]); + ma_sound_init_from_file(&engine, "../sfx2.wav", 0, NULL, NULL, &sfx[1]); + ma_sound_init_from_file(&engine, "../sfx3.wav", 0, NULL, NULL, &sfx[2]); + + // 3. start the background track + ma_sound_start(&bgm); + + // 4. play samples sequentially while controlling the background track + this_thread::sleep_for(500ms); + ma_sound_start(&sfx[0]); + this_thread::sleep_for(500ms); + ma_sound_start(&sfx[1]); + ma_sound_stop(&bgm); + this_thread::sleep_for(500ms); + ma_sound_start(&sfx[2]); + ma_sound_start(&bgm); // this actually resumes now + this_thread::sleep_for(500ms); + for (unsigned i = 0; i < 3; i++) + ma_sound_seek_to_pcm_frame(&sfx[i], 0); + + // 5. play all samples simultaniously + for (unsigned i = 0; i < 3; i++) + ma_sound_start(&sfx[i]); + this_thread::sleep_for(1000ms); + + ma_engine_uninit(&engine); + return 0; +} @@ -19,28 +19,29 @@ building instructions. ## Installing libraries The expected library (source) versions are included in this repository as git -submodules. Follow these steps for manually building one of the required -libraries from source: +submodules, which may be used if your distro's package manager does not provide +(recent enough versions of) them. To build any of the dependencies, make sure +the submodules are initialized by running: -1. Ensure the git submodules are initialized: - ``` - $ git submodule update --init --recursive --depth 1 - ``` -2. `cd` into the library source folder: +``` +$ git submodule update --init --recursive --depth 1 +``` + +Then, follow these steps for each library you want to install: + +1. Change into the library folder (run **one** of these): ``` $ cd lib/googletest - or $ cd lib/sdl2 - or $ cd lib/soloud/contrib - or $ cd lib/sdl_image ``` -3. Configure the build, run the build and install: +2. Use CMake to configure the build, run the build and install (run **all** of + these): ``` $ cmake -B build -G Ninja - $ ninja -C build - # ninja -C build install + $ cmake --build build + # cmake --install build ``` ## Documentation diff --git a/src/crepe/ScriptSystem.cpp b/src/crepe/ScriptSystem.cpp index d00d474..171b490 100644 --- a/src/crepe/ScriptSystem.cpp +++ b/src/crepe/ScriptSystem.cpp @@ -37,6 +37,7 @@ forward_list<Script *> ScriptSystem::get_scripts() { for (auto behavior_script_ref : behavior_scripts) { BehaviorScript & behavior_script = behavior_script_ref.get(); + if (!behavior_script.active) continue; Script * script = behavior_script.script.get(); if (script == nullptr) continue; scripts.push_front(script); diff --git a/src/crepe/api/Transform.cpp b/src/crepe/api/Transform.cpp index 626cd67..3b218bc 100644 --- a/src/crepe/api/Transform.cpp +++ b/src/crepe/api/Transform.cpp @@ -8,7 +8,7 @@ using namespace crepe::api; -Transform::Transform(uint32_t game_id, Point & point, double rot, double scale) +Transform::Transform(uint32_t game_id, const Point & point, double rot, double scale) : Component(game_id), position(point), rotation(rot), scale(scale) { dbg_trace(); } diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h index c69ec61..c451c16 100644 --- a/src/crepe/api/Transform.h +++ b/src/crepe/api/Transform.h @@ -14,7 +14,7 @@ class Transform : public Component { // works similar (or the same) as those found in GLSL? public: - Transform(uint32_t id, Point &, double, double); + Transform(uint32_t id, const Point &, double, double); ~Transform(); //! Translation (shift) Point position; diff --git a/src/example/audio_internal.cpp b/src/example/audio_internal.cpp index 1199e2d..f35ad9d 100644 --- a/src/example/audio_internal.cpp +++ b/src/example/audio_internal.cpp @@ -5,26 +5,40 @@ #include <crepe/Sound.h> #include <crepe/util/log.h> +#include <crepe/api/Config.h> -#include <chrono> #include <thread> using namespace crepe; +using namespace crepe::api; using namespace std; using namespace std::chrono_literals; using std::make_unique; -int main() { - dbg_trace(); +// Unrelated stuff that is not part of this POC +int _ = [] () { + // Show dbg_trace() output + auto & cfg = api::Config::get_instance(); + cfg.log.level = util::LogLevel::TRACE; + + return 0; // satisfy compiler +}(); + + +int main() { + // Load a background track (Ogg Vorbis) auto bgm = Sound("../mwe/audio/bgm.ogg"); + // Load three short samples (WAV) auto sfx1 = Sound("../mwe/audio/sfx1.wav"); auto sfx2 = Sound("../mwe/audio/sfx2.wav"); auto sfx3 = Sound("../mwe/audio/sfx3.wav"); + // Start the background track bgm.play(); - // play each sample sequentially + // Play each sample sequentially while pausing and resuming the background + // track this_thread::sleep_for(500ms); sfx1.play(); this_thread::sleep_for(500ms); @@ -35,11 +49,12 @@ int main() { bgm.play(); this_thread::sleep_for(500ms); - // play all samples simultaniously + // Play all samples simultaniously sfx1.play(); sfx2.play(); sfx3.play(); this_thread::sleep_for(1000ms); - return 0; + // Stop all audio and exit + return EXIT_SUCCESS; } diff --git a/src/example/log.cpp b/src/example/log.cpp index 3bc6d80..04ab9cd 100644 --- a/src/example/log.cpp +++ b/src/example/log.cpp @@ -9,16 +9,21 @@ using namespace crepe; using namespace crepe::util; -int main() { - auto & cfg = api::Config::get_instance(); +// unrelated setup code +int _ = [] () { // make sure all log messages get printed + auto & cfg = api::Config::get_instance(); cfg.log.level = util::LogLevel::TRACE; + return 0; // satisfy compiler +} (); + +int main() { dbg_trace(); - dbg_logf("cfg.log.color is equal to %d", cfg.log.color); - logf(LogLevel::INFO, "info message!"); - logf(LogLevel::WARNING, "very scary warning"); - logf(LogLevel::ERROR, "fatal error!!!"); + dbg_logf("test printf parameters: %d", 3); + logf(LogLevel::INFO, "info message"); + logf(LogLevel::WARNING, "warning"); + logf(LogLevel::ERROR, "error"); return 0; } diff --git a/src/example/script.cpp b/src/example/script.cpp index 43f1c22..cda9591 100644 --- a/src/example/script.cpp +++ b/src/example/script.cpp @@ -17,27 +17,38 @@ using namespace crepe; using namespace crepe::api; using namespace std; +// Unrelated stuff that is not part of this POC +int _ = [] () { + // Show dbg_trace() output + auto & cfg = api::Config::get_instance(); + cfg.log.level = util::LogLevel::TRACE; + + return 0; // satisfy compiler +}(); + + + +// User-defined script: class MyScript : public Script { void update() { + // Retrieve component from the same GameObject this script is on Transform & test = get_component<Transform>(); dbg_logf("Transform(%.2f, %.2f)", test.position.x, test.position.y); } }; int main() { - auto & cfg = api::Config::get_instance(); - cfg.log.level = util::LogLevel::TRACE; - + // Create game object with Transform and BehaviorScript components auto obj = GameObject(0, "name", "tag", 0); - Point point = { - .x = 1.2, - .y = 3.4, - }; - obj.add_component<Transform>(point, 0, 0); + obj.add_component<Transform>(Point { .x = 1.2, .y = 3.4, }, 0, 0); obj.add_component<BehaviorScript>().set_script<MyScript>(); + // Get ScriptSystem singleton instance (this would normally be done from the + // game loop) auto & sys = ScriptSystem::get_instance(); - sys.update(); // -> MyScript::update + // Update all scripts. This should result in MyScript::update being called + sys.update(); - return 0; + return EXIT_SUCCESS; } + diff --git a/src/readme.md b/src/readme.md index a8ffc51..15fa6f3 100644 --- a/src/readme.md +++ b/src/readme.md @@ -8,27 +8,27 @@ Examples (using Ninja): ``` $ cmake -B build -G Ninja -$ ninja -C build +$ cmake --build build ``` Unit tests can be built by explicitly specifying the target `test_main` when running the build command: ``` -$ ninja -C build test_main +$ cmake --build build --target test_main ``` Each source file in the example/ folder corresponds to a CMake target as well (all examples can be built at once by specifying the `examples` target): ``` -$ ninja -C build audio_internal components_internal +$ cmake --build build --target audio_internal script ``` For installing crêpe system-wide after building (install must be run with elevated privileges): ``` -# ninja -C build install +# cmake --install build ``` |