Skip to content

Commit

Permalink
monster ai
Browse files Browse the repository at this point in the history
  • Loading branch information
liuhaopen committed Apr 26, 2019
1 parent 0f6c08f commit e778f9c
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 15 deletions.
19 changes: 10 additions & 9 deletions ComponentDataArray.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function ComponentDataArray.Create( iterator, length, componentName )
assert(componentName~=nil, "componentName should not be nil!")
local array = {
m_Iterator=iterator,
m_Length=length,
Length=length,
m_ComponentTypeName=componentName,
m_Data = {},
m_Cache = {
Expand All @@ -19,7 +19,7 @@ function ComponentDataArray.Create( iterator, length, componentName )
end

local get_fun = function ( t, index )
if index < 1 or index > t.m_Length then
if index < 1 or index > t.Length then
return nil
end
if index < t.m_Cache.CachedBeginIndex or index >= t.m_Cache.CachedEndIndex then
Expand All @@ -38,15 +38,16 @@ local set_fun = function ( t, index, value )
ECS.ChunkDataUtility.WriteComponentFromArray(t.m_Cache.CachedPtr, index, t.m_ComponentTypeName, value)
end

local get_len = function ( t )
return t.m_Length
end
-- local get_len = function ( t )
-- return t.Length
-- end

local meta_tbl = {
__index = get_fun,
__newindex = set_fun,
-- __len = get_len
}
function ComponentDataArray.InitMetaTable( array )
local meta_tbl = {}
meta_tbl.__index = get_fun
meta_tbl.__newindex = set_fun
meta_tbl.__len = get_len
setmetatable(array, meta_tbl)
end

Expand Down
6 changes: 3 additions & 3 deletions ComponentGroup.lua
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ end

function ComponentGroup:GetEntityArray( )
local iterator, length = self:GetComponentChunkIterator()
local res
self:GetEntityArray(iterator, length, res)
return res
iterator:SetIndexInComponentGroup(1)
local data = ECS.EntityArray.Create(iterator, length)
return data
end

function ComponentGroup:GetComponentChunkIterator( )
Expand Down
1 change: 1 addition & 0 deletions ECS.lua
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ require "InjectFromEntityData"
require "InjectComponentGroupData"
require "ComponentChunkIterator"
require "ComponentDataArray"
require "EntityArray"

local function InitWorld( worldName )
local world = ECS.World.New(worldName)
Expand Down
44 changes: 44 additions & 0 deletions EntityArray.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
local EntityArray = {}
ECS.EntityArray = EntityArray
function EntityArray.Create( iterator, length )
assert(iterator~=nil, "iterator should not be nil!")
assert(length~=nil, "length should not be nil!")
local array = {
m_Iterator=iterator,
Length=length,
m_Data = {},
m_Cache = {
CachedPtr=nil, CachedBeginIndex=0, CachedEndIndex=0, CachedSizeOf=0, IsWriting=false
},
}
EntityArray.InitMetaTable(array)
return array
end

local get_fun = function ( t, index )
if index < 1 or index > t.Length then
return nil
end
if index < t.m_Cache.CachedBeginIndex or index >= t.m_Cache.CachedEndIndex then
t.m_Iterator:MoveToEntityIndexAndUpdateCache(index, t.m_Cache, false)
end
return ECS.ChunkDataUtility.ReadComponentFromArray(t.m_Cache.CachedPtr, index, ECS.Entity.Name, t.m_Data)
end

local set_fun = function ( t, index, value )
print("EntityArray setter is useless : ", debug.traceback())
end

-- local get_len = function ( t )
-- return t.Length
-- end
local meta_tbl = {
__index = get_fun,
__newindex = set_fun,
-- __len = get_len
}
function EntityArray.InitMetaTable( array )
setmetatable(array, meta_tbl)
end

return EntityArray
3 changes: 1 addition & 2 deletions EntityDataManager.lua
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,7 @@ function EntityDataManager:AllocateEntities( arch, chunk, baseIndex, count, outp
outputEntities[i].Index = self.m_EntitiesFreeIndex
outputEntities[i].Version = entityVersion

ECS.ChunkDataUtility.WriteComponentInChunk(chunk.Buffer + (baseIndex + i - 1)*self.entity_size_in_chunk, ECS.Entity.Name, {Index=self.m_EntitiesFreeIndex, Version=entityVersion})

ECS.ChunkDataUtility.WriteComponentInChunk(chunk.Buffer + (baseIndex + i - 2)*self.entity_size_in_chunk, ECS.Entity.Name, {Index=self.m_EntitiesFreeIndex, Version=entityVersion})
self.m_Entities.ChunkData[self.m_EntitiesFreeIndex].IndexInChunk = baseIndex + i - 1
self.m_Entities.Archetype[self.m_EntitiesFreeIndex] = arch
self.m_Entities.ChunkData[self.m_EntitiesFreeIndex].Chunk = chunk
Expand Down
92 changes: 92 additions & 0 deletions Tests/TestComponentSystem.lua
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,96 @@ function TestComponentSystem:TestInject( )
local flag = sys.m_Data.flag[1]
lu.assertNotNil(flag)
lu.assertEquals(flag.value, 456)
end

local TestComponentDataArraySystem = BaseClass(ECS.ComponentSystem)
ECS.TypeManager.RegisterScriptMgr("TestComponentDataArraySystem", TestComponentDataArraySystem)

function TestComponentDataArraySystem:OnCreateManager( )
ECS.ComponentSystem.OnCreateManager(self)
self.group = self:GetComponentGroup({"DataForTestComponentDataArray3", "DataForTestComponentDataArray2"})
end
function TestComponentDataArraySystem:OnUpdate( )
end
function TestComponentSystem:TestComponentDataArray( )
ECS.TypeManager.RegisterType("DataForTestComponentDataArray1", {x="number", y="boolean", z="integer"})
ECS.TypeManager.RegisterType("DataForTestComponentDataArray2", {x="boolean", b="boolean"})
ECS.TypeManager.RegisterType("DataForTestComponentDataArray3", {value="integer"})

local sys = ECS.World.Active:GetOrCreateManager("TestComponentDataArraySystem")
sys:Update()
lu.assertNotNil(sys.group)
local entities = sys.group:GetComponentDataArray("DataForTestComponentDataArray3")
lu.assertNotNil(entities)
lu.assertEquals(#entities, 0)

local archetype = self.m_Manager:CreateArchetype({"DataForTestComponentDataArray1", "DataForTestComponentDataArray2", "DataForTestComponentDataArray3"})
local entity = self.m_Manager:CreateEntityByArcheType(archetype)
self.m_Manager:SetComponentData(entity, "DataForTestComponentDataArray3", {value=123546})
self.m_Manager:SetComponentData(entity, "DataForTestComponentDataArray2", {x=false, b=true})
sys:Update()
local entities = sys.group:GetComponentDataArray("DataForTestComponentDataArray3")
lu.assertNotNil(entities)
lu.assertEquals(entities.Length, 1)
local compData = self.m_Manager:GetComponentData(entity, "DataForTestComponentDataArray3")
lu.assertEquals(entities[1], compData)
lu.assertEquals(entities[1].value, compData.value)

local entities = sys.group:GetComponentDataArray("DataForTestComponentDataArray2")
lu.assertNotNil(entities)
lu.assertEquals(entities.Length, 1)
local compData = self.m_Manager:GetComponentData(entity, "DataForTestComponentDataArray2")
lu.assertEquals(entities[1], compData)
lu.assertEquals(entities[1].x, compData.x)
lu.assertEquals(entities[1].b, compData.b)

local entity = self.m_Manager:CreateEntityByArcheType(archetype)
self.m_Manager:SetComponentData(entity, "DataForTestComponentDataArray2", {x=true, b=false})
self.m_Manager:SetComponentData(entity, "DataForTestComponentDataArray3", {value=53212})
sys:Update()
local entities = sys.group:GetComponentDataArray("DataForTestComponentDataArray3")
lu.assertNotNil(entities)
lu.assertEquals(entities.Length, 2)
local compData = self.m_Manager:GetComponentData(entity, "DataForTestComponentDataArray3")
lu.assertEquals(entities[2], compData)
lu.assertEquals(entities[2].value, compData.value)

local entities = sys.group:GetComponentDataArray("DataForTestComponentDataArray2")
lu.assertNotNil(entities)
lu.assertEquals(entities.Length, 2)
local compData = self.m_Manager:GetComponentData(entity, "DataForTestComponentDataArray2")
lu.assertEquals(entities[2], compData)
lu.assertEquals(entities[2].x, compData.x)
lu.assertEquals(entities[2].b, compData.b)
end


local TestEntityArraySystem = BaseClass(ECS.ComponentSystem)
ECS.TypeManager.RegisterScriptMgr("TestEntityArraySystem", TestEntityArraySystem)

function TestEntityArraySystem:OnCreateManager( )
ECS.ComponentSystem.OnCreateManager(self)
self.group = self:GetComponentGroup({"DataForTestEntityArray3", "DataForTestEntityArray2"})
end
function TestEntityArraySystem:OnUpdate( )
end
function TestComponentSystem:TestEntityArray( )
ECS.TypeManager.RegisterType("DataForTestEntityArray1", {x="number", y="boolean", z="integer"})
ECS.TypeManager.RegisterType("DataForTestEntityArray2", {x="boolean", b="boolean"})
ECS.TypeManager.RegisterType("DataForTestEntityArray3", {value="integer"})

local sys = ECS.World.Active:GetOrCreateManager("TestEntityArraySystem")
sys:Update()
lu.assertNotNil(sys.group)
local entities = sys.group:GetEntityArray()
lu.assertNotNil(entities)
lu.assertEquals(#entities, 0)

local archetype = self.m_Manager:CreateArchetype({"DataForTestEntityArray1", "DataForTestEntityArray2", "DataForTestEntityArray3"})
local entity = self.m_Manager:CreateEntityByArcheType(archetype)
sys:Update()
local entities = sys.group:GetEntityArray()
lu.assertNotNil(entities)
lu.assertEquals(entities.Length, 1)
lu.assertEquals(entities[1], entity)
end
2 changes: 1 addition & 1 deletion Tests/test_all.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ function PrintTable( tbl, level, return_counter )
end
return_counter = return_counter or 5 --剩下多少层就返回,防止无限打印
if return_counter <= 0 then
print('Cat:util.lua PrintTable return_counter empty')
-- print('Cat:util.lua PrintTable return_counter empty')
return
end
return_counter = return_counter - 1
Expand Down

0 comments on commit e778f9c

Please sign in to comment.