#include "transform_system.h" #include "game.h" #include "map.h" void TransformSystem::initSprite(int spriteId, vec2i loc) { Sprite& sprite = game_.getSprite(spriteId); sprite.loc = loc; spritesByY_.emplace(loc.y(), spriteId); } void TransformSystem::moveSprite(int spriteId, vec2i newLoc) { Sprite& sprite = game_.getSprite(spriteId); bool changedY = (sprite.loc.y() != newLoc.y()); if (changedY) { spritesByY_.erase(std::make_tuple(sprite.loc.y(), spriteId)); } sprite.loc = newLoc; if (changedY) { spritesByY_.emplace(newLoc.y(), spriteId); } } CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Direction dir) { CollisionResult result; Sprite& sprite = game_.getSprite(spriteId); const Map& map = game_.getMap(); bool blocked = false; const vec2i UL_COL_BOX = { 8, 8 }; const vec2i DR_COL_BOX = { 4, 0 }; vec2i oldColPosUL = (sprite.loc - UL_COL_BOX) / map.getTileSize(); vec2i newColPosUL = (newLoc - UL_COL_BOX) / map.getTileSize(); vec2i oldColPosDR = (sprite.loc + DR_COL_BOX) / map.getTileSize(); vec2i newColPosDR = (newLoc + DR_COL_BOX) / map.getTileSize(); if (dirHasDir(sprite.dir, Direction::right) && newColPosDR.x() > oldColPosDR.x()) { for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { if (map.isBlocked(newColPosDR.x(), y)) { result.horiz.blocked = true; result.horiz.dir = Direction::right; break; } } } if (dirHasDir(sprite.dir, Direction::left) && newColPosUL.x() < oldColPosUL.x()) { for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { if (map.isBlocked(newColPosUL.x(), y)) { result.horiz.blocked = true; result.horiz.dir = Direction::left; break; } } } if (dirHasDir(sprite.dir, Direction::down) && newColPosDR.y() > oldColPosDR.y()) { for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { if (map.isBlocked(x, newColPosDR.y())) { result.vert.blocked = true; result.vert.dir = Direction::down; break; } } } if (dirHasDir(sprite.dir, Direction::up) && newColPosUL.y() < oldColPosUL.y()) { for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { if (map.isBlocked(x, newColPosUL.y())) { result.vert.blocked = true; result.vert.dir = Direction::up; break; } } } return result; }