update sample: added key bindings to start animations, bug fix

This commit is contained in:
andrey.zhirnov
2019-08-06 12:34:22 +03:00
parent 664f021c2e
commit d45685d4be
7 changed files with 103 additions and 47 deletions

View File

@@ -22,9 +22,13 @@ namespace e2d
spine_player() = default; spine_player() = default;
spine_player(const spine_model_asset::ptr& model); spine_player(const spine_model_asset::ptr& model);
spine_player& set_animation(u32 track, const str& name, bool loop); spine_player& set_animation(u32 track, const str& name, bool loop = false);
spine_player& add_animation(u32 track, const str& name, bool loop, secf delay);
spine_player& add_empty_animation(u32 track, secf duration, secf delay); spine_player& add_animation(u32 track, const str& name, bool loop, secf delay = secf(0.0f));
spine_player& add_animation(u32 track, const str& name, secf delay = secf(0.0f));
spine_player& add_empty_animation(u32 track, secf duration, secf delay = secf(0.0f));
spine_player& clear(u32 track); spine_player& clear(u32 track);
spine_player& clear(); spine_player& clear();

View File

@@ -1,6 +1,38 @@
{ {
"skeleton" : "raptor/raptor-pro.json-large", "skeleton": "raptor/raptor-pro.json-large",
"atlas" : "raptor/raptor.atlas", "atlas": "raptor/raptor.atlas",
"scale" : 1.0, "scale": 1.0,
"premultiplied_alpha" : false "premultiplied_alpha": false,
} "mix_animations": [
{
"from_anim": "walk",
"to_anim": "roar",
"duration": 0.5
},
{
"from_anim": "roar",
"to_anim": "walk",
"duration": 0.5
},
{
"from_anim": "walk",
"to_anim": "jump",
"duration": 0.5
},
{
"from_anim": "jump",
"to_anim": "walk",
"duration": 0.5
},
{
"from_anim": "roar",
"to_anim": "jump",
"duration": 0.5
},
{
"from_anim": "jump",
"to_anim": "roar",
"duration": 0.5
}
]
}

View File

@@ -11,6 +11,11 @@ namespace
{ {
class game_system final : public ecs::system { class game_system final : public ecs::system {
public: public:
game_system(gobject_iptr raptor)
: raptor_gobj_(raptor) {}
~game_system() noexcept override {}
void process(ecs::registry& owner) override { void process(ecs::registry& owner) override {
E2D_UNUSED(owner); E2D_UNUSED(owner);
const keyboard& k = the<input>().keyboard(); const keyboard& k = the<input>().keyboard();
@@ -26,7 +31,35 @@ namespace
if ( k.is_key_pressed(keyboard_key::lsuper) && k.is_key_just_released(keyboard_key::enter) ) { if ( k.is_key_pressed(keyboard_key::lsuper) && k.is_key_just_released(keyboard_key::enter) ) {
the<window>().toggle_fullscreen(!the<window>().fullscreen()); the<window>().toggle_fullscreen(!the<window>().fullscreen());
} }
// use keys R, J, G to start animations
if ( raptor_gobj_ ) {
if ( k.is_key_just_pressed(keyboard_key::r) ) {
auto player = raptor_gobj_->get_component<spine_player>();
if ( player ) {
(*player).set_animation(0, "roar")
.add_animation(0, "walk", true);
}
}
if ( k.is_key_just_pressed(keyboard_key::j) ) {
auto player = raptor_gobj_->get_component<spine_player>();
if ( player ) {
(*player).set_animation(0, "jump")
.add_animation(0, "walk", true);
}
}
if ( k.is_key_just_pressed(keyboard_key::g) ) {
auto player = raptor_gobj_->get_component<spine_player>();
if ( player ) {
(*player).set_animation(1, "gun-grab")
.add_animation(1, "gun-holster", secf(3.0f));
}
}
}
} }
private:
gobject_iptr raptor_gobj_;
}; };
class camera_system final : public ecs::system { class camera_system final : public ecs::system {
@@ -69,7 +102,6 @@ namespace
node_iptr scene_r = scene_i->get_component<actor>().get().node(); node_iptr scene_r = scene_i->get_component<actor>().get().node();
#if 1
auto coin_i = the<world>().instantiate(); auto coin_i = the<world>().instantiate();
coin_i->entity_filler() coin_i->entity_filler()
.component<actor>(node::create(coin_i, scene_r)) .component<actor>(node::create(coin_i, scene_r))
@@ -80,42 +112,22 @@ namespace
.set_animation(0, "animation", true)); .set_animation(0, "animation", true));
node_iptr coin_n = coin_i->get_component<actor>().get().node(); node_iptr coin_n = coin_i->get_component<actor>().get().node();
coin_n->scale(v3f(0.5f)); coin_n->scale(v3f(0.125f));
coin_n->translation(v3f{150.0f, 0.0f, 0.0f}); coin_n->translation(v3f{200.0f, 200.0f, 0.0f});
auto raptor_i = the<world>().instantiate(); raptor_gobj_ = the<world>().instantiate();
raptor_i->entity_filler() raptor_gobj_->entity_filler()
.component<actor>(node::create(raptor_i, scene_r)) .component<actor>(node::create(raptor_gobj_, scene_r))
.component<renderer>(renderer() .component<renderer>(renderer()
.materials({spine_mat})) .materials({spine_mat}))
.component<spine_renderer>(spine_renderer(spine_raptor)) .component<spine_renderer>(spine_renderer(spine_raptor))
.component<spine_player>(spine_player(spine_raptor) .component<spine_player>(spine_player(spine_raptor)
.set_animation(0, "walk", true) .set_animation(0, "walk", true));
.add_animation(1, "gun-grab", false, secf(2.0f)));
node_iptr raptor_n = raptor_i->get_component<actor>().get().node(); node_iptr raptor_n = raptor_gobj_->get_component<actor>().get().node();
raptor_n->scale(v3f(0.25f)); raptor_n->scale(v3f(0.25f));
raptor_n->translation(v3f{-170.f, -100.f, 0.0f}); raptor_n->translation(v3f{-80.f, -100.f, 0.0f});
#else
// performace test
for ( std::size_t i = 0; i < 20; ++i )
for ( std::size_t j = 0; j < 40; ++j ) {
auto spine_i = the<world>().instantiate();
spine_i->entity_filler()
.component<actor>(node::create(spine_i, scene_r))
.component<renderer>(renderer()
.materials({spine_mat}))
.component<spine_renderer>(spine_renderer(spine_raptor))
.component<spine_player>(spine_player(spine_raptor)
.set_animation(0, "walk", true)
.add_animation(1, "gun-grab", false, secf(2.0f)));
node_iptr spine_n = spine_i->get_component<actor>().get().node();
spine_n->scale(v3f(0.05f));
spine_n->translation(v3f{-400.f, -300.f, 0.0f} + v3f{j * 30.f, i * 30.f, 0});
}
#endif
return true; return true;
} }
@@ -130,11 +142,14 @@ namespace
bool create_systems() { bool create_systems() {
ecs::registry_filler(the<world>().registry()) ecs::registry_filler(the<world>().registry())
.system<game_system>(world::priority_update) .system<game_system>(world::priority_update, raptor_gobj_)
.system<camera_system>(world::priority_pre_render) .system<camera_system>(world::priority_pre_render)
.system<spine_system>(world::priority_update); .system<spine_system>(world::priority_update);
return true; return true;
} }
private:
gobject_iptr raptor_gobj_;
}; };
} }

View File

@@ -32,10 +32,7 @@ namespace
"scale" : { "type" : "number" }, "scale" : { "type" : "number" },
"atlas" : { "$ref" : "#/common_definitions/address" }, "atlas" : { "$ref" : "#/common_definitions/address" },
"premultiplied_alpha" : { "type" : "boolean" }, "premultiplied_alpha" : { "type" : "boolean" },
"mix_animations" : { "mix_animations" : { "$ref": "#/definitions/spine_animation_mix_array" }
"type" : "array",
"items" : { "$ref": "#/definitions/spine_animation_mix_array" }
}
}, },
"definitions" : { "definitions" : {
"spine_animation_mix_array" : { "spine_animation_mix_array" : {

View File

@@ -41,6 +41,10 @@ namespace e2d
return *this; return *this;
} }
spine_player& spine_player::add_animation(u32 track, const str& name, secf delay) {
return add_animation(track, name, false, delay);
}
spine_player& spine_player::add_animation(u32 track, const str& name, bool loop, secf delay) { spine_player& spine_player::add_animation(u32 track, const str& name, bool loop, secf delay) {
E2D_ASSERT(model_ && animation_); E2D_ASSERT(model_ && animation_);
E2D_ASSERT(track < max_track_count); E2D_ASSERT(track < max_track_count);

View File

@@ -80,8 +80,11 @@ namespace e2d
spine_model& spine_model::mix_animations(const str& from, const str& to, secf duration) { spine_model& spine_model::mix_animations(const str& from, const str& to, secf duration) {
E2D_ASSERT(animation_); E2D_ASSERT(animation_);
spAnimationStateData_setMixByName(animation_.get(), from.c_str(), to.c_str(), duration.value); E2D_ASSERT(spSkeletonData_findAnimation(animation_->skeletonData, from.c_str()));
return *this; E2D_ASSERT(spSkeletonData_findAnimation(animation_->skeletonData, to.c_str()));
spAnimationStateData_setMixByName(animation_.get(), from.c_str(), to.c_str(), duration.value);
return *this;
} }
const spine_model::atlas_ptr& spine_model::atlas() const noexcept { const spine_model::atlas_ptr& spine_model::atlas() const noexcept {

View File

@@ -14,10 +14,11 @@
namespace e2d namespace e2d
{ {
spine_system::spine_system() spine_system::spine_system() {}
{}
spine_system::~spine_system() noexcept = default; spine_system::~spine_system() noexcept {
spAnimationState_disposeStatics();
}
void spine_system::process(ecs::registry& owner) { void spine_system::process(ecs::registry& owner) {
float dt = the<engine>().delta_time(); float dt = the<engine>().delta_time();