0.前言
本文为学习笔记,并非教程!!!
--使self对象获得组件的方法,执行完此句后,self对象便可执行EventProtocol中的方法了
cc(self):addComponent("components.behavior.EventProtocol"):exportMethods()
1.给游戏对象添加组件相关方法
cc的元表为ccmt,ccmt实现了元方法__call,所以cc(self)即为GameObject.extend(self)
--src\framework\cc\init.lua
local GameObject = cc.GameObject
local ccmt = {}
ccmt.__call = function(self, target)
if target then
return GameObject.extend(target)
end
printError("cc() - invalid target")
end
setmetatable(cc, ccmt)
GameObject.extend(self)的实现如下,也就是给self对象添加操作组件的相关方法
--src\framework\cc\GameObject.lua
local Registry = import(".Registry")
local GameObject = {}
function GameObject.extend(target)
target.components_ = {}
function target:checkComponent(name)
return self.components_[name] ~= nil
end
function target:addComponent(name)
local component = Registry.newObject(name)
self.components_[name] = component
component:bind_(self)
return component
end
function target:removeComponent(name)
local component = self.components_[name]
if component then component:unbind_() end
self.components_[name] = nil
end
function target:getComponent(name)
return self.components_[name]
end
return target
end
return GameObject
2.添加组件
function target:addComponent(name)
--根据组件名返回组件对象
local component = Registry.newObject(name)
self.components_[name] = component
component:bind_(self)
return component
end
根据组件名返回组件对象
--src\framework\cc\Registry.lua
function Registry.newObject(name, ...)
local cls = Registry.classes_[name]
if not cls then
-- auto load
pcall(function()
cls = require(name)
Registry.add(cls, name)
end)
end
assert(cls ~= nil, string.format("Registry.newObject() - invalid class \"%s\"", tostring(name)))
return cls.new(...)
end
组件指定绑定的对象,并让对象添加该组件依赖的组件
function Component:bind_(target)
self.target_ = target
for _, name in ipairs(self.depends_) do
if not target:checkComponent(name) then
target:addComponent(name)
end
end
self:onBind_(target)
end
3.将组件方法暴露给对象
完成以下方法后,游戏对象便可操作组件的方法
function Component:exportMethods_(methods)
self.exportedMethods_ = methods
local target = self.target_
local com = self
for _, key in ipairs(methods) do
if not target[key] then
local m = com[key]
target[key] = function(__, ...)
return m(com, ...)
end
end
end
return self
end
网友评论