Class: FelFlame::ComponentManager

Inherits:
Object
  • Object
show all
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 #to_h and #update_attrs methods instead.

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

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.

Parameters:

  • attrs (Keyword: Value)

    You can pass any number of Keyword-Value pairs



132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/felflame/component_manager.rb', line 132

def initialize(**attrs)
  # Prepare the object
  # (this is a function created with metaprogramming
  # in FelFlame::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_triggersArray<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.

Returns:

  • (Array<System>)


180
181
182
# File 'lib/felflame/component_manager.rb', line 180

def addition_triggers
  @addition_triggers ||= []
end

.attr_triggersHash<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.

Returns:

  • (Hash<Symbol, System>)


196
197
198
# File 'lib/felflame/component_manager.rb', line 196

def attr_triggers
  @attr_triggers ||= {}
end

.removal_triggersArray<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.

Returns:

  • (Array<System>)


188
189
190
# File 'lib/felflame/component_manager.rb', line 188

def removal_triggers
  @removal_triggers ||= []
end

Instance Attribute Details

#addition_triggersArray<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.

Returns:

  • (Array<System>)


109
110
111
# File 'lib/felflame/component_manager.rb', line 109

def addition_triggers
  @addition_triggers ||= []
end

#attr_triggersHash<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.

Returns:

  • (Hash<Symbol, Array<System>>)


125
126
127
# File 'lib/felflame/component_manager.rb', line 125

def attr_triggers
  @attr_triggers ||= {}
end

#removal_triggersArray<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.

Returns:

  • (Array<System>)


117
118
119
# File 'lib/felflame/component_manager.rb', line 117

def removal_triggers
  @removal_triggers ||= []
end

Instance Method Details

#deleteBoolean

Removes this component from the list and purges all references to this Component from other Entities, as well as its data.

Returns:

  • (Boolean)

    true.



247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/felflame/component_manager.rb', line 247

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

#entitiesArray<Component>

Entities that have this component

Returns:

  • (Array<Component>)


209
210
211
# File 'lib/felflame/component_manager.rb', line 209

def entities
  @entities ||= []
end

#entityComponent

A single entity. Use this if you expect the component to only belong to one entity and you want to access it.

Returns:

  • (Component)


215
216
217
218
219
220
221
222
# File 'lib/felflame/component_manager.rb', line 215

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_hHash<Symbol, Value>

Returns A hash, where all the keys are attributes storing their respective values.

Returns:

  • (Hash<Symbol, Value>)

    A hash, where all the keys are attributes storing their respective values.



262
263
264
265
266
267
268
# File 'lib/felflame/component_manager.rb', line 262

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.

Returns:

  • (Hash<Symbol, Value>)

    Hash of updated attributes



226
227
228
229
230
# File 'lib/felflame/component_manager.rb', line 226

def update_attrs(**opts)
  opts.each do |key, value|
    send "#{key}=", value
  end
end