/******************************************************************************* * This file is part of the "Enduro2D" * For conditions of distribution and use, see copyright notice in LICENSE.md * Copyright (C) 2018-2020, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include "../common.hpp" using namespace e2d; namespace { struct node_rotator { }; struct renderer_rotator { v3f delta; }; class game_system final : public systems::update_system { public: void process( ecs::registry& owner, const systems::update_event& event) override { E2D_UNUSED(owner, event); const keyboard& k = the().keyboard(); if ( k.is_key_just_released(keyboard_key::f1) ) { the().toggle_visible(!the().visible()); } if ( k.is_key_just_released(keyboard_key::escape) ) { the().set_should_close(true); } if ( k.is_key_pressed(keyboard_key::lsuper) && k.is_key_just_released(keyboard_key::enter) ) { the().toggle_fullscreen(!the().fullscreen()); } } }; class rotator_system final : public systems::update_system { public: void process( ecs::registry& owner, const systems::update_event& event) override { owner.for_joined_components( [&event](const ecs::const_entity&, const node_rotator&, actor& act){ const node_iptr node = act.node(); if ( node ) { node->rotation(event.time); } }); owner.for_joined_components( [&event](const ecs::const_entity&, const renderer_rotator& rot, renderer& r){ r.rotation(r.rotation() + rot.delta * event.dt); }); } }; class game final : public starter::application { public: bool initialize() final { return create_scene() && create_systems(); } private: bool create_scene() { auto model_res = the().load_asset("models/gnome/gnome_model.json"); auto model_mat = the().load_asset("models/gnome/gnome_material.json"); auto sprite_res = the().load_asset("sprites/ship_sprite.json"); auto sprite_mat = the().load_asset("materials/sprite_material_normal.json"); auto flipbook_res = the().load_asset("sprites/cube_flipbook.json"); if ( !model_res || !model_mat || !sprite_res || !sprite_mat || !flipbook_res ) { return false; } auto scene_i = the().instantiate(); scene_i.component().assign(); scene_i.component().assign("scene"); { prefab prefab; prefab.prototype() .component(named() .name("camera")) .component(camera() .background({1.f, 0.4f, 0.f, 1.f})) .component(); the().instantiate( prefab, scene_i.component()->node()); } { prefab prefab; prefab.prototype() .component(named() .name("gnome")) .component(v3f::unit_y()) .component(renderer() .materials({model_mat}) .translation({0.f, 0.f, 5.f})) .component(model_res); the().instantiate( prefab, scene_i.component()->node(), make_trs2(v2f{0,50.f}, 0.f, v2f{20.f})); } { prefab sprite_prefab; sprite_prefab.prototype() .component(named() .name("sprite")) .component(actor() .node(node::create(math::make_translation_trs2(v2f{-33.f,-56.5f})))) .component() .component(sprite_renderer(sprite_res) .materials({{"normal", sprite_mat}})); prefab prefab; prefab.prototype() .component(named() .name("ship")) .component(); prefab.set_children({sprite_prefab}); the().instantiate( prefab, scene_i.component()->node(), math::make_translation_trs2(v2f{0,-50.f})); } { prefab sprite_prefab; sprite_prefab.prototype() .component(named() .name("sprite")) .component(actor() .node(node::create(math::make_translation_trs2(v2f{-12.f,-12.f})))) .component() .component(sprite_renderer() .filtering(false) .materials({{"normal", sprite_mat}})) .component(flipbook_player(flipbook_res) .play("idle") .looped(true)); prefab child_prefab; child_prefab.prototype() .component(named() .name("child")) .component(actor() .node(node::create(make_trs2( v2f{20.f,0.f}, 0.f, v2f{0.3f,0.3f})))) .component(); child_prefab.set_children({sprite_prefab}); prefab root_prefab; root_prefab.prototype() .component(named() .name("root")) .component(); root_prefab.set_children({sprite_prefab, child_prefab}); for ( std::size_t i = 0; i < 2; ++i ) for ( std::size_t j = 0; j < 5; ++j ) { t2f trans{ {-80.f + j * 40.f, -200.f + i * 40.f}, 0.f, {2.f,2.f}}; the().instantiate( root_prefab, scene_i.component()->node(), trans); } } return true; } bool create_systems() { ecs::registry_filler(the().registry()) .feature(ecs::feature() .add_system() .add_system()); return true; } }; } int e2d_main(int argc, char *argv[]) { const auto starter_params = starter::parameters( engine::parameters("sample_03", "enduro2d") .window_params(engine::window_parameters() .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100))); modules::initialize(argc, argv, starter_params).start(); modules::shutdown(); return 0; }