class FelFlame::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 {#attrs} and {#update_attrs} methods instead.

Attributes

addition_triggers[W]

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

attr_triggers[W]

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

removal_triggers[W]

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

addition_triggers[W]

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

attr_triggers[W]

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

id[RW]

Holds the {id unique ID} of a component. The {id ID} is only unique within the scope of the component manager it was created from. @return [Integer]

removal_triggers[W]

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

[](component_id) click to toggle source

Gets a Component from the given {id unique ID}. Usage is simular to how an Array lookup works.

@example

# this gets the 'Health' Component with ID 7
FelFlame::Components::Health[7]

@param component_id [Integer] @return [Component] Returns the Component that uses the given unique {id ID}, nil if there is no Component associated with the given {id ID}

# File lib/felflame/component_manager.rb, line 169
def [](component_id)
  data[component_id]
end
addition_triggers() click to toggle source

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. @return [Array<System>]

# File lib/felflame/component_manager.rb, line 136
def addition_triggers
  @addition_triggers ||= []
end
attr_triggers() click to toggle source

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. @return [Hash<Symbol, System>]

# File lib/felflame/component_manager.rb, line 152
def attr_triggers
  @attr_triggers ||= {}
end
data() click to toggle source

@return [Array<Component>] Array of all Components that belong to a given component manager @!visibility private

# File lib/felflame/component_manager.rb, line 158
def data
  @data ||= []
end
each(&block) click to toggle source

Iterates over all components within the component manager. Special Enumerable methods like map or each_with_index are not implemented @return [Enumerator]

# File lib/felflame/component_manager.rb, line 176
def each(&block)
  data.compact.each(&block)
end
new(**attrs) click to toggle source

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/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
removal_triggers() click to toggle source

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. @return [Array<System>]

# File lib/felflame/component_manager.rb, line 144
def removal_triggers
  @removal_triggers ||= []
end

Public Instance Methods

addition_triggers() click to toggle source

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. @return [Array<System>]

# File lib/felflame/component_manager.rb, line 81
def addition_triggers
  @addition_triggers ||= []
end
attr_changed_trigger_systems(attr) click to toggle source

Execute systems that have been added to execute on variable change @return [Boolean] true

# 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
attr_triggers() click to toggle source

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. @return [Hash<Symbol, Array<System>>]

# File lib/felflame/component_manager.rb, line 97
def attr_triggers
  @attr_triggers ||= {}
end
attrs() click to toggle source

@return [Hash<Symbol, Value>] A hash, where all the keys are attributes linked to their respective values.

# 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() click to toggle source

Removes this component from the list and purges all references to this Component from other Entities, as well as its {id ID} and data. @return [Boolean] true.

# 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() click to toggle source

A list of entity ids that are linked to the component @return [Array<Integer>]

# File lib/felflame/component_manager.rb, line 189
def entities
  @entities ||= []
end
removal_triggers() click to toggle source

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. @return [Array<System>]

# File lib/felflame/component_manager.rb, line 89
def removal_triggers
  @removal_triggers ||= []
end
to_i() click to toggle source

An alias for the {id ID Reader} @return [Integer]

# File lib/felflame/component_manager.rb, line 183
def to_i
  id
end
update_attrs(**opts) click to toggle source

Update attribute values using a hash or keywords. @return [Hash<Symbol, Value>] Hash of updated attributes

# File lib/felflame/component_manager.rb, line 195
def update_attrs(**opts)
  opts.each do |key, value|
    send "#{key}=", value
  end
end