From f3166702d7dd30312b5a401f52941aad43ac51c3 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 30 Jan 2021 13:01:01 -0500 Subject: Added standing/walking animations --- src/sprite.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) (limited to 'src/sprite.cpp') diff --git a/src/sprite.cpp b/src/sprite.cpp index c8c4656..cc196ae 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -1,7 +1,80 @@ #include "sprite.h" #include +#include +#include +#include +#include "util.h" -Sprite::Sprite(std::string_view filename, Renderer& renderer, int width, int height) { - textureId_ = renderer.loadImageFromFile(filename); - size_ = { width*4, height*4 }; +Sprite::Sprite(std::string_view filename, Renderer& renderer) { + std::ifstream datafile(filename.data()); + if (!datafile.is_open()) { + throw std::invalid_argument(std::string("Could not find sprite datafile: ") + std::string(filename)); + } + + char ch; + + std::string imagename; + datafile >> imagename; + textureId_ = renderer.loadImageFromFile(imagename); + + datafile >> size_.w(); + datafile >> ch; //, + datafile >> size_.h(); + + std::string animLine; + std::getline(datafile, animLine); // blank + while (std::getline(datafile, animLine)) { + std::regex re(R"(([a-z]+)\[([a-z_]+)\]: ([0-9,]+))"); + std::smatch m; + std::regex_match(animLine, m, re); + + std::vector frames; + auto framestrs = splitStr>(m[3], ","); + for (const std::string& f : framestrs) { + frames.push_back(std::stoi(f)); + } + + int animId = animations_.size(); + animations_.push_back(std::move(frames)); + + Direction dir = directionFromString(std::string(m[2])); + + if (m[1] == "still") { + stillAnims_[dir] = animId; + } else { + walkingAnims_[dir] = animId; + } + } + + updateAnimation(); +} + +void Sprite::setDirection(Direction dir) { + if (curDir_ != dir) { + curDir_ = dir; + updateAnimation(); + } +} + +void Sprite::setWalking(bool walking) { + if (isWalking_ != walking) { + isWalking_ = walking; + updateAnimation(); + } +} + +void Sprite::updateAnimation() { + if (isWalking_) { + curAnim_ = walkingAnims_[curDir_]; + } else { + curAnim_ = stillAnims_[curDir_]; + } + curFrame_ = 0; +} + +void Sprite::tickAnim() { + curFrame_++; + if (curFrame_ >= animations_[curAnim_].size()) { + curFrame_ = 0; + } } \ No newline at end of file -- cgit 1.4.1