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

TODO: Improve Entity overview

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*components) ⇒ Entities

Creating a new component

Parameters:

  • components (Component)

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



9
10
11
12
13
14
15
16
17
18
19
20
# File 'entity_manager.rb', line 9

def initialize(*components)
  # Assign new unique ID
  new_id = self.class.data.find_index { |i| i.nil? }
  new_id = self.class.data.size if new_id.nil?
  self.id = new_id

  # Add each component
  components.uniq.each do |component|
    add component
  end
  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

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



97
98
99
# File 'entity_manager.rb', line 97

def [](entity_id)
  data[entity_id]
end

.each(&block) ⇒ Enumerator

Iterates over all entities. In general when using ECS the use of this method should never be neccassary unless you are doing something very wrong, however I will not stop you. You also call other enumerable methods instead of each, such as `each_with_index` or `select`

Returns:

  • (Enumerator)


104
105
106
# File 'entity_manager.rb', line 104

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

Instance Method Details

#add(component) ⇒ Boolean

Returns true when added, or false if it already belongs to the Entity Add a component to the Entity

Parameters:

  • component (Component)

    A component created from any component manager

Returns:

  • (Boolean)

    true if component is added, false if it already is attached



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'entity_manager.rb', line 54

def add component
  if components[component.class.to_s.to_sym].nil?
    components[component.class.to_s.to_sym] = [component.id]
    component.linked_entities.push id
    true
  elsif !components[component.class.to_s.to_sym].include? component.id
    components[component.class.to_s.to_sym].push component.id
    component.linked_entities.push id
    true
  else
    false
  end
end

#componentsHash

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

Returns:

  • (Hash)


24
25
26
# File 'entity_manager.rb', line 24

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.



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'entity_manager.rb', line 36

def delete
  components.each do |component_manager, component_array|
    component_array.each do |component_id|
      FelFlame.const_get(
        component_manager.to_s.delete_prefix('FelFlame::')
      )[component_id].linked_entities.delete(id)
    end
  end
  FelFlame::Entities.data[id] = nil
  @id = nil
  @components = nil
  true
end

#remove(component) ⇒ Boolean

Remove a component from the Entity

Parameters:

  • component (Component)

    A component created from any component manager

Returns:

  • (Boolean)

    true if component is removed, false if it wasnt attached to component



71
72
73
74
75
76
77
78
# File 'entity_manager.rb', line 71

def remove component
  components[component.class.to_s.to_sym].delete component.id
  if component.linked_entities.delete id
    true
  else
    false
  end
end

#to_iInteger

An alias for the ID reader

Returns:

  • (Integer)


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

def to_i
  id
end

#to_jsonString

Export all data into a JSON String which can then be saved into a file TODO: This function is not yet complete

Returns:

  • (String)

    A JSON formatted String



83
84
# File 'entity_manager.rb', line 83

def to_json
end