diff --git a/animation.cpp b/animation.cpp index e4d3eab..4f063c7 100644 --- a/animation.cpp +++ b/animation.cpp @@ -35,46 +35,54 @@ namespace components { } } + void Animation::lerp(sf::Vector2f& scale_out, sf::Vector2f& pos_out) { + float tick = twitching(); + + if(stationary) { + switch(motion) { + case ease::SHAKE: { + pos_out.x += std::lerp(min_x, max_x, tick); + } break; + case ease::BOUNCE: { + pos_out.y -= std::lerp(min_y, max_y, tick); + } break; + case ease::RUSH: { + scale_out.x = std::lerp(min_x, max_x, tick); + scale_out.y = std::lerp(min_y, max_y, tick); + pos_out.y = pos_out.y - (pos_out.y * scale_out.y - pos_out.y); + } 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); + } break; + case ease::STRETCH: { + scale_out.x = std::lerp(min_x, max_x, tick); + } break; + case ease::GROW: { + scale_out.y = std::lerp(min_y, max_y, tick); + } break; + case ease::SLIDE: { + pos_out.x += std::lerp(pos_out.x, pos_out.x + max_x, tick); + pos_out.y += std::lerp(pos_out.y, pos_out.y + max_y, tick); + } break; + default: + dbc::sentinel("Unknown animation.motion setting."); + } + } else { + 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); + } + } + void Animation::step(sf::Vector2f& scale_out, sf::Vector2f& pos_out, sf::IntRect& rect_out) { dbc::check(rect_out.size.x > 0, "step given rect_out with size.x <= 0, must be >"); dbc::check(rect_out.size.y > 0, "step given rect_out with size.y <= 0, must be >"); if(playing && current < frames) { - float tick = twitching(); - - if(stationary) { - switch(motion) { - case ease::SHAKE: { - pos_out.x += std::lerp(min_x, max_x, tick); - } break; - case ease::BOUNCE: { - pos_out.y -= std::lerp(min_y, max_y, tick); - } break; - case ease::RUSH: { - scale_out.x = std::lerp(min_x, max_x, tick); - scale_out.y = std::lerp(min_y, max_y, tick); - pos_out.y = pos_out.y - (pos_out.y * scale_out.y - pos_out.y); - } 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); - } break; - case ease::STRETCH: { - scale_out.x = std::lerp(min_x, max_x, tick); - } break; - case ease::GROW: { - scale_out.y = std::lerp(min_y, max_y, tick); - } break; - default: - dbc::sentinel("Unknown animation.motion setting."); - } - } else { - 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); - } + lerp(scale_out, pos_out); if(!simple) { rect_out.position.x += current * frame_width; @@ -91,8 +99,7 @@ namespace components { rect_out.position.x += current * frame_width; } } else { - scale_out.x = min_x; - scale_out.y = min_y; + lerp(scale_out, pos_out); playing = false; current = 0; subframe = 0.0f; @@ -112,7 +119,6 @@ namespace components { sprite.setTextureRect(rect); sprite.setPosition(pos); - // BUG: make this an option: apply_scale, apply_position and ranges for x y if(scaled) { sprite.setScale(scale); } @@ -127,6 +133,7 @@ namespace components { step(scale, pos, ignored); view_out.setCenter(pos); + // BUG: is this also needed in the other apply? if(scaled) { view_out.setSize({size.x * scale.x, size.y * scale.y}); } else { diff --git a/assets/animations.json b/assets/animations.json index 03b980b..dbdca98 100644 --- a/assets/animations.json +++ b/assets/animations.json @@ -291,17 +291,17 @@ }, "test_zoom": { "_type": "Animation", - "easing": 6, - "motion": 6, - "ease_rate": 0.5, - "min_x": 0.8, - "min_y": 0.9, - "max_x": 1.1, - "max_y": 1.1, + "easing": 2, + "motion": 7, + "ease_rate": 0.05, + "min_x": 0, + "min_y": 0, + "max_x": 150.0, + "max_y": 0.0, "simple": true, "frames": 1, "speed": 0.01, - "scaled": true, + "scaled": false, "stationary": true, "toggled": false, "flipped": false, diff --git a/boss/fight.cpp b/boss/fight.cpp index f027859..61c2e9c 100644 --- a/boss/fight.cpp +++ b/boss/fight.cpp @@ -86,6 +86,7 @@ namespace boss { $ui.status(L"PLAYER TURN"); const std::string& player_pos = run % 10 < 5 ? "player1" : "player2"; $ui.move_actor("player", player_pos); + $ui.zoom(player_pos); $ui.$zoom_anim.play(); int attack_id = std::any_cast(data); boss::System::combat(attack_id); diff --git a/boss/ui.cpp b/boss/ui.cpp index 1e68080..27abee8 100644 --- a/boss/ui.cpp +++ b/boss/ui.cpp @@ -81,7 +81,7 @@ namespace boss { $view_texture.setView(zoom); } else if($zoom_anim.playing) { auto& cell = $arena.$ui.cell_for(cell_name); - sf::Vector2f pos{float(cell.x), float(cell.y)}; + sf::Vector2f pos{float(cell.x/2), float(cell.y/2)}; sf::View zoom; $zoom_anim.apply(zoom, pos, {BOSS_VIEW_WIDTH/2, BOSS_VIEW_HEIGHT/2}); $view_texture.setView(zoom); diff --git a/components.hpp b/components.hpp index 8e407a4..32a5085 100644 --- a/components.hpp +++ b/components.hpp @@ -142,6 +142,7 @@ namespace components { bool apply(sf::Sprite& target, sf::Vector2f pos); bool apply(sf::View& view_out, sf::Vector2f pos, sf::Vector2f size); + void lerp(sf::Vector2f& scale_out, sf::Vector2f& pos_out); void play(); float twitching(); diff --git a/easings.hpp b/easings.hpp index 8971d81..11cb862 100644 --- a/easings.hpp +++ b/easings.hpp @@ -20,7 +20,8 @@ namespace ease { SQUEEZE=3, SQUASH=4, STRETCH=5, - GROW=6 + GROW=6, + SLIDE=7 }; inline double sine(double x) {