mirror of
https://github.com/Keyslam-Group/Concord.git
synced 2025-09-02 12:24:11 -04:00
Holy shit I just wrote documentation
This commit is contained in:
parent
8810005217
commit
63d8c39b31
9 changed files with 159 additions and 111 deletions
|
@ -18,7 +18,7 @@ function Component.new(populate, inherit)
|
||||||
return component
|
return component
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Creates and initializes a new Bag.
|
--- Creates and initializes a new Bag.
|
||||||
-- @param ... The values passed to the populate function
|
-- @param ... The values passed to the populate function
|
||||||
-- @return A new initialized Bag
|
-- @return A new initialized Bag
|
||||||
function Component:__initialize(...)
|
function Component:__initialize(...)
|
||||||
|
|
|
@ -56,14 +56,14 @@ function Entity:apply()
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Gets a Component from the Entity
|
--- Gets a Component from the Entity.
|
||||||
-- @param component The Component to get
|
-- @param component The Component to get
|
||||||
-- @return The Bag from the Component
|
-- @return The Bag from the Component
|
||||||
function Entity:get(component)
|
function Entity:get(component)
|
||||||
return self.components[component]
|
return self.components[component]
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Returns true if the Entity has the Component
|
--- Returns true if the Entity has the Component.
|
||||||
-- @params component The Component to check against
|
-- @params component The Component to check against
|
||||||
-- @return True if the entity has the Bag. False otherwise
|
-- @return True if the entity has the Bag. False otherwise
|
||||||
function Entity:has(component)
|
function Entity:has(component)
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
local EventManager = {}
|
|
||||||
EventManager.__index = EventManager
|
|
||||||
|
|
||||||
function EventManager.new()
|
|
||||||
local eventManager = setmetatable({
|
|
||||||
listeners = {},
|
|
||||||
}, EventManager)
|
|
||||||
|
|
||||||
return eventManager
|
|
||||||
end
|
|
||||||
|
|
||||||
function EventManager:emit(name, ...)
|
|
||||||
local listeners = self.listeners[name]
|
|
||||||
|
|
||||||
if listeners then
|
|
||||||
for i = 1, #listeners do
|
|
||||||
local listener = listeners[i]
|
|
||||||
listener[1][listener[2]](listener[1], ...)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
function EventManager:register(name, listener, callback, enabled)
|
|
||||||
enabled = enabled == nil and true
|
|
||||||
|
|
||||||
local listeners = self.listeners[name]
|
|
||||||
|
|
||||||
if not listeners then
|
|
||||||
listeners = {count = 0}
|
|
||||||
self.listeners[name] = listeners
|
|
||||||
end
|
|
||||||
|
|
||||||
listeners.count = listeners.count + 1
|
|
||||||
listeners[listeners.count] = {listener, callback or name}
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
function EventManager:deregister(name, listener, callback)
|
|
||||||
local listeners = self.listeners[name]
|
|
||||||
|
|
||||||
if listeners then
|
|
||||||
for index, other in ipairs(listeners) do
|
|
||||||
if listener[1] == other and listener[2] == (callback or name) then
|
|
||||||
table.remove(listeners, index)
|
|
||||||
listeners.count = listeners.count - 1
|
|
||||||
|
|
||||||
if callback then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
return setmetatable(EventManager, {
|
|
||||||
__call = function(_, ...) return EventManager.new(...) end,
|
|
||||||
})
|
|
|
@ -7,7 +7,6 @@ function Fluid.init(settings)
|
||||||
Fluid.component = require(PATH..".component")
|
Fluid.component = require(PATH..".component")
|
||||||
Fluid.system = require(PATH..".system")
|
Fluid.system = require(PATH..".system")
|
||||||
Fluid.instance = require(PATH..".instance")
|
Fluid.instance = require(PATH..".instance")
|
||||||
Fluid.eventManager = require(PATH..".eventManager")
|
|
||||||
|
|
||||||
if settings and settings.useEvents then
|
if settings and settings.useEvents then
|
||||||
Fluid.instances = {}
|
Fluid.instances = {}
|
||||||
|
|
|
@ -1,32 +1,47 @@
|
||||||
local PATH = (...):gsub('%.[^%.]+$', '')
|
local PATH = (...):gsub('%.[^%.]+$', '')
|
||||||
|
|
||||||
local List = require(PATH..".list")
|
local List = require(PATH..".list")
|
||||||
local EventManager = require(PATH..".eventManager")
|
|
||||||
|
|
||||||
local Instance = {}
|
local Instance = {}
|
||||||
Instance.__index = Instance
|
Instance.__index = Instance
|
||||||
|
|
||||||
|
--- Creates a new Instance.
|
||||||
|
-- @return The new instance
|
||||||
function Instance.new()
|
function Instance.new()
|
||||||
local instance = setmetatable({
|
local instance = setmetatable({
|
||||||
entities = List(),
|
entities = List(),
|
||||||
systems = {},
|
systems = List(),
|
||||||
|
events = {},
|
||||||
}, Instance)
|
}, Instance)
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Adds an Entity to the Instance.
|
||||||
|
-- @param e The Entity to add
|
||||||
|
-- @return self
|
||||||
function Instance:addEntity(e)
|
function Instance:addEntity(e)
|
||||||
e.instances:add(self)
|
e.instances:add(self)
|
||||||
self.entities:add(e)
|
self.entities:add(e)
|
||||||
self:checkEntity(e)
|
self:checkEntity(e)
|
||||||
|
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Checks an Entity against all the systems in the Instance.
|
||||||
|
-- @param e The Entity to check
|
||||||
|
-- @return self
|
||||||
function Instance:checkEntity(e)
|
function Instance:checkEntity(e)
|
||||||
for i = 1, self.systems.size do
|
for i = 1, self.systems.size do
|
||||||
self.systems:get(i):__check(e)
|
self.systems:get(i):__check(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Removes an Entity from the Instance.
|
||||||
|
-- @param e The Entity to remove
|
||||||
|
-- @return self
|
||||||
function Instance:removeEntity(e)
|
function Instance:removeEntity(e)
|
||||||
e.instances:remove(self)
|
e.instances:remove(self)
|
||||||
self.entities:remove(e)
|
self.entities:remove(e)
|
||||||
|
@ -34,32 +49,94 @@ function Instance:removeEntity(e)
|
||||||
for i = 1, self.systems.size do
|
for i = 1, self.systems.size do
|
||||||
self.systems:get(i):__remove(e)
|
self.systems:get(i):__remove(e)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
function Instance:addSystem(system, eventName, callback, enabled)
|
|
||||||
self.systems[eventName] = self.systems[eventName] or {}
|
|
||||||
|
|
||||||
local i = #self.systems[eventName] + 1
|
|
||||||
self.systems[eventName][i] = {
|
|
||||||
system = system,
|
|
||||||
eventName = eventName,
|
|
||||||
callback = callback or eventName,
|
|
||||||
enabled = enabled == nil or true,
|
|
||||||
}
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Adds a System to the Instance.
|
||||||
|
-- @param system The System to add
|
||||||
|
-- @param eventName The Event to register to
|
||||||
|
-- @param callback The function name to call. Defaults to eventName
|
||||||
|
-- @param enabled If the system is enabled. Defaults to true
|
||||||
|
-- @return self
|
||||||
|
function Instance:addSystem(system, eventName, callback, enabled)
|
||||||
|
if not self.systems:has(system) then
|
||||||
|
self.systems:add(system)
|
||||||
|
end
|
||||||
|
|
||||||
|
if eventName then
|
||||||
|
self.events[eventName] = self.events[eventName] or {}
|
||||||
|
|
||||||
|
local i = #self.events[eventName] + 1
|
||||||
|
self.events[eventName][i] = {
|
||||||
|
system = system,
|
||||||
|
callback = callback or eventName,
|
||||||
|
enabled = enabled == nil and true or enabled,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Enables a System in the Instance.
|
||||||
|
-- @param system The System to enable
|
||||||
|
-- @param eventName The Event it was registered to
|
||||||
|
-- @param callback The callback it was registered with. Defaults to eventName
|
||||||
|
-- @return self
|
||||||
function Instance:enableSystem(system, eventName, callback)
|
function Instance:enableSystem(system, eventName, callback)
|
||||||
|
return self:setSystem(system, eventName, callback, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Disables a System in the Instance.
|
||||||
|
-- @param system The System to disable
|
||||||
|
-- @param eventName The Event it was registered to
|
||||||
|
-- @param callback The callback it was registered with. Defaults to eventName
|
||||||
|
-- @return self
|
||||||
function Instance:disableSystem(system, eventName, callback)
|
function Instance:disableSystem(system, eventName, callback)
|
||||||
|
return self:setSystem(system, eventName, callback, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Instance:emit(...)
|
--- Sets a System 'enable' in the Instance.
|
||||||
self.eventManager:emit(...)
|
-- @param system The System to set
|
||||||
|
-- @param eventName The Event it was registered to
|
||||||
|
-- @param callback The callback it was registered with. Defaults to eventName
|
||||||
|
-- @param enable The state to set it to
|
||||||
|
-- @return self
|
||||||
|
function Instance:setSystem(system, eventName, callback, enable)
|
||||||
|
callback = callback or eventName
|
||||||
|
|
||||||
|
local listeners = self.events[eventName]
|
||||||
|
|
||||||
|
if listeners then
|
||||||
|
for i = 1, #listeners do
|
||||||
|
local listener = listeners[i]
|
||||||
|
|
||||||
|
if listerner.callback == callback then
|
||||||
|
listerner.enabled = enable
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Emits an Event in the Instance.
|
||||||
|
-- @param eventName The Event that should be emitted
|
||||||
|
-- @param ... Parameters passed to listeners
|
||||||
|
-- @return self
|
||||||
|
function Instance:emit(eventName, ...)
|
||||||
|
local listeners = self.events[eventName]
|
||||||
|
|
||||||
|
if listeners then
|
||||||
|
for i = 1, #listeners do
|
||||||
|
local listener = listeners[i]
|
||||||
|
|
||||||
|
if listener.enabled then
|
||||||
|
listener.system[listener.callback](listener.system, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
local List = {}
|
local List = {}
|
||||||
local mt = {__index = List}
|
local mt = {__index = List}
|
||||||
|
|
||||||
|
--- Creates a new List.
|
||||||
|
-- @return A new list
|
||||||
function List.new()
|
function List.new()
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
objects = {},
|
objects = {},
|
||||||
|
@ -9,20 +11,32 @@ function List.new()
|
||||||
}, mt)
|
}, mt)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Clears the List completely.
|
||||||
|
-- @return self
|
||||||
function List:clear()
|
function List:clear()
|
||||||
self.objects = {}
|
self.objects = {}
|
||||||
self.pointers = {}
|
self.pointers = {}
|
||||||
self.size = 0
|
self.size = 0
|
||||||
|
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Adds an object to the List.
|
||||||
|
-- @param obj The object to add
|
||||||
|
-- @return self
|
||||||
function List:add(obj)
|
function List:add(obj)
|
||||||
local size = self.size + 1
|
local size = self.size + 1
|
||||||
|
|
||||||
self.objects[size] = obj
|
self.objects[size] = obj
|
||||||
self.pointers[obj] = size
|
self.pointers[obj] = size
|
||||||
self.size = size
|
self.size = size
|
||||||
|
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Removes an object from the List.
|
||||||
|
-- @param obj The object to remove
|
||||||
|
-- @return self
|
||||||
function List:remove(obj)
|
function List:remove(obj)
|
||||||
local index = self.pointers[obj]
|
local index = self.pointers[obj]
|
||||||
local size = self.size
|
local size = self.size
|
||||||
|
@ -38,15 +52,20 @@ function List:remove(obj)
|
||||||
self.objects[size] = nil
|
self.objects[size] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
self.pointers[obj] = nil
|
self.pointers[obj] = nil
|
||||||
self.size = size - 1
|
self.size = size - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Gets an object by numerical index.
|
||||||
|
-- @param index The index to look at
|
||||||
|
-- @return The object at the index
|
||||||
function List:get(index)
|
function List:get(index)
|
||||||
return self.objects[index]
|
return self.objects[index]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Gets if the List has the object.
|
||||||
|
-- @param obj The object to search for
|
||||||
|
-- @param true if the list has the object, false otherwise
|
||||||
function List:has(obj)
|
function List:has(obj)
|
||||||
return self.pointers[obj] and true
|
return self.pointers[obj] and true
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,10 @@ local List = require(PATH..".list")
|
||||||
local Pool = {}
|
local Pool = {}
|
||||||
Pool.__index = Pool
|
Pool.__index = Pool
|
||||||
|
|
||||||
|
--- Creates a new Pool
|
||||||
|
-- @param name Identifier for the Pool.
|
||||||
|
-- @param filter Table containing the required Components
|
||||||
|
-- @return The new Pool
|
||||||
function Pool.new(name, filter)
|
function Pool.new(name, filter)
|
||||||
local pool = setmetatable(List(), Pool)
|
local pool = setmetatable(List(), Pool)
|
||||||
|
|
||||||
|
@ -14,6 +18,9 @@ function Pool.new(name, filter)
|
||||||
return pool
|
return pool
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Checks if an Entity is eligible for the Pool.
|
||||||
|
-- @param e The Entity to check
|
||||||
|
-- @return True if the entity is eligible, false otherwise
|
||||||
function Pool:eligible(e)
|
function Pool:eligible(e)
|
||||||
for _, component in ipairs(self.filter) do
|
for _, component in ipairs(self.filter) do
|
||||||
if not e.components[component] or e.removed[component] then
|
if not e.components[component] or e.removed[component] then
|
||||||
|
|
|
@ -28,6 +28,9 @@ System.mt = {
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- Creates a new System prototype.
|
||||||
|
-- @param ... Variable amounts of filters
|
||||||
|
-- @return A new System prototype
|
||||||
function System.new(...)
|
function System.new(...)
|
||||||
local systemProto = setmetatable({
|
local systemProto = setmetatable({
|
||||||
__filter = {...},
|
__filter = {...},
|
||||||
|
@ -37,20 +40,19 @@ function System.new(...)
|
||||||
return systemProto
|
return systemProto
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Default initialization function.
|
||||||
|
-- @param ... Varags
|
||||||
function System:init(...)
|
function System:init(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
function System:destroy()
|
--- Builds a Pool for the System.
|
||||||
if self.instance then
|
-- @param baseFilter The 'raw' Filter
|
||||||
self.instance:removeSystem(self)
|
-- @return A new Pool
|
||||||
end
|
function System:__buildPool(baseFilter)
|
||||||
end
|
|
||||||
|
|
||||||
function System:__buildPool(pool)
|
|
||||||
local name = "pool"
|
local name = "pool"
|
||||||
local filter = {}
|
local filter = {}
|
||||||
|
|
||||||
for i, v in ipairs(pool) do
|
for i, v in ipairs(baseFilter) do
|
||||||
if type(v) == "table" then
|
if type(v) == "table" then
|
||||||
filter[#filter + 1] = v
|
filter[#filter + 1] = v
|
||||||
elseif type(v) == "string" then
|
elseif type(v) == "string" then
|
||||||
|
@ -61,6 +63,9 @@ function System:__buildPool(pool)
|
||||||
return Pool(name, filter)
|
return Pool(name, filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Checks and applies an Entity to the System's pools.
|
||||||
|
-- @param e The Entity to check
|
||||||
|
-- @return True if the Entity was added, false if it was removed. Nil if nothing happend
|
||||||
function System:__check(e)
|
function System:__check(e)
|
||||||
local systemHas = self:__has(e)
|
local systemHas = self:__has(e)
|
||||||
|
|
||||||
|
@ -84,6 +89,8 @@ function System:__check(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Tries to add an Entity to the System.
|
||||||
|
-- @param e The Entity to add
|
||||||
function System:__tryAdd(e)
|
function System:__tryAdd(e)
|
||||||
if not self:__has(e) then
|
if not self:__has(e) then
|
||||||
self.__all[e] = 0
|
self.__all[e] = 0
|
||||||
|
@ -93,6 +100,8 @@ function System:__tryAdd(e)
|
||||||
self.__all[e] = self.__all[e] + 1
|
self.__all[e] = self.__all[e] + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Tries to remove an Entity from the System.
|
||||||
|
-- @param e The Entity to remove
|
||||||
function System:__tryRemove(e)
|
function System:__tryRemove(e)
|
||||||
if self:__has(e) then
|
if self:__has(e) then
|
||||||
self.__all[e] = self.__all[e] - 1
|
self.__all[e] = self.__all[e] - 1
|
||||||
|
@ -104,33 +113,32 @@ function System:__tryRemove(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function System:__remove(e)
|
--- Returns if the System has the Entity.
|
||||||
if self:__has(e) then
|
-- @param The Entity to check for
|
||||||
for _, pool in ipairs(self.__pools) do
|
-- @return True if the System has the Entity. False otherwise
|
||||||
if pool:has(e) then
|
|
||||||
pool:remove(e)
|
|
||||||
self:entityRemovedFrom(e, pool)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
self.__all[e] = nil
|
|
||||||
self:entityRemoved(e)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function System:__has(e)
|
function System:__has(e)
|
||||||
return self.__all[e] and true
|
return self.__all[e] and true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Default callback for adding an Entity.
|
||||||
|
-- @param e The Entity that was added
|
||||||
function System:entityAdded(e)
|
function System:entityAdded(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Default callback for adding an Entity to a pool.
|
||||||
|
-- @param e The Entity that was added
|
||||||
|
-- @param pool The pool the Entity was added to
|
||||||
function System:entityAddedTo(e, pool)
|
function System:entityAddedTo(e, pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Default callback for removing an Entity.
|
||||||
|
-- @param e The Entity that was removed
|
||||||
function System:entityRemoved(e)
|
function System:entityRemoved(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Default callback for removing an Entity from a pool.
|
||||||
|
-- @param e The Entity that was removed
|
||||||
|
-- @param pool The pool the Entity was removed from
|
||||||
function System:entityRemovedFrom(e, pool)
|
function System:entityRemovedFrom(e, pool)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
6
main.lua
6
main.lua
|
@ -89,9 +89,9 @@ function RandomRemover:update(dt)
|
||||||
love.window.setTitle(love.timer.getFPS())
|
love.window.setTitle(love.timer.getFPS())
|
||||||
end
|
end
|
||||||
|
|
||||||
Game:addSystem(RandomRemover(), "update", nil, true)
|
Game:addSystem(RandomRemover(), "update")
|
||||||
Game:addSystem(RectangleRenderer(), "draw", nil, true)
|
Game:addSystem(RectangleRenderer(), "draw")
|
||||||
Game:addSystem(CircleRenderer(), "draw", nil, true)
|
Game:addSystem(CircleRenderer(), "draw")
|
||||||
|
|
||||||
for i = 1, 100 do
|
for i = 1, 100 do
|
||||||
local e = Entity()
|
local e = Entity()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue