diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-03 01:35:58 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-02-03 01:35:58 -0500 |
commit | be09120d1d044b476ef8b516efbdb526f20d9e2d (patch) | |
tree | f935389835d5f94a9cd3bb2059cf55174c9aad69 /src/animation_system.cpp | |
parent | 24918837c3ff9026d228657d14852c9cf39a5644 (diff) | |
download | tanetane-be09120d1d044b476ef8b516efbdb526f20d9e2d.tar.gz tanetane-be09120d1d044b476ef8b516efbdb526f20d9e2d.tar.bz2 tanetane-be09120d1d044b476ef8b516efbdb526f20d9e2d.zip |
Added animation system
Diffstat (limited to 'src/animation_system.cpp')
-rw-r--r-- | src/animation_system.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/animation_system.cpp b/src/animation_system.cpp new file mode 100644 index 0000000..3320e1d --- /dev/null +++ b/src/animation_system.cpp | |||
@@ -0,0 +1,122 @@ | |||
1 | #include "animation_system.h" | ||
2 | #include <fstream> | ||
3 | #include <string> | ||
4 | #include <list> | ||
5 | #include "game.h" | ||
6 | #include "vector.h" | ||
7 | #include "util.h" | ||
8 | |||
9 | void AnimationSystem::initSprite(int spriteId, std::string_view filename, Renderer& renderer) { | ||
10 | std::ifstream datafile(filename.data()); | ||
11 | if (!datafile.is_open()) { | ||
12 | throw std::invalid_argument(std::string("Could not find sprite datafile: ") + std::string(filename)); | ||
13 | } | ||
14 | |||
15 | Sprite& sprite = game_.getSprite(spriteId); | ||
16 | sprite.isAnimated = true; | ||
17 | |||
18 | char ch; | ||
19 | std::string line; | ||
20 | |||
21 | std::string imagename; | ||
22 | datafile >> imagename; | ||
23 | sprite.textureId = renderer.loadImageFromFile(imagename); | ||
24 | |||
25 | std::string framefilename; | ||
26 | datafile >> framefilename; | ||
27 | |||
28 | std::ifstream framefile(framefilename); | ||
29 | if (!framefile.is_open()) { | ||
30 | throw std::invalid_argument("Could not find frame datafile: " + framefilename); | ||
31 | } | ||
32 | |||
33 | vec2i cellSize; | ||
34 | framefile >> cellSize.w(); | ||
35 | framefile >> ch; //, | ||
36 | framefile >> cellSize.h(); | ||
37 | std::getline(framefile, line); // cell size | ||
38 | |||
39 | int framesPerRow; | ||
40 | framefile >> framesPerRow; | ||
41 | std::getline(framefile, line); // frames per row | ||
42 | |||
43 | int numFrames; | ||
44 | framefile >> numFrames; | ||
45 | std::getline(framefile, line); // frames | ||
46 | std::getline(framefile, line); // blank | ||
47 | |||
48 | for (int i=0; i<numFrames; i++) { | ||
49 | SpriteFrame f; | ||
50 | framefile >> f.size.w(); | ||
51 | framefile >> ch; //, | ||
52 | framefile >> f.size.h(); | ||
53 | framefile >> ch; //, | ||
54 | framefile >> f.center.x(); | ||
55 | framefile >> ch; //, | ||
56 | framefile >> f.center.y(); | ||
57 | std::getline(framefile, line); // blank | ||
58 | |||
59 | f.srcRect.x = (i % framesPerRow) * cellSize.w(); | ||
60 | f.srcRect.y = (i / framesPerRow) * cellSize.h(); | ||
61 | f.srcRect.w = f.size.w(); | ||
62 | f.srcRect.h = f.size.h(); | ||
63 | |||
64 | sprite.frames.push_back(std::move(f)); | ||
65 | } | ||
66 | |||
67 | std::string animLine; | ||
68 | std::getline(datafile, animLine); // blank | ||
69 | while (std::getline(datafile, animLine)) { | ||
70 | std::regex re(R"(([a-z]+)\[([a-z_]+)\]: ([0-9,]+))"); | ||
71 | std::smatch m; | ||
72 | std::regex_match(animLine, m, re); | ||
73 | |||
74 | std::vector<int> frames; | ||
75 | auto framestrs = splitStr<std::list<std::string>>(m[3], ","); | ||
76 | for (const std::string& f : framestrs) { | ||
77 | frames.push_back(std::stoi(f)); | ||
78 | } | ||
79 | |||
80 | int animId = sprite.animations.size(); | ||
81 | sprite.animations.push_back(std::move(frames)); | ||
82 | |||
83 | Direction dir = directionFromString(std::string(m[2])); | ||
84 | sprite.nameDirToAnim[m[1]][dir] = animId; | ||
85 | } | ||
86 | |||
87 | updateAnimation(spriteId); | ||
88 | } | ||
89 | |||
90 | void AnimationSystem::tick(double dt) { | ||
91 | animTimer_.accumulate(dt); | ||
92 | while (animTimer_.step()) { | ||
93 | for (Sprite& sprite : game_.getSprites() | game_.spriteView()) { | ||
94 | sprite.animationFrame++; | ||
95 | if (sprite.animationFrame >= sprite.animations[sprite.animationId].size()) { | ||
96 | sprite.animationFrame = 0; | ||
97 | } | ||
98 | } | ||
99 | } | ||
100 | } | ||
101 | |||
102 | void AnimationSystem::setSpriteDirection(int spriteId, Direction dir) { | ||
103 | Sprite& sprite = game_.getSprite(spriteId); | ||
104 | if (sprite.dir != dir) { | ||
105 | sprite.dir = dir; | ||
106 | updateAnimation(spriteId); | ||
107 | } | ||
108 | } | ||
109 | |||
110 | void AnimationSystem::setSpriteAnimation(int spriteId, std::string_view name) { | ||
111 | Sprite& sprite = game_.getSprite(spriteId); | ||
112 | if (sprite.animationName != name) { | ||
113 | sprite.animationName = name; | ||
114 | updateAnimation(spriteId); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | void AnimationSystem::updateAnimation(int spriteId) { | ||
119 | Sprite& sprite = game_.getSprite(spriteId); | ||
120 | sprite.animationId = sprite.nameDirToAnim[sprite.animationName][sprite.dir]; | ||
121 | sprite.animationFrame = 0; | ||
122 | } | ||