diff options
Diffstat (limited to 'src/example')
-rw-r--r-- | src/example/AITest.cpp | 90 | ||||
-rw-r--r-- | src/example/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/example/FontExample.cpp | 55 | ||||
-rw-r--r-- | src/example/asset_manager.cpp | 36 | ||||
-rw-r--r-- | src/example/button.cpp | 41 | ||||
-rw-r--r-- | src/example/game.cpp | 292 | ||||
-rw-r--r-- | src/example/gameloop.cpp | 7 | ||||
-rw-r--r-- | src/example/loadfont.cpp | 49 | ||||
-rw-r--r-- | src/example/rendering_particle.cpp | 103 | ||||
-rw-r--r-- | src/example/savemgr.cpp | 44 |
10 files changed, 584 insertions, 142 deletions
diff --git a/src/example/AITest.cpp b/src/example/AITest.cpp new file mode 100644 index 0000000..93ba500 --- /dev/null +++ b/src/example/AITest.cpp @@ -0,0 +1,90 @@ +#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..f62414e 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -16,8 +16,9 @@ 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(game) +add_example(button) +add_example(loadfont) +add_example(FontExample) +add_example(AITest) diff --git a/src/example/FontExample.cpp b/src/example/FontExample.cpp new file mode 100644 index 0000000..6a334b1 --- /dev/null +++ b/src/example/FontExample.cpp @@ -0,0 +1,55 @@ +#include <SDL2/SDL_ttf.h> +#include <chrono> +#include <crepe/api/Camera.h> +#include <crepe/api/Config.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/LoopManager.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Script.h> +#include <crepe/api/Text.h> +#include <crepe/facade/Font.h> +#include <crepe/facade/SDLContext.h> +#include <crepe/manager/EventManager.h> +#include <crepe/manager/Mediator.h> +#include <crepe/manager/ResourceManager.h> +#include <exception> +#include <iostream> +#include <memory> +using namespace crepe; +using namespace std; +using namespace std::chrono; +class TestScript : public Script { +public: + steady_clock::time_point start_time; + virtual void init() override { start_time = steady_clock::now(); } + virtual void update() override { + auto now = steady_clock::now(); + auto elapsed = duration_cast<seconds>(now - start_time).count(); + + if (elapsed >= 5) { + Mediator & med = mediator; + EventManager & event_mgr = med.event_manager; + event_mgr.trigger_event<ShutDownEvent>(); + } + } +}; +class TestScene : public Scene { +public: + void load_scene() override { + GameObject text_object = this->new_object("test", "test", vec2{0, 0}, 0, 1); + text_object.add_component<Text>(vec2(100, 100), vec2(0, 0), "OpenSymbol", + Text::Data{}); + text_object.add_component<BehaviorScript>().set_script<TestScript>(); + text_object.add_component<Camera>(ivec2{300, 300}, vec2{100, 100}, Camera::Data{}); + } + std::string get_name() const override { return "hey"; } +}; +int main() { + // Config& config = Config::get_instance(); + // config.log.level = Log::Level::TRACE; + LoopManager engine; + engine.add_scene<TestScene>(); + engine.start(); + + return 0; +} diff --git a/src/example/asset_manager.cpp b/src/example/asset_manager.cpp deleted file mode 100644 index 660b318..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..4220588 --- /dev/null +++ b/src/example/button.cpp @@ -0,0 +1,41 @@ +#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/game.cpp b/src/example/game.cpp new file mode 100644 index 0000000..22effd2 --- /dev/null +++ b/src/example/game.cpp @@ -0,0 +1,292 @@ +#include "api/CircleCollider.h" +#include "api/ParticleEmitter.h" +#include "api/Scene.h" +#include "manager/ComponentManager.h" +#include "manager/Mediator.h" +#include "types.h" +#include <crepe/api/BoxCollider.h> +#include <crepe/api/Camera.h> +#include <crepe/api/Color.h> +#include <crepe/api/Event.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/LoopManager.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/api/Script.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Transform.h> +#include <crepe/api/Vector2.h> + +using namespace crepe; + +using namespace std; + +class MyScript1 : public Script { + bool flip = false; + bool oncollision(const CollisionEvent & test) { + Log::logf("Box {} script on_collision()", test.info.this_collider.game_object_id); + return true; + } + bool keypressed(const KeyPressEvent & test) { + Log::logf("Box script keypressed()"); + switch (test.key) { + case Keycode::A: { + Rigidbody & tf = this->get_component<Rigidbody>(); + tf.data.linear_velocity.x -= 1; + break; + } + case Keycode::W: { + Rigidbody & tf = this->get_component<Rigidbody>(); + // tf.data.linear_velocity.y -= 1; + tf.add_force_linear({0, -1}); + break; + } + case Keycode::S: { + Rigidbody & tf = this->get_component<Rigidbody>(); + tf.data.linear_velocity.y += 1; + break; + } + case Keycode::D: { + Rigidbody & tf = this->get_component<Rigidbody>(); + tf.data.linear_velocity.x += 1; + break; + } + case Keycode::E: { + if (flip) { + flip = false; + this->get_component<BoxCollider>().active = true; + this->get_components<Sprite>()[0].get().active = true; + this->get_component<CircleCollider>().active = false; + this->get_components<Sprite>()[1].get().active = false; + } else { + flip = true; + this->get_component<BoxCollider>().active = false; + this->get_components<Sprite>()[0].get().active = false; + this->get_component<CircleCollider>().active = true; + this->get_components<Sprite>()[1].get().active = true; + } + + //add collider switch + break; + } + case Keycode::Q: { + Rigidbody & rg = this->get_component<Rigidbody>(); + rg.data.angular_velocity = 1; + break; + } + default: + break; + } + return false; + } + + void init() { + Log::logf("init"); + subscribe<CollisionEvent>( + [this](const CollisionEvent & ev) -> bool { return this->oncollision(ev); }); + subscribe<KeyPressEvent>( + [this](const KeyPressEvent & ev) -> bool { return this->keypressed(ev); }); + } + void update() { + Rigidbody & tf = this->get_component<Rigidbody>(); + Log::logf("linear_velocity.x {}", tf.data.linear_velocity.x); + Log::logf("linear_velocity.y {}", tf.data.linear_velocity.y); + // tf.data.linear_velocity = {0,0}; + } +}; + +class MyScript2 : public Script { + bool flip = false; + bool oncollision(const CollisionEvent & test) { + Log::logf("Box {} script on_collision()", test.info.this_collider.game_object_id); + return true; + } + bool keypressed(const KeyPressEvent & test) { + Log::logf("Box script keypressed()"); + switch (test.key) { + case Keycode::LEFT: { + Transform & tf = this->get_component<Transform>(); + tf.position.x -= 1; + break; + } + case Keycode::UP: { + Transform & tf = this->get_component<Transform>(); + tf.position.y -= 1; + break; + } + case Keycode::DOWN: { + Transform & tf = this->get_component<Transform>(); + tf.position.y += 1; + break; + } + case Keycode::RIGHT: { + Transform & tf = this->get_component<Transform>(); + tf.position.x += 1; + break; + } + case Keycode::PAUSE: { + if (flip) { + flip = false; + this->get_component<BoxCollider>().active = true; + this->get_components<Sprite>()[0].get().active = true; + this->get_component<CircleCollider>().active = false; + this->get_components<Sprite>()[1].get().active = false; + } else { + flip = true; + this->get_component<BoxCollider>().active = false; + this->get_components<Sprite>()[0].get().active = false; + this->get_component<CircleCollider>().active = true; + this->get_components<Sprite>()[1].get().active = true; + } + + //add collider switch + break; + } + default: + break; + } + return false; + } + + void init() { + Log::logf("init"); + subscribe<CollisionEvent>( + [this](const CollisionEvent & ev) -> bool { return this->oncollision(ev); }); + subscribe<KeyPressEvent>( + [this](const KeyPressEvent & ev) -> bool { return this->keypressed(ev); }); + } + void update() { + // Retrieve component from the same GameObject this script is on + } +}; + +class ConcreteScene1 : public Scene { +public: + using Scene::Scene; + + void load_scene() { + + Color color(0, 0, 0, 255); + + float screen_size_width = 320; + float screen_size_height = 240; + float world_collider = 1000; + //define playable world + GameObject world = new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + world.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 0, + .gravity_scale = 0, + .body_type = Rigidbody::BodyType::STATIC, + .offset = {0, 0}, + }); + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{screen_size_width / 2 + world_collider / 2, 0}); // right + world.add_component<Camera>( + ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, + vec2{screen_size_width, screen_size_height}, + Camera::Data{ + .bg_color = Color::WHITE, + .zoom = 1, + }); + + GameObject game_object1 = new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + game_object1.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 1, + .body_type = Rigidbody::BodyType::DYNAMIC, + .linear_velocity = {0, 1}, + .constraints = {0, 0, 0}, + .elastisity_coefficient = 0, + .offset = {0, 0}, + }); + // add box with boxcollider + game_object1.add_component<BoxCollider>(vec2{20, 20}); + game_object1.add_component<BehaviorScript>().set_script<MyScript1>(); + + Asset img1{"asset/texture/square.png"}; + game_object1.add_component<Sprite>(img1, Sprite::Data{ + .size = {20, 20}, + }); + + //add circle with cirlcecollider deactiveated + game_object1.add_component<CircleCollider>(10).active = false; + Asset img2{"asset/texture/circle.png"}; + game_object1 + .add_component<Sprite>(img2, + Sprite::Data{ + .size = {20, 20}, + }) + .active + = false; + + GameObject game_object2 = new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + game_object2.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 0, + .body_type = Rigidbody::BodyType::STATIC, + .linear_velocity = {0, 0}, + .constraints = {0, 0, 0}, + .elastisity_coefficient = 1, + .offset = {0, 0}, + }); + // add box with boxcollider + game_object2.add_component<BoxCollider>(vec2{20, 20}); + game_object2.add_component<BehaviorScript>().set_script<MyScript2>(); + + game_object2.add_component<Sprite>(img1, Sprite::Data{ + .size = {20, 20}, + }); + + //add circle with cirlcecollider deactiveated + game_object2.add_component<CircleCollider>(10).active = false; + + game_object2 + .add_component<Sprite>(img2, + Sprite::Data{ + .size = {20, 20}, + }) + .active + = false; + Asset img5{"asset/texture/square.png"}; + + GameObject particle = new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{ + .size = {5, 5}, + }); + auto & test + = particle.add_component<ParticleEmitter>(particle_image, ParticleEmitter::Data{ + .offset = {0, 0}, + .max_particles = 256, + .emission_rate = 1, + .min_speed = 10, + .max_speed = 20, + .min_angle = -20, + .max_angle = 20, + .begin_lifespan = 0, + .end_lifespan = 5, + }); + } + + string get_name() const { return "scene1"; } +}; + +int main(int argc, char * argv[]) { + + LoopManager gameloop; + gameloop.add_scene<ConcreteScene1>(); + gameloop.start(); + 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..e459332 --- /dev/null +++ b/src/example/loadfont.cpp @@ -0,0 +1,49 @@ +#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 b38e860..add43f4 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,72 +1,73 @@ -#include "api/Camera.h" -#include "system/ParticleSystem.h" -#include "types.h" -#include <SDL2/SDL_timer.h> -#include <crepe/ComponentManager.h> - +#include "api/Asset.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/GameObject.h> +#include <crepe/api/LoopManager.hpp> #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/api/Vector2.h> -#include <crepe/system/RenderSystem.h> - -#include <chrono> +#include <crepe/manager/ComponentManager.h> +#include <crepe/manager/Mediator.h> +#include <crepe/types.h> #include <iostream> -#include <memory> using namespace crepe; using namespace std; -int main(int argc, char * argv[]) { - ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 0.1); - RenderSystem sys{mgr}; - ParticleSystem psys{mgr}; +class TestScene : public Scene { +public: + void load_scene() { + + cout << "TestScene" << endl; + Mediator & mediator = this->mediator; + ComponentManager & mgr = mediator.component_manager; + GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 1); - Color color(255, 255, 255, 255); + Color color(255, 255, 255, 255); - Sprite & test_sprite = game_object.add_component<Sprite>( - make_shared<Texture>("asset/texture/img.png"), color, FlipSettings{false, false}); - test_sprite.order_in_layer = 5; + Asset img{"asset/spritesheet/spritesheet_test.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, - }); - game_object.add_component<Camera>(Color::WHITE); + 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 = {0, 100}, + .angle_offset = 0, + .position_offset = {0, 0}, + }); - game_object - .add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), color, - FlipSettings{false, false}) - .order_in_layer - = 6; + //auto & anim = game_object.add_component<Animator>(test_sprite,ivec2{32, 64}, uvec2{4,1}, Animator::Data{}); + //anim.set_anim(0); - auto start = std::chrono::steady_clock::now(); - while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { - psys.update(); - sys.update(); - SDL_Delay(10); + auto & cam = game_object.add_component<Camera>(ivec2{720, 1280}, vec2{400, 400}, + Camera::Data{ + .bg_color = Color::WHITE, + }); + + function<void()> on_click = [&]() { cout << "button clicked" << std::endl; }; + function<void()> on_enter = [&]() { cout << "enter" << std::endl; }; + function<void()> on_exit = [&]() { cout << "exit" << std::endl; }; + + auto & button + = game_object.add_component<Button>(vec2{200, 200}, vec2{0, 0}, on_click, false); + button.on_mouse_enter = on_enter; + button.on_mouse_exit = on_exit; + button.is_toggle = true; + button.active = true; } + string get_name() const { return "TestScene"; }; +}; + +int main(int argc, char * argv[]) { + LoopManager engine; + engine.add_scene<TestScene>(); + engine.start(); return 0; } 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; -} |