Class: FelFlame::Entities

Inherits:
Object
  • Object
show all
Extended by:
Enumerable
Defined in:
felflame.rb,
entity_manager.rb

Overview

Creates and manages Entities. Allows accessing Entities using their ID. Entities are just collections of Components.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*components) ⇒ Entity

Creating a new Entity

Parameters:

  • components (Components)

    Can be any number of components, identical duplicates will be automatically purged however different components from the same component manager are allowed.



16
17
18
19
20
21
22
23
24
25
26
# File 'entity_manager.rb', line 16

def initialize(*components)
  # Assign new unique ID
  new_id = self.class.data.find_index(&:nil?)
  new_id = self.class.data.size if new_id.nil?
  self.id = new_id

  # Add each component
  add(*components)

  self.class.data[id] = self
end

Instance Attribute Details

#idInteger

Holds the unique ID of this entity

Returns:

  • (Integer)


5
6
7
# File 'entity_manager.rb', line 5

def id
  @id
end

Class Method Details

.[](entity_id) ⇒ Entity

Gets an Entity from the given unique ID. Usage is simular to how an Array lookup works

Examples:

# This gets the Entity with ID 7
FelFlame::Entities[7]

Parameters:

  • entity_id (Integer)

Returns:

  • (Entity)

    returns the Entity that uses the given unique ID, nil if there is no Entity associated with the given ID



117
118
119
# File 'entity_manager.rb', line 117

def [](entity_id)
  data[entity_id]
end

.each(&block) ⇒ Enumerator

Iterates over all entities. The data is compacted so that means index does not correlate to ID. You also call other enumerable methods instead of each, such as each_with_index or select

Returns:

  • (Enumerator)


124
125
126
# File 'entity_manager.rb', line 124

def each(&block)
  data.compact.each(&block)
end

Instance Method Details

#add(*components_to_add) ⇒ Boolean

Add any number components to the Entity.

Parameters:

  • components_to_add (Component)

    Any number of components created from any component manager

Returns:

  • (Boolean)

    true



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'entity_manager.rb', line 58

def add(*components_to_add)
  components_to_add.each do |component|
    if components[component.class].nil?
      components[component.class] = [component.id]
      component.entities.push id
      check_systems component, :addition_triggers
    elsif !components[component.class].include? component.id
      components[component.class].push component.id
      component.entities.push id
      check_systems component, :addition_triggers
    end
  end
  true
end

#componentsHash<Component_Manager, Array<Integer>>

A hash that uses component manager constant names as keys, and where the values of those keys are arrays that contain the IDs of the components attached to this entity.

Returns:

  • (Hash<Component_Manager, Array<Integer>>)


30
31
32
# File 'entity_manager.rb', line 30

def components
  @components ||= {}
end

#deleteBoolean

Removes this Entity from the list and purges all references to this Entity from other Components, as well as its ID and data.

Returns:

  • (Boolean)

    true



42
43
44
45
46
47
48
49
50
51
52
53
# File 'entity_manager.rb', line 42

def delete
  components.each do |component_manager, component_array|
    component_array.each do |component_id|
      component_manager[component_id].entities.delete(id)
      #self.remove FelFlame::Components.const_get(component_manager.name)[component_id]
    end
  end
  FelFlame::Entities.data[id] = nil
  @components = {}
  @id = nil
  true
end

#remove(*components_to_remove) ⇒ Boolean

Remove a component from the Entity

Parameters:

  • components_to_remove (Component)

    A component created from any component manager

Returns:

  • (Boolean)

    true



88
89
90
91
92
93
94
95
# File 'entity_manager.rb', line 88

def remove(*components_to_remove)
  components_to_remove.each do |component|
    check_systems component, :removal_triggers if component.entities.include? id
    component.entities.delete id
    components[component.class].delete component.id
  end
  true
end

#to_iInteger

An alias for the ID reader

Returns:

  • (Integer)


36
37
38
# File 'entity_manager.rb', line 36

def to_i
  id
end