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) ⇒ 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.



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

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



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

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)


111
112
113
# File 'entity_manager.rb', line 111

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

.from_json(json_string, **opts) ⇒ Object

Creates a new entity using the data from a JSON string TODO: This function is not yet complete

Parameters:

  • json_string (String)

    A string that was exported originally using the to_json function

  • opts (Keywords)

    What values(its ID or the component IDs) should be overwritten TODO: this might change



119
# File 'entity_manager.rb', line 119

def from_json(json_string, **opts) end

Instance Method Details

#add(*components_to_add) ⇒ Boolean

Add any number components to the Entity.

Parameters:

  • component (Component)

    Any number of components created from any component manager

Returns:

  • (Boolean)

    true if component is added, false if it already is attached or no components given



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

def add(*components_to_add)
  added = false
  components_to_add.each do |component|
    if components[component.class].nil?
      components[component.class] = [component.id]
      component.entities.push id
      added =true
    elsif !components[component.class].include? component.id
      components[component.class].push component.id
      component.entities.push id
      added = true
    end
  end
  added
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 the components attached to this entity.

Returns:

  • (Hash)


27
28
29
# File 'entity_manager.rb', line 27

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.



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

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

#remove(*components_to_remove) ⇒ Boolean

Remove a component from the Entity

Parameters:

  • component_to_remove (Component)

    A component created from any component manager

Returns:

  • (Boolean)

    true if at least one component is removed, false if none of them were attached to the component



73
74
75
76
77
78
79
80
81
82
# File 'entity_manager.rb', line 73

def remove(*components_to_remove)
  removed = false
  components_to_remove.each do |component|
    components[component.class].delete component.id
    if component.entities.delete id
      removed = true
    end
  end
  removed
end

#to_iInteger

An alias for the ID reader

Returns:

  • (Integer)


33
34
35
# File 'entity_manager.rb', line 33

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



87
# File 'entity_manager.rb', line 87

def to_json() end