zoukankan      html  css  js  c++  java
  • (原创)cocos2d-x 3.0+ lua 学习和工作(1) : 自定义创建对象方法

    -- 星月相随倾心贡献~~~
    
    -- 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

  • 相关阅读:
    python实现模拟登录
    python进阶八_警告和异常
    我的软考之路(六)——数据结构与算法(4)之八大排序
    Modern source-to-source transformation with Clang and libTooling
    heibernate增删改查总结一下自己的不足
    hibernate之增删改查demo
    前台之boostrap
    <input value="hidden">的作用
    Active Desktop--桌面字体背景被修改
    中文乱码问题解决方法总结
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/3984838.html
Copyright © 2011-2022 走看看