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

时间:2023-02-06 19:26:24
-- 星月相随倾心贡献~~~

-- 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学习和工作心得,未经作者允许,请勿转载!在此谢谢各位手下留情~~~

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

原文地址:http://www.cnblogs.com/wodehao0808/p/3984838.html