EntityCoolSystem/src/ecs/world.cr

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