diff options
Diffstat (limited to 'src/animation.cpp')
-rw-r--r-- | src/animation.cpp | 93 |
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 | |||
11 | Animation::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 | |||
66 | void Animation::setDirection(Direction dir) { | ||
67 | dir_ = dir; | ||
68 | updateAnim(); | ||
69 | } | ||
70 | |||
71 | void Animation::setAnimation(std::string_view anim) { | ||
72 | animationName_ = anim; | ||
73 | updateAnim(); | ||
74 | } | ||
75 | |||
76 | void 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 | |||
88 | void Animation::updateAnim() { | ||
89 | if (nameDirToAnim_.at(animationName_).at(dir_) != animationId_) { | ||
90 | animationId_ = nameDirToAnim_.at(animationName_).at(dir_); | ||
91 | animationFrame_ = 0; | ||
92 | } | ||
93 | } | ||