#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); }