mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-16 14:08:59 +07:00
update sample: added key bindings to start animations, bug fix
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -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_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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" : {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user