class FelECS::ComponentManager
Component Managers are what is used to create individual components which can be attached to entities. When a Component is created from a Component Manager that has accessors given to it, you can set or get the values of those accessors using standard ruby message sending (e.g +@component.var = 5+), or by using the {#to_h} and {#update_attrs} methods instead.
Attributes
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Allows overwriting the storage of triggers, such as for clearing. This method should generally only need to be used internally and not by a game developer. @!visibility private
Public Class Methods
@return [Array<Component>] Array of all Components
that belong to a given component manager @!visibility private
# File lib/felecs/component_manager.rb, line 204 def _data @data ||= [] end
Stores references to systems that should be triggered when this component is added to an enitity. Do not edit this array as it is managed by FelECS
automatically. @return [Array<System>]
# File lib/felecs/component_manager.rb, line 182 def addition_triggers @addition_triggers ||= [] end
Stores references to systems that should be triggered when an attribute from this component changed. Do not edit this hash as it is managed by FelECS
automatically. @return [Hash<Symbol, System>]
# File lib/felecs/component_manager.rb, line 198 def attr_triggers @attr_triggers ||= {} end
Makes component managers behave like arrays with additional methods for managing the array @!visibility private
# File lib/felecs/component_manager.rb, line 164 def method_missing(method, *args, **kwargs, &block) if _data.respond_to? method _data.send(method, *args, **kwargs, &block) else super end end
Creates a new component and sets the values of the attributes given to it. If an attritbute is not passed then it will remain as the default. @param attrs [Keyword: Value] You can pass any number of Keyword-Value pairs @return [Component]
# File lib/felecs/component_manager.rb, line 134 def initialize(**attrs) # Prepare the object # (this is a function created with metaprogramming # in FelECS::Components) set_defaults # Fill params attrs.each do |key, value| send "#{key}=", value end # Save Component self.class.push self end
Stores references to systems that should be triggered when this component is removed from an enitity. Do not edit this array as it is managed by FelECS
automatically. @return [Array<System>]
# File lib/felecs/component_manager.rb, line 190 def removal_triggers @removal_triggers ||= [] end
Makes component managers behave like arrays with additional methods for managing the array @!visibility private
# File lib/felecs/component_manager.rb, line 153 def respond_to_missing?(method, *) if _data.respond_to? method true else super end end
Public Instance Methods
Stores references to systems that should be triggered when a component from this manager is added. Do not edit this array as it is managed by FelECS
automatically. @return [Array<System>]
# File lib/felecs/component_manager.rb, line 111 def addition_triggers @addition_triggers ||= [] end
Execute systems that have been added to execute on variable change @return [Boolean] true
@!visibility private
# File lib/felecs/component_manager.rb, line 237 def attr_changed_trigger_systems(attr) systems_to_execute = self.class.attr_triggers[attr] systems_to_execute = [] if systems_to_execute.nil? systems_to_execute |= attr_triggers[attr] unless attr_triggers[attr].nil? systems_to_execute.sort_by(&:priority).reverse_each(&:call) true end
Stores references to systems that should be triggered when an attribute from this manager is changed. Do not edit this hash as it is managed by FelECS
automatically. @return [Hash<Symbol, Array<System>>]
# File lib/felecs/component_manager.rb, line 127 def attr_triggers @attr_triggers ||= {} end
Removes this component from the list and purges all references to this Component from other Entities
, as well as its data. @return [Boolean] true
.
# File lib/felecs/component_manager.rb, line 249 def delete addition_triggers.each do |system| system.clear_triggers component_or_manager: self end entities.reverse_each do |entity| entity.remove self end self.class._data.delete self instance_variables.each do |var| instance_variable_set(var, nil) end true end
Entities
that have this component @return [Array<Component>]
# File lib/felecs/component_manager.rb, line 211 def entities @entities ||= [] end
A single entity. Use this if you expect the component to only belong to one entity and you want to access it. @return [Component]
# File lib/felecs/component_manager.rb, line 217 def entity if entities.empty? Warning.warn("This component belongs to NO entities but you called the method that is intended for components belonging to a single entity.\nYou may have a bug in your logic.") elsif entities.length > 1 Warning.warn("This component belongs to MANY entities but you called the method that is intended for components belonging to a single entity.\nYou may have a bug in your logic.") end entities.first end
Stores references to systems that should be triggered when a component from this manager is removed. Do not edit this array as it is managed by FelECS
automatically. @return [Array<System>]
# File lib/felecs/component_manager.rb, line 119 def removal_triggers @removal_triggers ||= [] end
@return [Hash<Symbol, Value>] A hash, where all the keys are attributes storing their respective values.
# File lib/felecs/component_manager.rb, line 264 def to_h return_hash = instance_variables.each_with_object({}) do |key, final| final[key.to_s.delete_prefix('@').to_sym] = instance_variable_get(key) end return_hash.delete(:attr_triggers) return_hash end
Update attribute values using a hash or keywords. @return [Hash<Symbol, Value>] Hash of updated attributes
# File lib/felecs/component_manager.rb, line 228 def update_attrs(**opts) opts.each do |key, value| send "#{key}=", value end end