aboutsummaryrefslogtreecommitdiff
path: root/src/example
diff options
context:
space:
mode:
Diffstat (limited to 'src/example')
-rw-r--r--src/example/AITest.cpp96
-rw-r--r--src/example/CMakeLists.txt8
-rw-r--r--src/example/asset_manager.cpp36
-rw-r--r--src/example/button.cpp43
-rw-r--r--src/example/gameloop.cpp7
-rw-r--r--src/example/loadfont.cpp51
-rw-r--r--src/example/rendering_particle.cpp111
-rw-r--r--src/example/replay.cpp89
-rw-r--r--src/example/savemgr.cpp44
9 files changed, 334 insertions, 151 deletions
diff --git a/src/example/AITest.cpp b/src/example/AITest.cpp
new file mode 100644
index 0000000..4c4e25e
--- /dev/null
+++ b/src/example/AITest.cpp
@@ -0,0 +1,96 @@
+#include <crepe/api/AI.h>
+#include <crepe/api/BehaviorScript.h>
+#include <crepe/api/Camera.h>
+#include <crepe/api/Color.h>
+#include <crepe/api/GameObject.h>
+#include <crepe/api/LoopManager.h>
+#include <crepe/api/Rigidbody.h>
+#include <crepe/api/Scene.h>
+#include <crepe/api/Script.h>
+#include <crepe/api/Sprite.h>
+#include <crepe/manager/Mediator.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+class Script1 : public Script {
+ bool shutdown(const ShutDownEvent & event) {
+ // Very dirty way of shutting down the game
+ throw "ShutDownEvent";
+ return true;
+ }
+
+ bool mousemove(const MouseMoveEvent & event) {
+ /*RefVector<AI> aivec = this->get_components<AI>();
+ AI & ai = aivec.front().get();
+ ai.flee_target
+ = vec2{static_cast<float>(event.mouse_x), static_cast<float>(event.mouse_y)};*/
+ return true;
+ }
+
+ void init() {
+ subscribe<ShutDownEvent>([this](const ShutDownEvent & ev) -> bool {
+ return this->shutdown(ev);
+ });
+ subscribe<MouseMoveEvent>([this](const MouseMoveEvent & ev) -> bool {
+ return this->mousemove(ev);
+ });
+ }
+};
+
+class Scene1 : public Scene {
+public:
+ void load_scene() override {
+ Mediator & mediator = this->mediator;
+ ComponentManager & mgr = mediator.component_manager;
+
+ GameObject game_object1 = mgr.new_object("", "", vec2 {0, 0}, 0, 1);
+ GameObject game_object2 = mgr.new_object("", "", vec2 {0, 0}, 0, 1);
+
+ Asset img {"asset/texture/test_ap43.png"};
+
+ Sprite & test_sprite = game_object1.add_component<Sprite>(
+ img,
+ Sprite::Data {
+ .color = Color::MAGENTA,
+ .flip = Sprite::FlipSettings {false, false},
+ .sorting_in_layer = 2,
+ .order_in_layer = 2,
+ .size = {0, 100},
+ .angle_offset = 0,
+ .position_offset = {0, 0},
+ }
+ );
+
+ AI & ai = game_object1.add_component<AI>(3000);
+ // ai.arrive_on();
+ // ai.flee_on();
+ ai.path_follow_on();
+ ai.make_oval_path(500, 1000, {0, -1000}, 1.5708, true);
+ ai.make_oval_path(1000, 500, {0, 500}, 4.7124, false);
+ game_object1.add_component<Rigidbody>(Rigidbody::Data {
+ .mass = 0.1f,
+ .max_linear_velocity = 40,
+ });
+ game_object1.add_component<BehaviorScript>().set_script<Script1>();
+
+ game_object2.add_component<Camera>(
+ ivec2 {1080, 720}, vec2 {5000, 5000},
+ Camera::Data {
+ .bg_color = Color::WHITE,
+ .zoom = 1,
+ }
+ );
+ }
+
+ string get_name() const override { return "Scene1"; }
+};
+
+int main() {
+ LoopManager engine;
+ engine.add_scene<Scene1>();
+ engine.start();
+
+ return 0;
+}
diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt
index 560e2bc..afe6cb7 100644
--- a/src/example/CMakeLists.txt
+++ b/src/example/CMakeLists.txt
@@ -16,8 +16,8 @@ function(add_example target_name)
add_dependencies(examples ${target_name})
endfunction()
-add_example(asset_manager)
-add_example(savemgr)
add_example(rendering_particle)
-add_example(gameloop)
-
+add_example(button)
+add_example(replay)
+add_example(loadfont)
+add_example(AITest)
diff --git a/src/example/asset_manager.cpp b/src/example/asset_manager.cpp
deleted file mode 100644
index 917b547..0000000
--- a/src/example/asset_manager.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <crepe/api/AssetManager.h>
-#include <crepe/api/Texture.h>
-#include <crepe/facade/Sound.h>
-
-using namespace crepe;
-
-int main() {
-
- // this needs to be called before the asset manager otherwise the destructor of sdl is not in
- // the right order
- { Texture test("../asset/texture/img.png"); }
- // FIXME: make it so the issue described by the above comment is not possible (i.e. the order
- // in which internal classes are instantiated should not impact the way the engine works).
-
- auto & mgr = AssetManager::get_instance();
-
- {
- // TODO: [design] the Sound class can't be directly included by the user as it includes
- // SoLoud headers.
- auto bgm = mgr.cache<Sound>("../mwe/audio/bgm.ogg");
- auto sfx1 = mgr.cache<Sound>("../mwe/audio/sfx1.wav");
- auto sfx2 = mgr.cache<Sound>("../mwe/audio/sfx2.wav");
-
- auto img = mgr.cache<Texture>("../asset/texture/img.png");
- auto img1 = mgr.cache<Texture>("../asset/texture/second.png");
- }
-
- {
- auto bgm = mgr.cache<Sound>("../mwe/audio/bgm.ogg");
- auto sfx1 = mgr.cache<Sound>("../mwe/audio/sfx1.wav");
- auto sfx2 = mgr.cache<Sound>("../mwe/audio/sfx2.wav");
-
- auto img = mgr.cache<Texture>("../asset/texture/img.png");
- auto img1 = mgr.cache<Texture>("../asset/texture/second.png");
- }
-}
diff --git a/src/example/button.cpp b/src/example/button.cpp
new file mode 100644
index 0000000..ea7f528
--- /dev/null
+++ b/src/example/button.cpp
@@ -0,0 +1,43 @@
+#include <SDL2/SDL_timer.h>
+#include <chrono>
+#include <crepe/Component.h>
+#include <crepe/api/Animator.h>
+#include <crepe/api/Button.h>
+#include <crepe/api/Camera.h>
+#include <crepe/api/Color.h>
+#include <crepe/api/GameObject.h>
+#include <crepe/api/Sprite.h>
+#include <crepe/api/Texture.h>
+#include <crepe/api/Transform.h>
+#include <crepe/facade/SDLContext.h>
+#include <crepe/manager/ComponentManager.h>
+#include <crepe/manager/EventManager.h>
+#include <crepe/system/AnimatorSystem.h>
+#include <crepe/system/InputSystem.h>
+#include <crepe/system/RenderSystem.h>
+#include <crepe/types.h>
+using namespace crepe;
+using namespace std;
+
+int main(int argc, char * argv[]) {
+ Mediator mediator;
+ ComponentManager mgr {mediator};
+ RenderSystem sys {mediator};
+ EventManager event_mgr {mediator};
+ InputSystem input_sys {mediator};
+ SDLContext sdl_context {mediator};
+ GameObject obj = mgr.new_object("camera", "camera", vec2 {0, 0}, 0, 1);
+ auto & camera = obj.add_component<Camera>(
+ ivec2 {500, 500}, vec2 {500, 500},
+ Camera::Data {.bg_color = Color::WHITE, .zoom = 1.0f}
+ );
+ auto start = std::chrono::steady_clock::now();
+ while (true) {
+ const keyboard_state_t & keyboard_state = sdl_context.get_keyboard_state();
+ input_sys.update();
+ sys.update();
+ event_mgr.dispatch_events();
+ SDL_Delay(30);
+ }
+ return 0;
+}
diff --git a/src/example/gameloop.cpp b/src/example/gameloop.cpp
deleted file mode 100644
index a676f20..0000000
--- a/src/example/gameloop.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "crepe/api/LoopManager.h"
-using namespace crepe;
-int main() {
- LoopManager gameloop;
- gameloop.start();
- return 1;
-}
diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp
new file mode 100644
index 0000000..dd7caff
--- /dev/null
+++ b/src/example/loadfont.cpp
@@ -0,0 +1,51 @@
+#include <SDL2/SDL_ttf.h>
+#include <crepe/api/Asset.h>
+#include <crepe/api/Text.h>
+#include <crepe/facade/Font.h>
+#include <crepe/facade/FontFacade.h>
+#include <crepe/facade/SDLContext.h>
+#include <crepe/manager/Mediator.h>
+#include <crepe/manager/ResourceManager.h>
+#include <exception>
+#include <iostream>
+#include <memory>
+#include <optional>
+using namespace crepe;
+int main() {
+
+ // SDLFontContext font_facade;
+ Mediator mediator;
+ FontFacade font_facade {};
+ SDLContext sdl_context {mediator};
+ // ComponentManager component_manager{mediator};
+ ResourceManager resource_manager {mediator};
+ try {
+ // Correct way to create a unique pointer for Text
+ std::unique_ptr<Text> label = std::make_unique<Text>(
+ 1, vec2(100, 100), vec2(0, 0), "OpenSymbol", Text::Data {}, "test text"
+ );
+ // std::cout << "Path: " << label->font.get_path() << std::endl;
+ Asset asset1 = font_facade.get_font_asset("OpenSymbol");
+ std::cout << asset1.get_path() << std::endl;
+ std::unique_ptr<Text> label2 = std::make_unique<Text>(
+ 1, vec2(100, 100), vec2(0, 0), "fsaafdafsdafsdafsdasfdds", Text::Data {}
+ );
+ Asset asset = Asset("test test");
+ label->font.emplace(asset);
+ std::cout << label->font.value().get_path() << std::endl;
+ // label2->font = std::make_optional(asset);
+ // std::cout << "Path: " << label2->font.get_path() << std::endl;
+ ResourceManager & resource_mgr = mediator.resource_manager;
+ const Font & res = resource_manager.get<Font>(label->font.value());
+ // TTF_Font * test_font = res.get_font();
+ // if (test_font == NULL) {
+ // std::cout << "error with font" << std::endl;
+ // } else {
+ // std::cout << "correct font retrieved" << std::endl;
+ // }
+ } catch (const std::exception & e) {
+ std::cout << "Standard exception thrown: " << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp
index 349d11e..e6b31a7 100644
--- a/src/example/rendering_particle.cpp
+++ b/src/example/rendering_particle.cpp
@@ -1,83 +1,74 @@
-#include "api/Animator.h"
-#include "api/Camera.h"
-#include "system/AnimatorSystem.h"
-#include "system/ParticleSystem.h"
-#include <SDL2/SDL_timer.h>
-#include <crepe/ComponentManager.h>
+
+#include "api/Asset.h"
+#include "api/Text.h"
#include <crepe/Component.h>
+#include <crepe/api/Animator.h>
+#include <crepe/api/Button.h>
+#include <crepe/api/Camera.h>
#include <crepe/api/Color.h>
+#include <crepe/api/Engine.h>
#include <crepe/api/GameObject.h>
#include <crepe/api/ParticleEmitter.h>
#include <crepe/api/Rigidbody.h>
#include <crepe/api/Sprite.h>
-#include <crepe/api/Texture.h>
#include <crepe/api/Transform.h>
-#include <crepe/system/RenderSystem.h>
+#include <crepe/manager/ComponentManager.h>
+#include <crepe/manager/Mediator.h>
#include <crepe/types.h>
-#include <chrono>
-
using namespace crepe;
using namespace std;
-int main(int argc, char * argv[]) {
- ComponentManager mgr;
- GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 1);
- RenderSystem sys{mgr};
- ParticleSystem psys{mgr};
- AnimatorSystem asys{mgr};
-
- Color color(255, 255, 255, 100);
+class TestScene : public Scene {
+public:
+ void load_scene() {
+ GameObject game_object = new_object("", "", vec2 {0, 0}, 0, 1);
- auto img = Texture("asset/texture/test_ap43.png");
- Sprite & test_sprite = game_object.add_component<Sprite>(
- img, color, Sprite::FlipSettings{true, true}, 1, 1, 500);
+ Color color(255, 255, 255, 255);
- //game_object.add_component<Animator>(test_sprite, 4, 1, 0).active = true;
- game_object.add_component<Animator>(test_sprite, 1, 1, 0).active = true;
+ Asset img {"asset/spritesheet/pokemon_spritesheet.png"};
- /*
- auto & test = game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{
- .position = {0, 0},
- .max_particles = 10,
- .emission_rate = 0.1,
- .min_speed = 6,
- .max_speed = 20,
- .min_angle = -20,
- .max_angle = 20,
- .begin_lifespan = 0,
- .end_lifespan = 60,
- .force_over_time = vec2{0, 0},
- .boundary{
- .width = 1000,
- .height = 1000,
- .offset = vec2{0, 0},
- .reset_on_exit = false,
- },
- .sprite = test_sprite,
- });
- */
+ Sprite & test_sprite = game_object.add_component<Sprite>(
+ img,
+ Sprite::Data {
+ .color = color,
+ .flip = Sprite::FlipSettings {false, false},
+ .sorting_in_layer = 2,
+ .order_in_layer = 2,
+ .size = {1, 0},
+ .angle_offset = 0,
+ .position_offset = {0, 1},
+ .world_space = false,
+ }
+ );
- auto & cam = game_object.add_component<Camera>(Color::RED, ivec2{1080, 720},
- vec2{2000, 2000}, 1.0f);
+ auto & anim = game_object.add_component<Animator>(
+ test_sprite, ivec2 {56, 56}, uvec2 {4, 4},
+ Animator::Data {
+ .looping = 0,
+ }
+ );
- /*
- game_object
- .add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), color,
- .add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), color,
- FlipSettings{false, false})
- .order_in_layer
- = 6;
- */
+ anim.set_anim(1);
+ anim.pause();
+ anim.next_anim();
- auto start = std::chrono::steady_clock::now();
- while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) {
- psys.update();
- asys.update();
- sys.update();
- SDL_Delay(10);
+ auto & cam = game_object.add_component<Camera>(
+ ivec2 {1280, 720}, vec2 {5, 5},
+ Camera::Data {
+ .bg_color = Color::WHITE,
+ .postion_offset = {1000, 1000},
+ }
+ );
}
+ string get_name() const { return "TestScene"; };
+};
+
+int main(int argc, char * argv[]) {
+ Engine engine;
+ engine.add_scene<TestScene>();
+ engine.main();
return 0;
}
diff --git a/src/example/replay.cpp b/src/example/replay.cpp
new file mode 100644
index 0000000..00a6502
--- /dev/null
+++ b/src/example/replay.cpp
@@ -0,0 +1,89 @@
+#include <crepe/api/Config.h>
+#include <crepe/api/Engine.h>
+#include <crepe/api/Script.h>
+
+using namespace crepe;
+using namespace std;
+
+class AnimationScript : public Script {
+ Transform * transform;
+ float t = 0;
+
+ void init() { transform = &get_component<Transform>(); }
+
+ void update() {
+ t += 0.05;
+ transform->position = {sin(t), cos(t)};
+ }
+};
+
+class Timeline : public Script {
+ unsigned i = 0;
+ recording_t recording;
+
+ void update() {
+ switch (i++) {
+ default:
+ break;
+ case 10:
+ logf("record start");
+ replay.record_start();
+ break;
+ case 60:
+ logf("record end, playing recording");
+ this->recording = replay.record_end();
+ replay.play(this->recording);
+ break;
+ case 61:
+ logf("done, releasing recording");
+ replay.release(this->recording);
+ break;
+ case 72:
+ logf("exit");
+ queue_event<ShutDownEvent>();
+ break;
+ };
+ }
+};
+
+class TestScene : public Scene {
+public:
+ using Scene::Scene;
+
+ void load_scene() {
+ Mediator & mediator = this->mediator;
+ ComponentManager & mgr = mediator.component_manager;
+
+ GameObject cam = mgr.new_object("cam");
+ cam.add_component<Camera>(
+ ivec2 {640, 480}, vec2 {3, 3},
+ Camera::Data {
+ .bg_color = Color::WHITE,
+ }
+ );
+
+ GameObject square = mgr.new_object("square");
+ square.add_component<Sprite>(
+ Asset {"asset/texture/square.png"},
+ Sprite::Data {
+ .size = {0.5, 0.5},
+ }
+ );
+ square.add_component<BehaviorScript>().set_script<AnimationScript>();
+
+ GameObject scapegoat = mgr.new_object("");
+ scapegoat.add_component<BehaviorScript>().set_script<Timeline>();
+ }
+
+ string get_name() const { return "scene1"; }
+};
+
+int main(int argc, char * argv[]) {
+ Config & cfg = Config::get_instance();
+ cfg.log.level = Log::Level::DEBUG;
+
+ Engine engine;
+
+ engine.add_scene<TestScene>();
+ return engine.main();
+}
diff --git a/src/example/savemgr.cpp b/src/example/savemgr.cpp
deleted file mode 100644
index 65c4a34..0000000
--- a/src/example/savemgr.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/** \file
- *
- * Standalone example for usage of the save manager
- */
-
-#include <cassert>
-#include <crepe/api/Config.h>
-#include <crepe/api/SaveManager.h>
-#include <crepe/util/Log.h>
-#include <crepe/util/Proxy.h>
-
-using namespace crepe;
-
-// unrelated setup code
-int _ = []() {
- // make sure all log messages get printed
- auto & cfg = Config::get_instance();
- cfg.log.level = Log::Level::TRACE;
-
- return 0; // satisfy compiler
-}();
-
-int main() {
- const char * key = "mygame.test";
-
- SaveManager & mgr = SaveManager::get_instance();
-
- dbg_logf("has key = {}", mgr.has(key));
- ValueBroker<int> prop = mgr.get<int>(key, 0);
- Proxy<int> val = mgr.get<int>(key, 0);
-
- dbg_logf("val = {}", mgr.get<int>(key).get());
- prop.set(1);
- dbg_logf("val = {}", mgr.get<int>(key).get());
- val = 2;
- dbg_logf("val = {}", mgr.get<int>(key).get());
- mgr.set<int>(key, 3);
- dbg_logf("val = {}", mgr.get<int>(key).get());
-
- dbg_logf("has key = {}", mgr.has(key));
- assert(true == mgr.has(key));
-
- return 0;
-}