diff --git a/assets/game_assets/blueprints/player.json b/assets/game_assets/blueprints/player.json index 5beeaaa76de4bcd6dd4a6d21af77ed41ae9279c8..fd518273dbe9e7a98e00d1dbdadcf1fd0cccec4d 100644 --- a/assets/game_assets/blueprints/player.json +++ b/assets/game_assets/blueprints/player.json @@ -1,12 +1,15 @@ { - "Transform":{ - "scale": {"x": 0.5, "y": 0.5, "z": 0.5} + "Transform": { + "scale": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + } }, "Model": { "aid": "model:cube" }, - "Shadowcaster": { - }, + "Shadowcaster": {}, "Movement": { "beats_per_step": 1, "distance_per_step": 1, @@ -14,5 +17,8 @@ "off_beat_threshold": 0.2 }, "Input_controller": {}, - "Player": {} + "Player": {}, + "Rigid_body": { + "radius": 1.0 + } } diff --git a/src/gameplay/rigid_body_comp.cpp b/src/gameplay/rigid_body_comp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1eaa46378d36521a1feeb4d71ee5296c55b3d609 --- /dev/null +++ b/src/gameplay/rigid_body_comp.cpp @@ -0,0 +1 @@ +#include "rigid_body_comp.hpp" diff --git a/src/gameplay/rigid_body_comp.hpp b/src/gameplay/rigid_body_comp.hpp new file mode 100644 index 0000000000000000000000000000000000000000..77cbb5cc85f17e7a5cc20abcb6af96e14d67715f --- /dev/null +++ b/src/gameplay/rigid_body_comp.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace phase_shifter::gameplay { + struct Rigid_body_comp : public mirrage::ecs::Component { + static constexpr const char* name() { return "Rigid_body"; } + using Component::Component; + + float radius; + }; + + sf2_structDef(Rigid_body_comp, radius); +} // namespace phase_shifter::gameplay diff --git a/src/level/level_system.cpp b/src/level/level_system.cpp index d7cb73252dc47146d29f97bda68fe8a78195bd26..cd66065f8a451ad2b21e66acb23131873946f92d 100644 --- a/src/level/level_system.cpp +++ b/src/level/level_system.cpp @@ -1,5 +1,8 @@ #include "level_system.hpp" +#include "../gameplay/movement_comp.hpp" +#include "../gameplay/player_comp.hpp" +#include "../gameplay/rigid_body_comp.hpp" #include "../gameplay/viewtarget_comp.hpp" #include @@ -12,6 +15,8 @@ namespace phase_shifter::level { Level_system::Level_system(mirrage::ecs::Entity_manager& entities, mirrage::asset::Asset_manager& assets) : _entities(entities), _assets(assets) { + _entities.register_component_type(); + _spawners.emplace("p", [&](const Tile& tile, const glm::vec3& position) { mirrage::ecs::Entity_facet player = _entities.entity_builder(tile.spawns).position(position).create(); @@ -36,6 +41,24 @@ namespace phase_shifter::level { }); } + auto Level_system::update(const mirrage::util::Time& time) -> void + { + for(auto&& [player, movement, transform, rigid_body] : _entities.list()) { + auto origin = glm::vec2{transform.position.x, transform.position.z}; + auto direction = glm::normalize(movement.aim); + auto [hit, contact] = ray_cast(origin, direction); + if(!hit) { + continue; + } + if(contact.distance2 <= rigid_body.radius * rigid_body.radius) { + movement.move = false; + } + } + } + namespace { using action = std::function + #include #include @@ -21,6 +23,7 @@ namespace phase_shifter::level { public: Level_system(mirrage::ecs::Entity_manager& entities, mirrage::asset::Asset_manager& assets); + auto update(const mirrage::util::Time& time) -> void; auto load(const std::string& name) -> void; auto ray_cast(const glm::vec2& origin, const glm::vec2& direction) -> std::pair; diff --git a/src/meta_system.cpp b/src/meta_system.cpp index 011a6a34b10c44c3b48169b2555cc868370a83ec..4bd917813d022e98a09ec112fd5c0c4438a76a38 100644 --- a/src/meta_system.cpp +++ b/src/meta_system.cpp @@ -107,6 +107,7 @@ namespace phase_shifter { _beat_system->update(dt); _input_system->update(dt); + _level_system->update(dt); _movement_system->update(dt); _combat_system->update(dt); _camera_system->update(dt);