Class: Draco::World
- Inherits:
-
Object
- Object
- Draco::World
- Defined in:
- lib/draco.rb
Overview
Public: The container for current Entities and Systems.
Defined Under Namespace
Classes: EntityStore
Class Attribute Summary collapse
-
.default_entities ⇒ Object
readonly
Internal: Returns the default Entities for the class.
-
.default_systems ⇒ Object
readonly
Internal: Returns the default Systems for the class.
Instance Attribute Summary collapse
-
#entities ⇒ Object
readonly
Public: Returns the Array of Entities.
-
#systems ⇒ Object
readonly
Public: Returns the Array of Systems.
Class Method Summary collapse
-
.entity(entity, defaults = {}) ⇒ Object
Public: Adds a default Entity to the World.
-
.inherited(sub) ⇒ Object
Internal: Resets the default components for each class that inherites Entity.
-
.systems(*systems) ⇒ Object
Public: Adds default Systems to the World.
Instance Method Summary collapse
-
#after_initialize ⇒ Object
Public: Callback run after the world is initialized.
-
#after_tick(context, results) ⇒ Object
Public: Callback run after #tick is called.
-
#before_tick(_context) ⇒ Object
Public: Callback run before #tick is called.
-
#component_added(entity, component) ⇒ Object
Public: Callback to run when a component is added to an existing Entity.
-
#component_removed(entity, component) ⇒ Object
Public: Callback to run when a component is added to an existing Entity.
-
#filter(*components) ⇒ Object
Public: Finds all Entities that contain all of the given Components.
-
#initialize(entities: [], systems: []) ⇒ World
constructor
Public: Initializes a World.
-
#inspect ⇒ Object
Public: Returns a String representation of the World.
-
#serialize ⇒ Object
Public: Serializes the World to save the current state.
-
#tick(context) ⇒ Object
Public: Runs all of the Systems every tick.
-
#to_s ⇒ Object
Public: Returns a String representation of the World.
Constructor Details
#initialize(entities: [], systems: []) ⇒ World
Public: Initializes a World.
entities - The Array of Entities for the World (default: []). systems - The Array of System Classes for the World (default: []).
585 586 587 588 589 590 591 592 593 594 595 596 597 598 |
# File 'lib/draco.rb', line 585 def initialize(entities: [], systems: []) default_entities = self.class.default_entities.map do |default| klass, attributes = default name = attributes[:as] entity = klass.new(attributes) instance_variable_set("@#{name}", entity) if name entity end @entities = EntityStore.new(self, default_entities + entities) @systems = self.class.default_systems + systems after_initialize end |
Class Attribute Details
.default_entities ⇒ Object (readonly)
Internal: Returns the default Entities for the class.
569 570 571 |
# File 'lib/draco.rb', line 569 def default_entities @default_entities end |
.default_systems ⇒ Object (readonly)
Internal: Returns the default Systems for the class.
572 573 574 |
# File 'lib/draco.rb', line 572 def default_systems @default_systems end |
Instance Attribute Details
#entities ⇒ Object (readonly)
Public: Returns the Array of Entities.
579 580 581 |
# File 'lib/draco.rb', line 579 def entities @entities end |
#systems ⇒ Object (readonly)
Public: Returns the Array of Systems.
576 577 578 |
# File 'lib/draco.rb', line 576 def systems @systems end |
Class Method Details
.entity(entity, defaults = {}) ⇒ Object
Public: Adds a default Entity to the World.
entity - The class of the Entity to add by default. defaults - The Hash of default values for the Entity. (default: {})
Examples
entity(Player)
entity(Player, position: { x: 0, y: 0 })
Returns nothing.
545 546 547 548 549 550 |
# File 'lib/draco.rb', line 545 def self.entity(entity, defaults = {}) name = defaults[:as] @default_entities.push([entity, defaults]) attr_reader(name.to_sym) if name end |
.inherited(sub) ⇒ Object
Internal: Resets the default components for each class that inherites Entity.
sub - The class that is inheriting Entity.
Returns nothing.
527 528 529 530 531 |
# File 'lib/draco.rb', line 527 def self.inherited(sub) super sub.instance_variable_set(:@default_entities, []) sub.instance_variable_set(:@default_systems, []) end |
.systems(*systems) ⇒ Object
Public: Adds default Systems to the World.
systems - The System or Array list of System classes to add to the World.
Examples
systems(RenderSprites)
systems(RenderSprites, RenderLabels)
Returns nothing.
563 564 565 |
# File 'lib/draco.rb', line 563 def self.systems(*systems) @default_systems += Array(systems).flatten end |
Instance Method Details
#after_initialize ⇒ Object
Public: Callback run after the world is initialized.
This is empty by default but is present to allow plugins to tie into.
Returns nothing.
605 |
# File 'lib/draco.rb', line 605 def after_initialize; end |
#after_tick(context, results) ⇒ Object
Public: Callback run after #tick is called.
This is empty by default but is present to allow plugins to tie into.
context - The context object of the current tick from the game engine. In DragonRuby this is args. results - The System instances that were run.
Returns nothing.
641 |
# File 'lib/draco.rb', line 641 def after_tick(context, results); end |
#before_tick(_context) ⇒ Object
Public: Callback run before #tick is called.
context - The context object of the current tick from the game engine. In DragonRuby this is args.
Returns the systems to run during this tick.
612 613 614 615 616 617 618 |
# File 'lib/draco.rb', line 612 def before_tick(_context) systems.map do |system| entities = filter(system.filter) system.new(entities: entities, world: self) end end |
#component_added(entity, component) ⇒ Object
Public: Callback to run when a component is added to an existing Entity.
entity - The Entity the Component was added to. component - The Component that was added to the Entity.
Returns nothing.
649 |
# File 'lib/draco.rb', line 649 def component_added(entity, component); end |
#component_removed(entity, component) ⇒ Object
Public: Callback to run when a component is added to an existing Entity.
entity - The Entity the Component was removed from. component - The Component that was removed from the Entity.
Returns nothing.
657 |
# File 'lib/draco.rb', line 657 def component_removed(entity, component); end |
#filter(*components) ⇒ Object
Public: Finds all Entities that contain all of the given Components.
components - An Array of Component classes to match.
Returns an Array of matching Entities.
664 665 666 |
# File 'lib/draco.rb', line 664 def filter(*components) entities[components.flatten] end |
#inspect ⇒ Object
Public: Returns a String representation of the World.
680 681 682 |
# File 'lib/draco.rb', line 680 def inspect serialize.to_s end |
#serialize ⇒ Object
Public: Serializes the World to save the current state.
Returns a Hash representing the World.
671 672 673 674 675 676 677 |
# File 'lib/draco.rb', line 671 def serialize { class: self.class.name.to_s, entities: @entities.map(&:serialize), systems: @systems.map { |system| system.name.to_s } } end |
#tick(context) ⇒ Object
Public: Runs all of the Systems every tick.
context - The context object of the current tick from the game engine. In DragonRuby this is args.
Returns nothing
625 626 627 628 629 630 631 |
# File 'lib/draco.rb', line 625 def tick(context) results = before_tick(context).map do |system| system.call(context) end after_tick(context, results) end |
#to_s ⇒ Object
Public: Returns a String representation of the World.
685 686 687 |
# File 'lib/draco.rb', line 685 def to_s serialize.to_s end |