summary refs log tree commit diff stats
path: root/src/animation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/animation.cpp')
-rw-r--r--src/animation.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/animation.cpp b/src/animation.cpp new file mode 100644 index 0000000..fbf7ccf --- /dev/null +++ b/src/animation.cpp
@@ -0,0 +1,93 @@
1#include "animation.h"
2#include <string_view>
3#include <fstream>
4#include <stdexcept>
5#include <string>
6#include <regex>
7#include <list>
8#include "direction.h"
9#include "util.h"
10
11Animation::Animation(std::string_view path) {
12 std::ifstream datafile(path.data());
13 if (!datafile.is_open()) {
14 throw std::invalid_argument(std::string("Could not find sprite datafile: ") + path.data());
15 }
16
17 std::string animLine;
18 char ch;
19 int cellWidth;
20 int cellHeight;
21 datafile >> cellWidth;
22 datafile >> ch; //,
23 datafile >> cellHeight;
24 std::getline(datafile, animLine); // cell size
25
26 int framesPerRow;
27 datafile >> framesPerRow;
28 std::getline(datafile, animLine); // frames per row
29
30 int numFrames;
31 datafile >> numFrames;
32 std::getline(datafile, animLine); // frames
33 std::getline(datafile, animLine); // blank
34
35 for (int i=0; i<numFrames; i++) {
36 SDL_Rect srcRect;
37 srcRect.x = (i % framesPerRow) * cellWidth;
38 srcRect.y = (i / framesPerRow) * cellHeight;
39 srcRect.w = cellWidth;
40 srcRect.h = cellHeight;
41 frames_.push_back(srcRect);
42 }
43
44 while (std::getline(datafile, animLine)) {
45 std::regex re(R"(([a-z!._]+)\[([a-z_]+)\]: ([0-9,]+))");
46 std::smatch m;
47 std::regex_match(animLine, m, re);
48
49 std::string animName = m[1];
50 std::vector<int> anim;
51 auto framestrs = splitStr<std::list<std::string>>(m[3], ",");
52 for (const std::string& f : framestrs) {
53 anim.push_back(std::stoi(f));
54 }
55
56 int animId = animations_.size();
57 animations_.push_back(std::move(anim));
58
59 Direction dir = directionFromString(std::string(m[2]));
60 nameDirToAnim_[animName][dir] = animId;
61 }
62
63 updateAnim();
64}
65
66void Animation::setDirection(Direction dir) {
67 dir_ = dir;
68 updateAnim();
69}
70
71void Animation::setAnimation(std::string_view anim) {
72 animationName_ = anim;
73 updateAnim();
74}
75
76void Animation::update(int dt) {
77 animTimer_.accumulate(dt);
78
79 while (animTimer_.step()) {
80 animationFrame_++;
81
82 if (animationFrame_ >= animations_.at(animationId_).size()) {
83 animationFrame_ = 0;
84 }
85 }
86}
87
88void Animation::updateAnim() {
89 if (nameDirToAnim_.at(animationName_).at(dir_) != animationId_) {
90 animationId_ = nameDirToAnim_.at(animationName_).at(dir_);
91 animationFrame_ = 0;
92 }
93}