zoukankan      html  css  js  c++  java
  • (原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(4): handler

    这里的函数主要用来做:回调函数。参考资料为quick_cocos.

    星月倾心贡献~~~

    --[[
    -- 将lua对象及方法包装为一个匿名函数
    -- 许多功能需要传入一个 Lua 函数做参数,然后在特定事件发生时就会调用传入的函数。例如触摸事件、帧事件等等。
    -- example:
        local MyScene = class( "MyScene", function() )
            return cc.Layer:create()
        end )
        function MyScene:ctor()
            self.frameTimeCount = 0
            -- 注册帧事件
            self:addEventListener( cc.ENTER_FRAME_EVENT, self.onEnterFrame )
        end
        
        function MyScene:onEnterFrame( dt )
            self.frameTimeCout = self.frameTimeCount + dt
        end
        
             上述代码执行时将出错,报告"Invalid self" ,这就是因为 C++ 无法识别 Lua 对象方法。
             因此在调用我们传入的 self.onEnterFrame 方法时没有提供正确的参数。
    
             要让上述的代码正常工作,就需要使用 handler() 进行一下包装:
        
        function MyScene:ctor()
            self.frameTimeCount = 0
            -- 注册帧事件
            self:addEventListener( cc.ENTER_FRAME_EVENT
            , handler( self, self.onEnterFrame ) )
        end
        
             实际上,除了 C++ 回调 Lua 函数之外,在其他所有需要回调的地方都可以使用 handler()。
    
    -- @param obj lua对象
    -- @param function method 对象方法
    
    -- @return function
    --]]
    
    function handler( obj, method )
        return function(...)
            return method( obj, ... )
        end
    end

    简单聊两句~(小白:聊毛线,你以为谁都跟你一样有空聊...)

    function handler( obj, method )
        return function(...)
            return method( obj, ... )
        end
    end
    
    local Music = {}
    function Music:test( str )
        print( "Music: " .. str )
    end
    
    local t = handler( Music, Music.test )
    t( "小白:星月是帅哥;星月:小白就是坦诚~~~" )
    
    输出:
    
    Music: 小白:星月是帅哥;星月:小白就是坦诚~~~

    handler返回一个函数,将这个函数赋值给t,调用函数t,会调用Music方法test( str ),所以会有上面输出。

    t函数调用的原理是什么呢?(小白:没人逼你说~~~)

    t( "小白:星月是帅哥;星月:小白就是坦诚~~~" )
    
    展开后就是:
    
    method( obj, "小白:星月是帅哥;星月:小白就是坦诚~~~" )
    
    method就是:Music.test。obj就是:Music。
    
    所以,替换后就是:
    
    Music.test( Music, "小白:星月是帅哥;星月:小白就是坦诚~~~" )
    
    Music找到函数test,因为用的是 “.” 点号调用函数,所以第一个参数就是self,第二个参数才是test方法里面的str。

    大家都明白了吧(小白:没有~~~)
    本章内容到这里就结束,希望对大家有用~

    (小白:等等,我还没弄明白。。。)

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

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

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

  • 相关阅读:
    Spring Security OAuth2 源码分析
    Spring Security OAuth2 token权限隔离
    Spring Cloud Feign 使用OAuth2
    Spring Security OAuth2 授权码模式
    全链路追踪spring-cloud-sleuth-zipkin
    Spring Security OAuth2 授权失败(401) 问题整理
    使用ShardingJdbc分表
    Kubectl常用命令
    Spring Cloud Zuul实现IP访问控制
    一次非核心接口(信息提示类)被刷引发的思考
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4017210.html
Copyright © 2011-2022 走看看