summary refs log tree commit diff stats
path: root/src/animation_system.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/animation_system.cpp')
-rw-r--r--src/animation_system.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/animation_system.cpp b/src/animation_system.cpp index d23eae2..a280aee 100644 --- a/src/animation_system.cpp +++ b/src/animation_system.cpp
@@ -65,7 +65,7 @@ void AnimationSystem::initSprite(int spriteId, std::string_view filename) {
65 std::string animLine; 65 std::string animLine;
66 std::getline(datafile, animLine); // blank 66 std::getline(datafile, animLine); // blank
67 while (std::getline(datafile, animLine)) { 67 while (std::getline(datafile, animLine)) {
68 std::regex re(R"(([a-z!_]+)\[([a-z_]+)\]: ([0-9,]+))"); 68 std::regex re(R"(([a-z!._]+)\[([a-z_]+)\]: ([0-9,]+))");
69 std::smatch m; 69 std::smatch m;
70 std::regex_match(animLine, m, re); 70 std::regex_match(animLine, m, re);
71 71
@@ -78,6 +78,8 @@ void AnimationSystem::initSprite(int spriteId, std::string_view filename) {
78 78
79 if (animName.back() == '!') { 79 if (animName.back() == '!') {
80 anim.looping = false; 80 anim.looping = false;
81 } else if (animName.back() == '.') {
82 anim.manual = true;
81 } 83 }
82 84
83 int animId = sprite.animations.size(); 85 int animId = sprite.animations.size();
@@ -96,7 +98,7 @@ void AnimationSystem::tick(double dt) {
96 animTimer_.accumulate(dt); 98 animTimer_.accumulate(dt);
97 while (animTimer_.step()) { 99 while (animTimer_.step()) {
98 for (Sprite& sprite : game_.getSprites() | game_.spriteView()) { 100 for (Sprite& sprite : game_.getSprites() | game_.spriteView()) {
99 if (sprite.isAnimated && !sprite.animFinished) { 101 if (sprite.isAnimated && !sprite.animFinished && !sprite.animPaused) {
100 sprite.animationFrame++; 102 sprite.animationFrame++;
101 103
102 if (sprite.animationFrame >= sprite.animations[sprite.animationId].frameIndices.size()) { 104 if (sprite.animationFrame >= sprite.animations[sprite.animationId].frameIndices.size()) {
@@ -112,6 +114,19 @@ void AnimationSystem::tick(double dt) {
112 } 114 }
113} 115}
114 116
117void AnimationSystem::advanceAnimation(int spriteId) {
118 Sprite& sprite = game_.getSprite(spriteId);
119 Animation& animation = sprite.animations[sprite.animationId];
120
121 if (animation.manual) {
122 sprite.animationFrame++;
123
124 if (sprite.animationFrame >= animation.frameIndices.size()) {
125 sprite.animationFrame = 0;
126 }
127 }
128}
129
115void AnimationSystem::setSpriteDirection(int spriteId, Direction dir) { 130void AnimationSystem::setSpriteDirection(int spriteId, Direction dir) {
116 Sprite& sprite = game_.getSprite(spriteId); 131 Sprite& sprite = game_.getSprite(spriteId);
117 if (sprite.dir != dir) { 132 if (sprite.dir != dir) {
@@ -133,4 +148,5 @@ void AnimationSystem::updateAnimation(int spriteId) {
133 sprite.animationId = sprite.nameDirToAnim[sprite.animationName][sprite.dir]; 148 sprite.animationId = sprite.nameDirToAnim[sprite.animationName][sprite.dir];
134 sprite.animationFrame = 0; 149 sprite.animationFrame = 0;
135 sprite.animFinished = false; 150 sprite.animFinished = false;
151 sprite.animPaused = false;
136} 152}