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



113
114
115
# File 'entity_manager.rb', line 113

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)


120
121
122
# File 'entity_manager.rb', line 120

def each(&block)
  data.compact.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



128
# File 'entity_manager.rb', line 128

def from_json(json_string, **opts) 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 if component is added, false if it already is attached or no components given



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

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
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
50
# 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)
      #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 if at least one component is removed, false if none of them were attached to the component



84
85
86
87
88
89
90
91
# File 'entity_manager.rb', line 84

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)


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



96
# File 'entity_manager.rb', line 96

def to_json() end