您的位置:首页 > 移动开发 > Cocos引擎

(原创)cocos2d-x 3.0+ lua 学习和工作(1) : 自定义创建对象方法

2014-09-21 18:30 357 查看
-- 星月相随倾心贡献~~~

-- cocos2d-x 3.0 + lua中,创建对象,用系统自带的,如下:
-- example:
print( "require test" )
local Test = class( "Test" )
Test.__index = Test

function Test:ctor(...)
print( "Test:ctor" )
end

return Test

-- 创建对象
local Test = require "Test"  -- 这里会打印:require test  -- 文件在require时,已经对外层变量进行了:初始化

local obj = Test:new()  -- 这里会打印:Test:ctor  -- class自带的方法new()会自动调用方法ctor(...),该方法也称为:构造函数

-- 如果要传递参数进入,可以在new(...)中传入,在构造函数中读取除了,各位自己可以去尝试,这里就不再叙述。

-- 作者这里觉得创建方法非常不好,比如我要通过标签的方式去方便其他人使用,例如:

-- 这里只是示意代码,不注重代码质量
-- file:a
g.Test = require "Test"

-- file:b
local obj = g.Test:new()

-- file:c
local obj = g.Test:new()

-- 引入文件
require "a.lua"
require "b.lua"
require "c.lua"

-- 看出其他人调用是非常方便的

-- 但是如果改成:

-- 引入文件
require "b.lua"   -- error: 找不到g.Test
require "c.lua"   -- error: 找不到g.Test
require "a.lua"
-- 需要用户自己注意引入的顺序   ---  bug——1

-- 这个问题,就是文件require时,就已经初始化了变量。

-- 再看一个例子,例如:

-- file:test中增加一个全局参数
g.t = 3
-- file:test2
local Test2 = class( "Test2" )
local m = g.t * 10 -- 使用test文件中的
...
return Test2

-- file:a
g.Test2 = require "Test2"  -- error: g.t是一个nil值
g.Test = require "Test"

-- 可以看到,这个需要很仔细的了解每一个文件,顺序的初始化,文件少的话,还能理清顺序,但是文件多起来,就很难维护  ----- bug——2

-- 另外:一个项目不是一个人完成的,其他人不可能知道你需要的初始化顺序,这样就导致问题了   ---- bug——3

-- 还有一个问题就是:require一个文件,并创建了一个全局对象,但是对象的数据还没有创建。这时候其他文件中,在外层数据中使用全局对象数据,则会获得一个nil值。  ---- bug——4
-- example
-- file: a
a = class( "a" )  -- 全局
a.__index = a
function a:set( t )
a.t = t
end
function a:get()
return a.t
end
return a

-- file: b
local a = require "a"
local m = a.get() * 10
return m

-- require
g.a = require "a"
g.b = require "b"  -- error: g.get() return a nil value

-- 其他操作
a:set( 5 )
require "b"  -- m = 50
-- 这时希望在a设置了值之后再创建b,而不是在一个文件中创建所有。但同时有需要方便其他人使用,这个怎么办呢???

-- 方法如下:
-- file: type
g.a = "a"
g.b = "b"

-- 定义创建对象函数:
function createInst( a, ... )
local CLS = class( require "".. a )  -- 这个忘记了是:require "" .. a 还是 require tostring(a),读者自己试用一下咯~~~~汗~~!!!
local cls = CLS:new()
if cls and cls.init then
cls:init( ... )  -- 调用对象初始化方法: 传递参数
end
return cls  -- 返回对象
end

-- 创建对象
require "type"

local obj = createInst( g.a )
obj:set( 5 )

local b = createInst( g.b )

-- 为什么不直接在 new 中传递参数???
-- 作者自己有自己的看法:也就是说作者会在ctor(...)中做一些基本的事情,把两个区分开来,只是为了更方便的管理~~!!!!

-- 终于把这章写完,希望对各位有帮助~

-- lua我也是初学者,所以有些地方可能写的不好,或者有更好的方法去实现,希望各位能多多指教,多多指导,星月会努力改进!!!

-- 感谢各位花时间阅读本人的作品,谢谢~~~祝各位都能大展宏图,万事顺利~~~下一章节见~~~~


作者使用 cocos2d-x 3.0 + lua学习和工作心得,未经作者允许,请勿转载!在此谢谢各位手下留情~~~

本文没有获得作者本人同意,不得转载,否则必追究相关责任。转载请注明出处!!~~

原文地址:/article/6607887.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐