diff options
Diffstat (limited to 'src/crepe/api/Script.h')
-rw-r--r-- | src/crepe/api/Script.h | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 68a46d7..2b70379 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -2,6 +2,8 @@ #include <vector> +#include "../types.h" + namespace crepe { class ScriptSystem; @@ -11,33 +13,31 @@ class ComponentManager; /** * \brief Script interface * - * This class is used as a base class for user-defined scripts that can be - * added to game objects using the \c BehaviorScript component. + * This class is used as a base class for user-defined scripts that can be added to game + * objects using the \c BehaviorScript component. + * + * \note Additional *events* (like Unity's OnDisable and OnEnable) should be implemented as + * member or lambda methods in derivative user script classes and registered in \c init(). */ class Script { - //! ScriptSystem calls \c update() - friend class crepe::ScriptSystem; - protected: /** * \brief Script initialization function * * This function is called during the ScriptSystem::update() routine *before* - * Script::update() if it (a) has not yet been called and (b) the \c - * BehaviorScript component holding this script instance is active. + * Script::update() if it (a) has not yet been called and (b) the \c BehaviorScript component + * holding this script instance is active. */ virtual void init() {} /** * \brief Script update function * - * This function is called during the ScriptSystem::update() routine if the - * \c BehaviorScript component holding this script instance is active. + * This function is called during the ScriptSystem::update() routine if the \c BehaviorScript + * component holding this script instance is active. */ virtual void update() {} - // NOTE: additional *events* (like unity's OnDisable and OnEnable) should be - // implemented as member methods in derivative user script classes and - // registered in init(), otherwise this class will balloon in size with each - // added event. + //! ScriptSystem calls \c init() and \c update() + friend class crepe::ScriptSystem; protected: /** @@ -47,11 +47,12 @@ protected: * * \returns Reference to component * - * \throws nullptr if this game object does not have a component matching - * type \c T + * \throws nullptr if this game object does not have a component matching type \c T */ template <typename T> T & get_component() const; + // TODO: make get_component calls for component types that can have more than 1 instance + // cause compile-time errors /** * \brief Get all components of type \c T on this game object (utility) @@ -64,18 +65,22 @@ protected: std::vector<std::reference_wrapper<T>> get_components() const; protected: - // NOTE: Script must have a constructor without arguments so the game - // programmer doesn't need to manually add `using Script::Script` to their - // concrete script class. + // NOTE: Script must have a constructor without arguments so the game programmer doesn't need + // to manually add `using Script::Script` to their concrete script class. Script() = default; //! Only \c BehaviorScript instantiates Script friend class BehaviorScript; private: - // These references are set by BehaviorScript immediately after calling the - // constructor of Script. - BehaviorScript * parent_ref = nullptr; + // These references are set by BehaviorScript immediately after calling the constructor of + // Script. + game_object_id_t game_object_id = -1; ComponentManager * component_manager_ref = nullptr; + // TODO: use OptionalRef instead of pointer + +private: + //! Flag to indicate if \c init() has been called already + bool initialized = false; }; } // namespace crepe |