From 683e22c419757744ce853c35d732f607ddb9af16 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 3 Feb 2021 12:33:03 -0500 Subject: Added input system --- src/character_system.cpp | 271 ++++++++++++++++++++++++----------------------- 1 file changed, 138 insertions(+), 133 deletions(-) (limited to 'src/character_system.cpp') diff --git a/src/character_system.cpp b/src/character_system.cpp index 64e2f3b..ac0f01a 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp @@ -6,6 +6,11 @@ #include "transform_system.h" #include "animation_system.h" +void CharacterSystem::initSprite(int spriteId) { + Sprite& sprite = game_.getSprite(spriteId); + sprite.orientable = true; +} + void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { Sprite& leader = game_.getSprite(leaderId); Sprite& follower = game_.getSprite(followerId); @@ -18,146 +23,124 @@ void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { game_.getSystem().setSpriteAnimation(followerId, "still"); } -void CharacterSystem::moveSprite(int spriteId, Mixer& mixer, const Input& keystate) { +void CharacterSystem::moveInDirection(int spriteId, Direction dir) { Sprite& sprite = game_.getSprite(spriteId); - Direction dir = sprite.dir; - - if (!keystate.up && !keystate.down && !keystate.left && !keystate.right) { - if (sprite.characterState != CharacterState::Running) { - if (sprite.characterState == CharacterState::Normal) { - game_.getSystem().setSpriteAnimation(spriteId, "still"); - for (int followerId : sprite.followers) { - game_.getSystem().setSpriteAnimation(followerId, "still"); - } - } - - return; - } - } else { - if (keystate.up) - { - dir = Direction::up; - } else if (keystate.down) - { - dir = Direction::down; - } - if (keystate.left) - { - if (dir == Direction::up) { - dir = Direction::up_left; - } else if (dir == Direction::down) { - dir = Direction::down_left; - } else { - dir = Direction::left; - } - } else if (keystate.right) - { - if (dir == Direction::up) { - dir = Direction::up_right; - } else if (dir == Direction::down) { - dir = Direction::down_right; - } else { - dir = Direction::right; - } - } - } - - vec2i pLoc = sprite.loc; game_.getSystem().setSpriteDirection(spriteId, dir); - if (sprite.characterState == CharacterState::Crouching) { + if (sprite.characterState == CharacterState::Still) { + setPartyState(spriteId, CharacterState::Walking); + } else if (sprite.characterState == CharacterState::Crouching) { for (int followerId : sprite.followers) { game_.getSystem().setSpriteDirection(followerId, dir); } - - return; } +} - int speed = MOVEMENT_SPEED; - if (sprite.characterState == CharacterState::Running) { - speed *= 2; - } else { - game_.getSystem().setSpriteAnimation(spriteId, "walk"); - for (int followerId : sprite.followers) { - game_.getSystem().setSpriteAnimation(followerId, "walk"); - } - } +void CharacterSystem::stopDirecting(int spriteId) { + Sprite& sprite = game_.getSprite(spriteId); - pLoc += (unitVecInDirection(dir) * speed); - - // Check collision. - 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 = (pLoc - UL_COL_BOX) / map.getTileSize(); - vec2i oldColPosDR = (sprite.loc + DR_COL_BOX) / map.getTileSize(); - vec2i newColPosDR = (pLoc + DR_COL_BOX) / map.getTileSize(); - - if (dirHasDir(dir, Direction::right) && - newColPosDR.x() > oldColPosDR.x()) { - for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { - if (map.isBlocked(newColPosDR.x(), y)) { - blocked = true; - pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; - break; - } - } + if (sprite.characterState == CharacterState::Walking) { + setPartyState(spriteId, CharacterState::Still); } +} - if (dirHasDir(dir, Direction::left) && - newColPosUL.x() < oldColPosUL.x()) { - for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { - if (map.isBlocked(newColPosUL.x(), y)) { - blocked = true; - pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; - break; - } - } - } +void CharacterSystem::tick(double dt) { + inputTimer_.accumulate(dt); + while (inputTimer_.step()) { + for (int spriteId : game_.getSprites()) { + Sprite& sprite = game_.getSprite(spriteId); - if (dirHasDir(dir, Direction::down) && - newColPosDR.y() > oldColPosDR.y()) { - for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { - if (map.isBlocked(x, newColPosDR.y())) { - blocked = true; - pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; - break; - } - } - } + if (sprite.orientable) { + vec2i pLoc = sprite.loc; - if (dirHasDir(dir, Direction::up) && - newColPosUL.y() < oldColPosUL.y()) { - for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { - if (map.isBlocked(x, newColPosUL.y())) { - blocked = true; - pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; - break; - } - } - } + if (sprite.characterState == CharacterState::Still || + sprite.characterState == CharacterState::Crouching) { + continue; + } - if (blocked && sprite.characterState == CharacterState::Running) { - stopRunning(spriteId); - mixer.playSound("../res/bump.wav"); - } + int speed = MOVEMENT_SPEED; + if (sprite.characterState == CharacterState::Running) { + speed *= 2; + } - // Move everything - if (pLoc != sprite.loc) { - game_.getSystem().moveSprite(spriteId, pLoc); + pLoc += (unitVecInDirection(sprite.dir) * speed); + + // Check collision. + 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 = (pLoc - UL_COL_BOX) / map.getTileSize(); + vec2i oldColPosDR = (sprite.loc + DR_COL_BOX) / map.getTileSize(); + vec2i newColPosDR = (pLoc + 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)) { + blocked = true; + pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + break; + } + } + } - for (int followerId : sprite.followers) { - Sprite& pNext = game_.getSprite(followerId); - const Movement& posdir = pNext.trail.front(); - game_.getSystem().moveSprite(followerId, posdir.pos); - game_.getSystem().setSpriteDirection(followerId, posdir.dir); + 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)) { + blocked = true; + pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + break; + } + } + } - pNext.trail.pop_front(); - pNext.trail.push_back({.pos = pLoc, .dir = dir}); + 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())) { + blocked = true; + pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + 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())) { + blocked = true; + pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + break; + } + } + } + + if (blocked && sprite.characterState == CharacterState::Running) { + stopRunning(spriteId); + game_.getMixer().playSound("../res/bump.wav"); + } + + // Move everything + if (pLoc != sprite.loc) { + game_.getSystem().moveSprite(spriteId, pLoc); + + for (int followerId : sprite.followers) { + Sprite& pNext = game_.getSprite(followerId); + const Movement& posdir = pNext.trail.front(); + game_.getSystem().moveSprite(followerId, posdir.pos); + game_.getSystem().setSpriteDirection(followerId, posdir.dir); + + pNext.trail.pop_front(); + pNext.trail.push_back({.pos = pLoc, .dir = sprite.dir}); + } + } + } } } } @@ -168,12 +151,7 @@ void CharacterSystem::beginCrouch(int spriteId) { if (sprite.characterState == CharacterState::Running) { stopRunning(spriteId); } else { - sprite.characterState = CharacterState::Crouching; - - game_.getSystem().setSpriteAnimation(spriteId, "crouch"); - for (int followerId : sprite.followers) { - game_.getSystem().setSpriteAnimation(followerId, "crouch"); - } + setPartyState(spriteId, CharacterState::Crouching); } } @@ -181,12 +159,9 @@ void CharacterSystem::endCrouch(int spriteId) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.characterState == CharacterState::Crouching) { - sprite.characterState = CharacterState::Running; + setPartyState(spriteId, CharacterState::Running); - game_.getSystem().setSpriteAnimation(spriteId, "run"); for (int followerId : sprite.followers) { - game_.getSystem().setSpriteAnimation(followerId, "run"); - // Halve the movement buffer for the followers. Sprite& follower = game_.getSprite(followerId); std::deque newMove; @@ -204,7 +179,7 @@ void CharacterSystem::endCrouch(int spriteId) { void CharacterSystem::stopRunning(int spriteId) { Sprite& sprite = game_.getSprite(spriteId); - sprite.characterState = CharacterState::Normal; + setPartyState(spriteId, CharacterState::Still); // Double the movement buffer for the followers. for (int followerId : sprite.followers) { @@ -227,3 +202,33 @@ void CharacterSystem::stopRunning(int spriteId) { follower.trail = std::move(newMove); } } + +void CharacterSystem::setPartyState(int spriteId, CharacterState state) { + std::string animName; + switch (state) { + case CharacterState::Still: { + animName = "still"; + break; + } + case CharacterState::Walking: { + animName = "walk"; + break; + } + case CharacterState::Crouching: { + animName = "crouch"; + break; + } + case CharacterState::Running: { + animName = "run"; + break; + } + } + + Sprite& sprite = game_.getSprite(spriteId); + sprite.characterState = state; + + game_.getSystem().setSpriteAnimation(spriteId, animName); + for (int followerId : sprite.followers) { + game_.getSystem().setSpriteAnimation(followerId, animName); + } +} -- cgit 1.4.1