aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/Script.h
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-11-16 21:45:36 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-11-16 21:45:36 +0100
commit73598a9e7f49047d74ca439cb0f300099d8c03bf (patch)
treeef62148ac6769f169670a1e7f7fd8482045ef65f /src/crepe/api/Script.h
parentd258fcc8efdb6a968a220c4590a204292a16ad42 (diff)
parent121b64b1cb6cfead5814070c8b0185d3d7308095 (diff)
merge `master` into `loek/audio`
Diffstat (limited to 'src/crepe/api/Script.h')
-rw-r--r--src/crepe/api/Script.h47
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