W4 Component System

From Ciliz|W4

Scope

The W4 framework comes with a component system. A component in this case is the ability to extend the functionality of an object without inheritance.

System features:

  • All components inherit from the base IComponent class.
  • Each component has a unique identifier for its type, by which the component can always be obtained from the container.
  • The container for components is the Node class (see W4 Coordinate system and Node structure).
  • A global list of components is maintained, allowing access to all components of a certain type from anywhere in the application.

IComponent class

Let's consider the main methods of the IComponent public interface:

  • const Id& id() const; - this method allows you to get the id of the component;
  • void enable(bool isEnabled); - enable/disable component. Using this method, you can temporarily disable the functionality of the component and avoid construction and destruction (save the component internal state). A disabled component disappears from the global list of components and the update() method is no longer called for it;
  • bool isEnabled() const; - this method lets you know if the component is enabled;
  • template<typename T> T& as(); - this method casts the pointer/reference to the base component to the component of the desired type;
  • ::w4::core::Node & getOwner(); - this method allows you to get the owner of the given component (the container in which it is contained);
  • const core::TypeInfo& getTypeInfo() const; - this method allows you to get information about the type of the component by the pointer/reference to the base component.

This class has methods that are not recommended to be called directly (this can lead to incorrect application behavior). But these methods can be overloaded if you write your own component (when overloading, do not forget to call the same method on the parent class Super::someMethod(args)):

  • virtual void initialize(const variant::Variant & data);- this method is called when a component is added to the container. Data required for initialization of a specific component type can be passed as an argument;
  • virtual void finalize(); - this method is called when a component is removed from a container and then destroyed. When writing your own component, if you need to perform any actions before destroying the component, all these actions should be performed in the overloaded finalize method;
  • virtual void update(float dt);- this method is called every frame for all components that have this method overloaded. The incoming parameter is the time elapsed since the last call;
  • virtual void onEnabled(bool value); - this method is called when the component is enabled. The method can be overloaded in order to respond to event data.

Component container