Class: FelFlame::Entities

Inherits:
Object
  • Object
show all
Extended by:
Enumerable
Defined in:
lib/felflame.rb,
lib/felflame/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 'lib/felflame/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 'lib/felflame/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



116
117
118
# File 'lib/felflame/entity_manager.rb', line 116

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)


123
124
125
# File 'lib/felflame/entity_manager.rb', line 123

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



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

def add(*components_to_add)
  components_to_add.each do |component|
    if components[component.class].nil?
      components[component.class] = [component]
      component.entities.push self
      check_systems component, :addition_triggers
    elsif !components[component.class].include? component
      components[component.class].push component
      component.entities.push self
      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 'lib/felflame/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
# File 'lib/felflame/entity_manager.rb', line 42

def delete
  components.each do |component_manager, component_array|
    component_array.each do |component|
      component.entities.delete(self)
    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



87
88
89
90
91
92
93
94
# File 'lib/felflame/entity_manager.rb', line 87

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

#to_iInteger

An alias for the ID reader

Returns:

  • (Integer)


36
37
38
# File 'lib/felflame/entity_manager.rb', line 36

def to_i
  id
end