mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +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(const spine_model_asset::ptr& model);
|
||||
|
||||
spine_player& set_animation(u32 track, const str& name, bool loop);
|
||||
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& set_animation(u32 track, const str& name, bool loop = false);
|
||||
|
||||
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();
|
||||
|
||||
|
||||
@@ -1,6 +1,38 @@
|
||||
{
|
||||
"skeleton" : "raptor/raptor-pro.json-large",
|
||||
"atlas" : "raptor/raptor.atlas",
|
||||
"scale" : 1.0,
|
||||
"premultiplied_alpha" : false
|
||||
}
|
||||
"skeleton": "raptor/raptor-pro.json-large",
|
||||
"atlas": "raptor/raptor.atlas",
|
||||
"scale": 1.0,
|
||||
"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 {
|
||||
public:
|
||||
game_system(gobject_iptr raptor)
|
||||
: raptor_gobj_(raptor) {}
|
||||
|
||||
~game_system() noexcept override {}
|
||||
|
||||
void process(ecs::registry& owner) override {
|
||||
E2D_UNUSED(owner);
|
||||
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) ) {
|
||||
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 {
|
||||
@@ -69,7 +102,6 @@ namespace
|
||||
|
||||
node_iptr scene_r = scene_i->get_component<actor>().get().node();
|
||||
|
||||
#if 1
|
||||
auto coin_i = the<world>().instantiate();
|
||||
coin_i->entity_filler()
|
||||
.component<actor>(node::create(coin_i, scene_r))
|
||||
@@ -80,42 +112,22 @@ namespace
|
||||
.set_animation(0, "animation", true));
|
||||
|
||||
node_iptr coin_n = coin_i->get_component<actor>().get().node();
|
||||
coin_n->scale(v3f(0.5f));
|
||||
coin_n->translation(v3f{150.0f, 0.0f, 0.0f});
|
||||
coin_n->scale(v3f(0.125f));
|
||||
coin_n->translation(v3f{200.0f, 200.0f, 0.0f});
|
||||
|
||||
auto raptor_i = the<world>().instantiate();
|
||||
raptor_i->entity_filler()
|
||||
.component<actor>(node::create(raptor_i, scene_r))
|
||||
raptor_gobj_ = the<world>().instantiate();
|
||||
raptor_gobj_->entity_filler()
|
||||
.component<actor>(node::create(raptor_gobj_, 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)));
|
||||
.set_animation(0, "walk", true));
|
||||
|
||||
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->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;
|
||||
}
|
||||
|
||||
@@ -130,11 +142,14 @@ namespace
|
||||
|
||||
bool create_systems() {
|
||||
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<spine_system>(world::priority_update);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
gobject_iptr raptor_gobj_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -32,10 +32,7 @@ namespace
|
||||
"scale" : { "type" : "number" },
|
||||
"atlas" : { "$ref" : "#/common_definitions/address" },
|
||||
"premultiplied_alpha" : { "type" : "boolean" },
|
||||
"mix_animations" : {
|
||||
"type" : "array",
|
||||
"items" : { "$ref": "#/definitions/spine_animation_mix_array" }
|
||||
}
|
||||
"mix_animations" : { "$ref": "#/definitions/spine_animation_mix_array" }
|
||||
},
|
||||
"definitions" : {
|
||||
"spine_animation_mix_array" : {
|
||||
|
||||
@@ -41,6 +41,10 @@ namespace e2d
|
||||
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) {
|
||||
E2D_ASSERT(model_ && animation_);
|
||||
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) {
|
||||
E2D_ASSERT(animation_);
|
||||
spAnimationStateData_setMixByName(animation_.get(), from.c_str(), to.c_str(), duration.value);
|
||||
return *this;
|
||||
E2D_ASSERT(spSkeletonData_findAnimation(animation_->skeletonData, from.c_str()));
|
||||
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 {
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
|
||||
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) {
|
||||
float dt = the<engine>().delta_time();
|
||||
|
||||
Reference in New Issue
Block a user