Class: FelFlame::ComponentManager
- Inherits:
-
Object
- Object
- FelFlame::ComponentManager
- Defined in:
- lib/felflame/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 #attrs 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.
-
#id ⇒ Integer
readonly
Holds the unique ID of a component.
-
#removal_triggers ⇒ Array<System>
readonly
Stores references to systems that should be triggered when a component from this manager is removed.
Class Method Summary collapse
-
.[](component_id) ⇒ Component
Gets a Component from the given unique ID.
-
.each(&block) ⇒ Enumerator
Iterates over all components within the component manager.
Instance Method Summary collapse
-
#attr_changed_trigger_systems(attr) ⇒ Boolean
Execute systems that have been added to execute on variable change.
-
#attrs ⇒ Hash<Symbol, Value>
A hash, where all the keys are attributes linked to their respective values.
-
#delete ⇒ Boolean
Removes this component from the list and purges all references to this Component from other Entities, as well as its ID and data.
-
#entities ⇒ Array<Integer>
A list of entity ids that are linked to the component.
-
#initialize(**attrs) ⇒ Component
constructor
Creates a new component and sets the values of the attributes given to it.
-
#to_i ⇒ Integer
An alias for the ID Reader.
-
#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.
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/felflame/component_manager.rb', line 104 def initialize(**attrs) # Prepare the object # (this is a function created with metaprogramming # in FelFlame::Components set_defaults # Generate ID new_id = self.class.data.find_index { |i| i.nil? } new_id = self.class.data.size if new_id.nil? @id = new_id # Fill params attrs.each do |key, value| send "#{key}=", value end # Save Component self.class.data[new_id] = 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 FelFlame automatically.
136 137 138 |
# File 'lib/felflame/component_manager.rb', line 136 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 FelFlame automatically.
152 153 154 |
# File 'lib/felflame/component_manager.rb', line 152 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 FelFlame automatically.
144 145 146 |
# File 'lib/felflame/component_manager.rb', line 144 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 FelFlame automatically.
81 82 83 |
# File 'lib/felflame/component_manager.rb', line 81 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 FelFlame automatically.
97 98 99 |
# File 'lib/felflame/component_manager.rb', line 97 def attr_triggers @attr_triggers ||= {} end |
#id ⇒ Integer
63 64 65 |
# File 'lib/felflame/component_manager.rb', line 63 def id @id 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 FelFlame automatically.
89 90 91 |
# File 'lib/felflame/component_manager.rb', line 89 def removal_triggers @removal_triggers ||= [] end |
Class Method Details
.[](component_id) ⇒ Component
Gets a Component from the given unique ID. Usage is simular to how an Array lookup works.
169 170 171 |
# File 'lib/felflame/component_manager.rb', line 169 def [](component_id) data[component_id] end |
.each(&block) ⇒ Enumerator
Iterates over all components within the component manager. Special Enumerable methods like map
or each_with_index
are not implemented
176 177 178 |
# File 'lib/felflame/component_manager.rb', line 176 def each(&block) data.compact.each(&block) end |
Instance Method Details
#attr_changed_trigger_systems(attr) ⇒ Boolean
Execute systems that have been added to execute on variable change
203 204 205 206 207 208 209 210 211 |
# File 'lib/felflame/component_manager.rb', line 203 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 |
#attrs ⇒ Hash<Symbol, Value>
Returns A hash, where all the keys are attributes linked to their respective values.
235 236 237 238 239 240 241 |
# File 'lib/felflame/component_manager.rb', line 235 def attrs 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 |
#delete ⇒ Boolean
Removes this component from the list and purges all references to this Component from other Entities, as well as its ID and data.
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/felflame/component_manager.rb', line 215 def delete addition_triggers.each do |system| system.clear_triggers component_or_manager: self end # This needs to be cloned because indices get deleted as # the remove command is called, breaking the loop if it # wasn't referencing a clone(will get Nil errors) iter = entities.map(&:clone) iter.each do |entity| #FelFlame::Entities[entity_id].remove self #unless FelFlame::Entities[entity_id].nil? entity.remove self end self.class.data[id] = nil instance_variables.each do |var| instance_variable_set(var, nil) end true end |
#entities ⇒ Array<Integer>
A list of entity ids that are linked to the component
189 190 191 |
# File 'lib/felflame/component_manager.rb', line 189 def entities @entities ||= [] end |
#to_i ⇒ Integer
An alias for the ID Reader
183 184 185 |
# File 'lib/felflame/component_manager.rb', line 183 def to_i id end |
#update_attrs(**opts) ⇒ Hash<Symbol, Value>
Update attribute values using a hash or keywords.
195 196 197 198 199 |
# File 'lib/felflame/component_manager.rb', line 195 def update_attrs(**opts) opts.each do |key, value| send "#{key}=", value end end |