Class: FelECS::ComponentManager
- Inherits:
-
Object
- Object
- FelECS::ComponentManager
- Defined in:
- lib/felecs/component_manager.rb
Overview
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.
Class Attribute Summary collapse
-
.addition_triggers ⇒ Array<System>
readonly
Stores references to systems that should be triggered when this component is added to an enitity.
-
.attr_triggers ⇒ Hash<Symbol, System>
readonly
Stores references to systems that should be triggered when an attribute from this component changed.
-
.removal_triggers ⇒ Array<System>
readonly
Stores references to systems that should be triggered when this component is removed from an enitity.
Instance Attribute Summary collapse
-
#addition_triggers ⇒ Array<System>
readonly
Stores references to systems that should be triggered when a component from this manager is added.
-
#attr_triggers ⇒ Hash<Symbol, Array<System>>
readonly
Stores references to systems that should be triggered when an attribute from this manager is changed.
-
#removal_triggers ⇒ Array<System>
readonly
Stores references to systems that should be triggered when a component from this manager is removed.
Instance Method Summary collapse
-
#delete ⇒ Boolean
Removes this component from the list and purges all references to this Component from other Entities, as well as its data.
-
#entities ⇒ Array<Component>
Entities that have this component.
-
#entity ⇒ Component
A single entity.
-
#initialize(**attrs) ⇒ Component
constructor
Creates a new component and sets the values of the attributes given to it.
-
#to_h ⇒ Hash<Symbol, Value>
A hash, where all the keys are attributes storing their respective values.
-
#update_attrs(**opts) ⇒ Hash<Symbol, Value>
Update attribute values using a hash or keywords.
Constructor Details
#initialize(**attrs) ⇒ Component
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.
134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# 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 |
Class Attribute Details
.addition_triggers ⇒ Array<System>
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.
182 183 184 |
# File 'lib/felecs/component_manager.rb', line 182 def addition_triggers @addition_triggers ||= [] end |
.attr_triggers ⇒ Hash<Symbol, System>
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.
198 199 200 |
# File 'lib/felecs/component_manager.rb', line 198 def attr_triggers @attr_triggers ||= {} end |
.removal_triggers ⇒ Array<System>
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.
190 191 192 |
# File 'lib/felecs/component_manager.rb', line 190 def removal_triggers @removal_triggers ||= [] end |
Instance Attribute Details
#addition_triggers ⇒ Array<System>
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.
111 112 113 |
# File 'lib/felecs/component_manager.rb', line 111 def addition_triggers @addition_triggers ||= [] end |
#attr_triggers ⇒ Hash<Symbol, Array<System>>
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.
127 128 129 |
# File 'lib/felecs/component_manager.rb', line 127 def attr_triggers @attr_triggers ||= {} end |
#removal_triggers ⇒ Array<System>
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.
119 120 121 |
# File 'lib/felecs/component_manager.rb', line 119 def removal_triggers @removal_triggers ||= [] end |
Instance Method Details
#delete ⇒ Boolean
Removes this component from the list and purges all references to this Component from other Entities, as well as its data.
249 250 251 252 253 254 255 256 257 258 259 260 261 |
# 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 ⇒ Array<Component>
Entities that have this component
211 212 213 |
# File 'lib/felecs/component_manager.rb', line 211 def entities @entities ||= [] end |
#entity ⇒ Component
A single entity. Use this if you expect the component to only belong to one entity and you want to access it.
217 218 219 220 221 222 223 224 |
# 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 |
#to_h ⇒ Hash<Symbol, Value>
Returns A hash, where all the keys are attributes storing their respective values.
264 265 266 267 268 269 270 |
# 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_attrs(**opts) ⇒ Hash<Symbol, Value>
Update attribute values using a hash or keywords.
228 229 230 231 232 |
# File 'lib/felecs/component_manager.rb', line 228 def update_attrs(**opts) opts.each do |key, value| send "#{key}=", value end end |