From 8ffb27ab09ff567a159e5be5a243fd3967084977 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 3 Feb 2019 16:10:44 -0500 Subject: Very basic ECS --- src/simulation.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/simulation.cpp (limited to 'src/simulation.cpp') diff --git a/src/simulation.cpp b/src/simulation.cpp new file mode 100644 index 0000000..3079f56 --- /dev/null +++ b/src/simulation.cpp @@ -0,0 +1,115 @@ +#include "simulation.h" + +#include "consts.h" +#include "level.h" + +void Simulation::tick( + double dt, + const Uint8* keystate) +{ + for (id_type id : active_) + { + Entity& entity = entities_.at(id); + + // Control + if (entity.player && + !entity.moving) + { + if (keystate[SDL_SCANCODE_LEFT] && + entity.gridPos.x() > 0 && + level_.getTileset().canPlayerMoveTo( + level_.at(entity.gridPos - vec2s { 1, 0 }))) + { + entity.moving = true; + entity.destPos = entity.gridPos - vec2s { 1, 0 }; + } + else if (keystate[SDL_SCANCODE_UP] && + entity.gridPos.y() > 0 && + level_.getTileset().canPlayerMoveTo( + level_.at(entity.gridPos - vec2s { 0, 1 }))) + { + entity.moving = true; + entity.destPos = entity.gridPos - vec2s { 0, 1 }; + } else if (keystate[SDL_SCANCODE_RIGHT] && + entity.gridPos.x() < (level_.getSize().w() - 1) && + level_.getTileset().canPlayerMoveTo( + level_.at(entity.gridPos + vec2s { 1, 0 }))) + { + entity.moving = true; + entity.destPos = entity.gridPos + vec2s { 1, 0 }; + } + else if (keystate[SDL_SCANCODE_DOWN] && + entity.gridPos.y() < (level_.getSize().h() - 1) && + level_.getTileset().canPlayerMoveTo( + level_.at(entity.gridPos + vec2s { 0, 1 }))) + { + entity.moving = true; + entity.destPos = entity.gridPos + vec2s { 0, 1 }; + } + + if (entity.moving) + { + entity.movementTween = 0.0; + } + } + + + + + // Collision + + + + + // Movement + if (entity.moving) + { + entity.movementTween += entity.speed * dt; + + if (entity.movementTween >= 1.0) + { + entity.moving = false; + entity.gridPos = entity.destPos; + } + } + + if (entity.moving) + { + entity.pos.x() = + TILE_SIZE.x() * entity.destPos.x() * entity.movementTween + + TILE_SIZE.x() * entity.gridPos.x() * (1.0 - entity.movementTween); + + entity.pos.y() = + TILE_SIZE.y() * entity.destPos.y() * entity.movementTween + + TILE_SIZE.y() * entity.gridPos.y() * (1.0 - entity.movementTween); + } else { + entity.pos = TILE_SIZE * entity.gridPos; + } + } +} + +Simulation::id_type Simulation::emplaceEntity() +{ + id_type nextId; + + if (!available_.empty()) + { + nextId = available_.front(); + available_.pop_front(); + + entities_.at(nextId) = Entity(); + } else { + nextId = entities_.size(); + entities_.emplace_back(); + } + + active_.insert(nextId); + + return nextId; +} + +void Simulation::deleteEntity(id_type id) +{ + available_.push_back(id); + active_.erase(id); +} -- cgit 1.4.1