diff options
author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-07 15:21:54 +0100 |
---|---|---|
committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-07 15:21:54 +0100 |
commit | 0f2451f4d48c78426c2663501e6cdd6871f1e94a (patch) | |
tree | 5015832f112093ec9fcefcb22800657ea28e064c /src/example | |
parent | f05458cdbf68e8efe1ed812f57e957921921941d (diff) | |
parent | fdb4c99e139a264d4e15e6913a3756fc6cccb2f2 (diff) |
Merge branch 'master' of https://github.com/lonkaars/crepe into wouter/gameloop
Diffstat (limited to 'src/example')
-rw-r--r-- | src/example/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/example/button.cpp | 54 | ||||
-rw-r--r-- | src/example/game.cpp | 255 | ||||
-rw-r--r-- | src/example/rendering_particle.cpp | 88 |
4 files changed, 356 insertions, 43 deletions
diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 6f92d45..8ef71bb 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -19,3 +19,5 @@ endfunction() add_example(asset_manager) add_example(savemgr) add_example(rendering_particle) +add_example(game) +add_example(button) diff --git a/src/example/button.cpp b/src/example/button.cpp new file mode 100644 index 0000000..00bdc28 --- /dev/null +++ b/src/example/button.cpp @@ -0,0 +1,54 @@ +#include <SDL2/SDL_timer.h> +#include <chrono> +#include <crepe/Component.h> +#include <crepe/ComponentManager.h> +#include <crepe/api/Animator.h> +#include <crepe/api/Button.h> +#include <crepe/api/Camera.h> +#include <crepe/api/Color.h> +#include <crepe/api/EventManager.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Texture.h> +#include <crepe/api/Transform.h> +#include <crepe/system/AnimatorSystem.h> +#include <crepe/system/InputSystem.h> +#include <crepe/system/RenderSystem.h> +#include <crepe/types.h> +#include <iostream> +using namespace crepe; +using namespace std; + +int main(int argc, char * argv[]) { + ComponentManager mgr; + RenderSystem sys{mgr}; + EventManager & event_mgr = EventManager::get_instance(); + InputSystem input_sys{mgr}; + AnimatorSystem asys{mgr}; + GameObject camera_obj = mgr.new_object("", "", vec2{1000, 1000}, 0, 1); + camera_obj.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); + + GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); + auto s2 = Texture("asset/texture/test_ap43.png"); + bool button_clicked = false; + auto & sprite2 = button_obj.add_component<Sprite>( + s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100); + std::function<void()> on_click = [&]() { std::cout << "button clicked" << std::endl; }; + std::function<void()> on_enter = [&]() { std::cout << "enter" << std::endl; }; + std::function<void()> on_exit = [&]() { std::cout << "exit" << std::endl; }; + auto & button + = button_obj.add_component<Button>(vec2{100, 100}, 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; + auto start = std::chrono::steady_clock::now(); + while (true) { + input_sys.update(); + sys.update(); + asys.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..4239c15 --- /dev/null +++ b/src/example/game.cpp @@ -0,0 +1,255 @@ +#include "api/CircleCollider.h" +#include "api/Scene.h" +#include "manager/ComponentManager.h" +#include "manager/Mediator.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/Texture.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: { + Transform & tf = this->get_component<Transform>(); + tf.position.x -= 1; + break; + } + case Keycode::W: { + Transform & tf = this->get_component<Transform>(); + tf.position.y -= 1; + break; + } + case Keycode::S: { + Transform & tf = this->get_component<Transform>(); + tf.position.y += 1; + break; + } + case Keycode::D: { + Transform & tf = this->get_component<Transform>(); + tf.position.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; + } + 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 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() { + + Mediator & m = this->mediator; + ComponentManager & mgr = m.component_manager; + 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 = mgr.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}, + .collision_layers = {0}, + }); + world.add_component<BoxCollider>( + vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}, + vec2{world_collider, world_collider}); + ; // Top + world.add_component<BoxCollider>(vec2{0, screen_size_height / 2 + world_collider / 2}, + vec2{world_collider, world_collider}); // Bottom + world.add_component<BoxCollider>( + vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}, + vec2{world_collider, world_collider}); // Left + world.add_component<BoxCollider>(vec2{screen_size_width / 2 + world_collider / 2, 0}, + vec2{world_collider, world_collider}); // right + world.add_component<Camera>( + Color::WHITE, + ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, + vec2{screen_size_width, screen_size_height}, 1.0f); + + GameObject game_object1 = mgr.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 = 0, + .body_type = Rigidbody::BodyType::DYNAMIC, + .linear_velocity = {0, 0}, + .constraints = {0, 0, 0}, + .elastisity_coefficient = 1, + .offset = {0, 0}, + .collision_layers = {0}, + }); + // add box with boxcollider + game_object1.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20}); + game_object1.add_component<BehaviorScript>().set_script<MyScript1>(); + auto img1 = Texture("asset/texture/square.png"); + game_object1.add_component<Sprite>(img1, color, Sprite::FlipSettings{false, false}, 1, + 1, 20); + + //add circle with cirlcecollider deactiveated + game_object1.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + auto img2 = Texture("asset/texture/circle.png"); + game_object1 + .add_component<Sprite>(img2, color, Sprite::FlipSettings{false, false}, 1, 1, 20) + .active + = false; + + GameObject game_object2 = mgr.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}, + .collision_layers = {0}, + }); + // add box with boxcollider + game_object2.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20}); + game_object2.add_component<BehaviorScript>().set_script<MyScript2>(); + auto img3 = Texture("asset/texture/square.png"); + game_object2.add_component<Sprite>(img3, color, Sprite::FlipSettings{false, false}, 1, + 1, 20); + + //add circle with cirlcecollider deactiveated + game_object2.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + auto img4 = Texture("asset/texture/circle.png"); + game_object2 + .add_component<Sprite>(img4, color, Sprite::FlipSettings{false, false}, 1, 1, 20) + .active + = false; + } + + 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/rendering_particle.cpp b/src/example/rendering_particle.cpp index 349d11e..29d475d 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,43 +1,22 @@ -#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 <crepe/Component.h> +#include <crepe/api/Animator.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/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); - - 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); - - //game_object.add_component<Animator>(test_sprite, 4, 1, 0).active = true; - game_object.add_component<Animator>(test_sprite, 1, 1, 0).active = true; - - /* +/* auto & test = game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{ .position = {0, 0}, .max_particles = 10, @@ -59,25 +38,48 @@ int main(int argc, char * argv[]) { }); */ - auto & cam = game_object.add_component<Camera>(Color::RED, ivec2{1080, 720}, - vec2{2000, 2000}, 1.0f); +class TestScene : public Scene { +public: + void load_scene() { + Mediator & mediator = this->mediator; + ComponentManager & mgr = mediator.component_manager; + GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 1); - /* - 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; - */ + Color color(255, 255, 255, 255); + + auto img = Texture("asset/spritesheet/pokemon_spritesheet.png"); + + 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 = {100, 0}, + }); - 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 & anim = game_object.add_component<Animator>(test_sprite, 4, 4, + Animator::Data{ + .fps = 1, + .looping = false, + }); + anim.set_anim(2); + anim.active = false; + + auto & cam = game_object.add_component<Camera>(ivec2{1280, 720}, vec2{400, 400}, + Camera::Data{ + .bg_color = Color::WHITE, + }); } + string get_name() const { return "TestScene"; }; +}; + +int main(int argc, char * argv[]) { + LoopManager engine; + engine.add_scene<TestScene>(); + engine.start(); return 0; } |