76 lines
1.6 KiB
Crystal
76 lines
1.6 KiB
Crystal
require "./component_container"
|
|
|
|
class ECS::World
|
|
@debug = false
|
|
@systems = Hash(String, ECS::System).new
|
|
include ECS::ComponentContainer
|
|
include ECS::World::HasWorldRef
|
|
|
|
def initialize(@debug)
|
|
world = self
|
|
end
|
|
|
|
def <<(named_system : NamedTuple(name: String, system: ECS::System))
|
|
named_system[:system].world = self
|
|
@systems[named_system[:name]] = named_system[:system]
|
|
STDERR.puts "world# add named system #{named_system[:system].world}"
|
|
self
|
|
end
|
|
|
|
def [](name : String) : ECS::System
|
|
@systems[name]
|
|
end
|
|
|
|
def init : self
|
|
STDERR.puts "world# init" if @debug
|
|
@systems.each do |name, system|
|
|
if system.is_a? ECS::System::Init
|
|
STDERR.puts "world# init #{name}" if @debug
|
|
system.init
|
|
end
|
|
end
|
|
self
|
|
end
|
|
|
|
def update : self
|
|
STDERR.puts "world# update" if @debug
|
|
@systems.each do |name, system|
|
|
if system.is_a? ECS::System::Update
|
|
STDERR.puts "world# update #{name}" if @debug
|
|
system.update
|
|
end
|
|
end
|
|
self
|
|
end
|
|
|
|
def cleanup
|
|
STDERR.puts "world# cleanup" if @debug
|
|
@systems.each do |name, system|
|
|
if system.is_a? ECS::System::Cleanup
|
|
STDERR.puts "world# cleanup #{name}" if @debug
|
|
system.cleanup
|
|
end
|
|
end
|
|
self
|
|
end
|
|
|
|
# Allows other objects to have a ref to the world
|
|
module HasWorldRef
|
|
@world : ECS::World? = nil
|
|
getter world
|
|
|
|
def world=(world : ECS::World?)
|
|
@world = world
|
|
self
|
|
end
|
|
|
|
def world : ECS::World
|
|
if @world.nil?
|
|
raise "No world set, error during the link with #{self.class}"
|
|
else
|
|
@world.as ECS::World
|
|
end
|
|
end
|
|
end
|
|
end
|