From d1df87ce04f6d79fed94ab154fa098ccc83ebab8 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 30 Jan 2021 16:15:55 -0500 Subject: Added crouching/running --- src/party.cpp | 165 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 118 insertions(+), 47 deletions(-) (limited to 'src/party.cpp') diff --git a/src/party.cpp b/src/party.cpp index 28492a9..2af252f 100644 --- a/src/party.cpp +++ b/src/party.cpp @@ -10,10 +10,7 @@ void Party::addMember(Game& game, int spriteId) { if (index > 0) { const Sprite& sprite = game.getSprite(spriteId); - for (int i = 0; i < PARTY_FRAME_DELAY * index; i++) { - newMember.nextPosition.push_back(sprite.loc()); - newMember.nextDirection.push_back(sprite.getDirection()); - } + newMember.movement = std::deque(PARTY_FRAME_DELAY * index, {.pos = sprite.loc(), .dir = sprite.getDirection()}); } members_.push_back(std::move(newMember)); @@ -26,65 +23,139 @@ void Party::move(Game& game, const Input& keystate) { return; } - const Sprite& p1 = game.getSprite(members_[0].spriteId); - vec2i pLoc = p1.loc(); Direction dir = Direction::left; - if (keystate.up) - { - pLoc.y() -= MOVEMENT_SPEED; - dir = Direction::up; - } else if (keystate.down) - { - pLoc.y() += MOVEMENT_SPEED; - dir = Direction::down; - } + if (!keystate.up && !keystate.down && !keystate.left && !keystate.right) { + if (state_ == State::Running) { + dir = lastDir_; + } else { + if (state_ == State::Normal) { + for (int i = 0; i < members_.size(); i++) { + game.setSpriteState(members_[i].spriteId, "still"); + } + } - if (keystate.left) - { - pLoc.x() -= MOVEMENT_SPEED; + return; + } + } else { + if (keystate.up) + { + dir = Direction::up; + } else if (keystate.down) + { + dir = Direction::down; + } - if (dir == Direction::up) { - dir = Direction::up_left; - } else if (dir == Direction::down) { - dir = Direction::down_left; - } else { - dir = Direction::left; + 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; + } } - } else if (keystate.right) - { - pLoc.x() += MOVEMENT_SPEED; - - if (dir == Direction::up) { - dir = Direction::up_right; - } else if (dir == Direction::down) { - dir = Direction::down_right; - } else { - dir = Direction::right; + } + + lastDir_ = dir; + + const Sprite& p1 = game.getSprite(members_[0].spriteId); + vec2i pLoc = p1.loc(); + + if (state_ == State::Crouching) { + for (int i = 0; i < members_.size(); i++) { + game.setSpriteDirection(members_[i].spriteId, dir); } + + return; + } else { + game.setSpriteDirection(members_[0].spriteId, dir); } - if (keystate.up || keystate.down || keystate.left || keystate.right) { + int speed = MOVEMENT_SPEED; + if (state_ == State::Running) { + speed *= 2; + } else { for (int i = 0; i < members_.size(); i++) { game.setSpriteState(members_[i].spriteId, "walk"); } + } - game.moveSprite(members_[0].spriteId, pLoc); - game.setSpriteDirection(members_[0].spriteId, dir); + pLoc += (unitVecInDirection(dir) * speed); + + game.moveSprite(members_[0].spriteId, pLoc); + for (int i = 1; i < members_.size(); i++) { + const Sprite& pNext = game.getSprite(members_[i].spriteId); + const Movement& posdir = members_[i].movement.front(); + game.moveSprite(members_[i].spriteId, posdir.pos); + game.setSpriteDirection(members_[i].spriteId, posdir.dir); + + members_[i].movement.pop_front(); + members_[i].movement.push_back({.pos = pLoc, .dir = dir}); + } +} + +void Party::beginCrouch(Game& game) { + if (state_ == State::Running) { + state_ = State::Normal; + + // Double the movement buffer for the followers. for (int i = 1; i < members_.size(); i++) { - const Sprite& pNext = game.getSprite(members_[i].spriteId); - members_[i].nextPosition.push_back(pLoc); - game.moveSprite(members_[i].spriteId, members_[i].nextPosition.front()); - members_[i].nextPosition.pop_front(); - - members_[i].nextDirection.push_back(dir); - game.setSpriteDirection(members_[i].spriteId, members_[i].nextDirection.front()); - members_[i].nextDirection.pop_front(); + std::deque newMove; + vec2i lastPos = game.getSprite(members_[i].spriteId).loc(); + + while (!members_[i].movement.empty()) { + Movement m1 = members_[i].movement.front(); + Movement m2 = m1; + m1.pos = (m1.pos + lastPos) / 2; + lastPos = m2.pos; + + newMove.push_back(m1); + newMove.push_back(m2); + members_[i].movement.pop_front(); + } + + members_[i].movement = std::move(newMove); } } else { + state_ = State::Crouching; + for (int i = 0; i < members_.size(); i++) { - game.setSpriteState(members_[i].spriteId, "still"); + game.setSpriteState(members_[i].spriteId, "crouch"); } } -} \ No newline at end of file +} + +void Party::endCrouch(Game& game) { + if (state_ == State::Crouching) { + state_ = State::Running; + + for (int i = 0; i < members_.size(); i++) { + game.setSpriteState(members_[i].spriteId, "run"); + + // Halve the movement buffer for the followers. + if (i > 0) { + std::deque newMove; + + while (!members_[i].movement.empty()) { + newMove.push_back(members_[i].movement.front()); + members_[i].movement.pop_front(); + members_[i].movement.pop_front(); + } + + members_[i].movement = std::move(newMove); + } + } + } +} -- cgit 1.4.1