Compare commits

...

2 commits

Author SHA1 Message Date
Zed A. Shaw
383f839fdf Update Makefile to do the new animator command line options. 2026-02-04 00:14:38 -05:00
Zed A. Shaw
77643a4bcd Can now specify a background to render the sprite on. 2026-02-04 00:04:17 -05:00
4 changed files with 86 additions and 11 deletions

View file

@ -78,4 +78,4 @@ story:
gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args ./builddir/storyboard gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args ./builddir/storyboard
animator: animator:
gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args ./builddir/animator "rat_king_boss" gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args ./builddir/animator.exe -s "rat_king_boss" -a "rat_king_boss" -b "test_background"

View file

@ -21,5 +21,28 @@
"toggled": false, "toggled": false,
"looped": true "looped": true
} }
},
"rat_king_meth": {
"sheet": {
"frames": 2,
"frame_width": 720,
"frame_height": 720
},
"sequence": {
"frames": [0, 1],
"durations": [33, 33]
},
"transform": {
"min_x": 0.6,
"min_y": 0.6,
"max_x": 0.8,
"max_y": 0.8,
"simple": false,
"flipped": false,
"ease_rate": 5.0,
"scaled": true,
"toggled": false,
"looped": true
}
} }
} }

View file

@ -8,6 +8,16 @@
#include "constants.hpp" #include "constants.hpp"
#include "animate2.hpp" #include "animate2.hpp"
#include "tools/animator.hpp" #include "tools/animator.hpp"
#include <unistd.h>
/*
* TODO:
*
* - Setting a background.
* - Options parsing for that.
* - Easing functions from strings in json.
* - Map of animation forms.
*/
using namespace std::chrono_literals; using namespace std::chrono_literals;
@ -15,9 +25,11 @@ bool YES_SYNC=true;
namespace animator { namespace animator {
void FSM::init(const std::string &sprite_name) { void FSM::init(const std::string &sprite_name, const std::string &anim_name, const std::string &background) {
$timer.start(); $timer.start();
$sprite_name = sprite_name; $sprite_name = sprite_name;
$anim_name = anim_name;
$background = background;
// this loads the animation // this loads the animation
reload(); reload();
@ -26,7 +38,7 @@ namespace animator {
$window = sf::RenderWindow(sf::VideoMode(new_size), "Animation Crafting Tool"); $window = sf::RenderWindow(sf::VideoMode(new_size), "Animation Crafting Tool");
$window.setPosition({0,0}); $window.setPosition({0,0});
$ui.init($sprite_name, new_size.x, new_size.y); $ui.init($sprite_name, $background, new_size.x, new_size.y);
$sprite = $ui.get_sprite(); $sprite = $ui.get_sprite();
// need to keep these aroung // need to keep these aroung
@ -37,7 +49,6 @@ namespace animator {
$window.setVerticalSyncEnabled(VSYNC); $window.setVerticalSyncEnabled(VSYNC);
if(FRAME_LIMIT) $window.setFramerateLimit(FRAME_LIMIT); if(FRAME_LIMIT) $window.setFramerateLimit(FRAME_LIMIT);
} }
} }
void FSM::event(Event ev, std::any data) { void FSM::event(Event ev, std::any data) {
@ -111,7 +122,7 @@ namespace animator {
} }
void FSM::reload() { void FSM::reload() {
$anim = animate2::load("assets/animate2.json", $sprite_name); $anim = animate2::load("assets/animate2.json", $anim_name);
$anim.play(); $anim.play();
$last_mod_time = std::filesystem::last_write_time("assets/animate2.json"); $last_mod_time = std::filesystem::last_write_time("assets/animate2.json");
} }
@ -153,10 +164,16 @@ namespace animator {
return !in_state(State::END); return !in_state(State::END);
} }
void UI::init(const std::string& sprite_name, int width, int height) { void UI::init(const std::string& sprite_name, const std::string& background, int width, int height) {
$ui.position(0,0, width, height); $ui.position(0,0, width, height);
$ui.layout("[=viewer]"); $ui.layout("[=viewer]");
if(background != "") {
$ui.set<guecs::Background>($ui.MAIN, {$ui.$parser, guecs::THEME.TRANSPARENT});
auto& bg = $ui.get<guecs::Background>($ui.MAIN);
bg.set_sprite(background, true);
}
auto viewer = $ui.entity("viewer"); auto viewer = $ui.entity("viewer");
$ui.set<guecs::Sprite>(viewer, { sprite_name, 0, false}); $ui.set<guecs::Sprite>(viewer, { sprite_name, 0, false});
@ -181,6 +198,11 @@ namespace animator {
} }
} }
int error() {
fmt::println("USAGE: animator -h -b <background> -s <sprite> -a <animation>");
return 1;
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
shaders::init(); shaders::init();
components::init(); components::init();
@ -189,14 +211,42 @@ int main(int argc, char* argv[]) {
ai::init("ai"); ai::init("ai");
animation::init(); animation::init();
dbc::check(argc == 2, "USAGE: animator <sprite>"); std::string sprite_name;
std::string sprite_name{argv[1]}; std::string background;
std::string anim_name;
int opt = 0;
while((opt = getopt(argc, argv, "hb:s:a:")) != -1) {
switch(opt) {
case 'b':
background = optarg;
break;
case 's':
sprite_name = optarg;
break;
case 'a':
anim_name = optarg;
break;
case 'h': // fallthrough
error();
break;
default:
return error();
break;
}
}
if(sprite_name == "") {
return error();
} else if(anim_name == "") {
anim_name = sprite_name; // default to the same
}
sound::mute(true); sound::mute(true);
sound::play("ambient_1", true); sound::play("ambient_1", true);
animator::FSM main; animator::FSM main;
main.init(sprite_name); main.init(sprite_name, anim_name, background);
while(main.active()) { while(main.active()) {
main.tick(); main.tick();

View file

@ -25,7 +25,7 @@ namespace animator {
guecs::UI $ui; guecs::UI $ui;
void button(const std::string& name, std::function<void(guecs::Modifiers mods)> cb); void button(const std::string& name, std::function<void(guecs::Modifiers mods)> cb);
void init(const std::string& sprite_name, int width, int height); void init(const std::string& sprite_name, const std::string& background, int width, int height);
void render(sf::RenderWindow& window, bool debug=false); void render(sf::RenderWindow& window, bool debug=false);
bool mouse(float x, float y, guecs::Modifiers mods); bool mouse(float x, float y, guecs::Modifiers mods);
std::shared_ptr<sf::Sprite> get_sprite(); std::shared_ptr<sf::Sprite> get_sprite();
@ -40,10 +40,12 @@ namespace animator {
std::shared_ptr<sf::Sprite> $sprite = nullptr; std::shared_ptr<sf::Sprite> $sprite = nullptr;
animate2::Animate2 $anim; animate2::Animate2 $anim;
std::string $sprite_name=""; std::string $sprite_name="";
std::string $anim_name="";
std::string $background="";
std::filesystem::file_time_type $last_mod_time; std::filesystem::file_time_type $last_mod_time;
sf::Clock $timer; sf::Clock $timer;
void init(const std::string &sprite_name); void init(const std::string &sprite_name, const std::string& background, const std::string &anim_name);
void event(Event ev, std::any data={}); void event(Event ev, std::any data={});
void START(Event ev); void START(Event ev);
void ANIMATE(Event ev); void ANIMATE(Event ev);