diff --git a/animate2.cpp b/animate2.cpp index 1346018..080afe5 100644 --- a/animate2.cpp +++ b/animate2.cpp @@ -21,6 +21,7 @@ namespace animate2 { void Animate2::play() { dbc::check(!playing, "can't call play while playing?"); $sequence.current = 0; + $sequence.subframe = 0.0f; $sequence.loop_count = 0; playing = true; $sequence.timer.start(); @@ -65,6 +66,7 @@ namespace animate2 { } void Animate2::update() { + $sequence.subframe += $transform.speed; update_frame(); } @@ -74,15 +76,13 @@ namespace animate2 { } float Transform::twitching(Sequence& seq) { - float subframe = seq.timer.getElapsedTime().asSeconds(); - float tick = 1 - std::powf(ease_rate, subframe + 0.0001); - fmt::println("TICK {}; subframe: {}", tick, subframe); + float tick = 1 - std::powf(ease_rate, seq.subframe + 0.0001); switch(easing) { case ease::NONE: return 0.0; case ease::SINE: - return std::abs(std::sin(subframe * ease_rate)); + return std::abs(std::sin(seq.subframe * ease_rate)); case ease::OUT_CIRC: return ease::out_circ(tick); case ease::OUT_BOUNCE: @@ -102,7 +102,7 @@ namespace animate2 { } } - void Transform::lerp(Sequence& seq, sf::Vector2f& scale_out, sf::Vector2f& pos_out) { + void Transform::lerp(Sequence& seq, sf::Vector2f& pos_out, sf::Vector2f& scale_out) { float tick = twitching(seq); if(stationary) { @@ -120,7 +120,6 @@ namespace animate2 { } break; case ease::SQUEEZE: { scale_out.x *= std::lerp(min_x, max_x, tick); - } break; case ease::SQUASH: { scale_out.y *= std::lerp(min_y, max_y, tick); @@ -139,6 +138,7 @@ namespace animate2 { dbc::sentinel("Unknown animation.motion setting."); } } else { + dbc::sentinel("scale should not run"); scale_out.x = std::lerp(scale_out.x * min_x, scale_out.x * max_x, tick); scale_out.y = std::lerp(scale_out.y * min_y, scale_out.y * max_y, tick); } diff --git a/animate2.hpp b/animate2.hpp index 12be222..d5f2d1d 100644 --- a/animate2.hpp +++ b/animate2.hpp @@ -23,6 +23,7 @@ namespace animate2 { int loop_count{0}; size_t frame_count{frames.size()}; sf::Clock timer{}; + float subframe{0.0f}; }; struct Transform { @@ -34,6 +35,7 @@ namespace animate2 { bool simple{true}; bool flipped{false}; float ease_rate{0.5f}; + float speed{0.1f}; bool scaled{false}; bool stationary{false}; // these can handled by the onLoop, same as ganim8 does it @@ -75,7 +77,7 @@ namespace animate2 { void apply(sf::Sprite& sprite); void update_frame(); void update(); - void motion(sf::Vector2f& pos, sf::Vector2f& scale); + void motion(sf::Vector2f& pos_out, sf::Vector2f& scale_out); }; } diff --git a/tests/animate2.cpp b/tests/animate2.cpp index 2245996..8873aa8 100644 --- a/tests/animate2.cpp +++ b/tests/animate2.cpp @@ -25,24 +25,27 @@ Animate2 crafter() { Sequence sequence{ .frames{0,1}, - .durations{Random::milliseconds(1, 100), Random::milliseconds(1, 100)} + .durations{Random::milliseconds(33, 100), Random::milliseconds(33, 100)} }; REQUIRE(sequence.frame_count == sequence.frames.size()); REQUIRE(sequence.frame_count == sequence.durations.size()); Transform transform{ - .min_x{1.0f}, - .min_y{1.0f}, - .max_x{1.0f}, - .max_y{1.0f}, + .min_x{0.6f}, + .min_y{0.6f}, + .max_x{0.8f}, + .max_y{0.8f}, .simple{true}, .flipped{false}, .ease_rate{0.5f}, + .speed{0.1f}, .scaled{false}, - .stationary{false}, + .stationary{true}, .toggled{false}, .looped{false}, + .easing = ease::IN_OUT_BACK, + .motion = ease::RUSH, }; return {sheet, sequence, transform}; @@ -154,8 +157,8 @@ TEST_CASE("confirm transition changes work", "[animation-new]") { auto anim = crafter(); - sf::Vector2f pos{0,0}; - sf::Vector2f scale{0,0}; + sf::Vector2f pos{10,10}; + sf::Vector2f scale{0.6, 0.6}; // also testing that onFrame being null means it's not run REQUIRE(anim.onFrame == nullptr); @@ -165,10 +168,11 @@ TEST_CASE("confirm transition changes work", "[animation-new]") { while(anim.playing) { anim.update(); anim.motion(pos, scale); + fmt::println("POSITION: {},{}; SCALE: {},{}; current: {}; subframe: {}", + pos.x, pos.y, scale.x, scale.y, anim.$sequence.current, anim.$sequence.subframe); } REQUIRE(anim.playing == false); - - REQUIRE(scale != sf::Vector2f{0,0}); REQUIRE(pos != sf::Vector2f{0,0}); + REQUIRE(scale != sf::Vector2f{0,0}); }