[cocos2dx_Lua]quick中的节点事件

[cocos2dx_Lua]quick中的节点事件,第1张

概述节点事件在一个 Node 对象进入、退出场景时触发。 local node = display.newNode()node:addNodeEventListener(cc.NODE_EVENT, function(event) print(event.name)end)scene:addChild(node) event属性 event.name: 指示节点事件类型,具有下列值: e 节点事件在一个 Node 对象进入、退出场景时触发。
local node = display.newNode()node:addNodeEventListener(cc.NODE_EVENT,function(event)    print(event.name)end)scene:addChild(node)
event属性
event.name: 指示节点事件类型,具有下列值:
enter: Node 加入了正在运行的场景 exit: Node 退出了正在运行的场景 enterTransitionFinish: 进入一个新场景时的特效结束 exitTransitionStart: 退出一个现有场景时的特效开始 cleanup: Node 被完全清理并从内存删除时 下面的示例代码演示了 5 种事件类型的出现时机:
require("framework.init")-- 首先创建一个空白场景local sceneInit = display.newScene("sceneInit")-- 进入该场景display.replaceScene(sceneInit)local function createTestScene(name)    local scene = display.newScene(name)    local node = display.newNode()    node:addNodeEventListener(cc.NODE_EVENT,function(event)        printf("node in scene [%s] NODE_EVENT: %s",name,event.name)    end)    scene:addChild(node)    return sceneend-- 等待 1.0 秒创建第一个测试场景sceneInit:performWithDelay(function()    local scene1 = createTestScene("scene1")    display.replaceScene(scene1)    -- 等待 1.0 秒创建第二个测试场景    scene1:performWithDelay(function()        print("--------")        local scene2 = createTestScene("scene2")        display.replaceScene(scene2)    end,1.0)end,1.0)
输出结果:
node in scene [scene1] NODE_EVENT: enternode in scene [scene1] NODE_EVENT: enterTransitionFinish--------node in scene [scene1] NODE_EVENT: exitTransitionStartnode in scene [scene1] NODE_EVENT: exitnode in scene [scene1] NODE_EVENT: cleanupnode in scene [scene2] NODE_EVENT: enternode in scene [scene2] NODE_EVENT: enterTransitionFinish
在切换场景时如果没有使用特效,那么事件出现的顺序如上。
但如果将测试代码 display.replaceScene(scene2) 修改为 display.replaceScene(scene2,"random",1.0),事件出现顺序会变成:

node in scene [scene1] NODE_EVENT: enternode in scene [scene1] NODE_EVENT: enterTransitionFinish--------node in scene [scene1] NODE_EVENT: exitTransitionStartnode in scene [scene2] NODE_EVENT: enternode in scene [scene1] NODE_EVENT: exitnode in scene [scene2] NODE_EVENT: enterTransitionFinishnode in scene [scene1] NODE_EVENT: cleanup
造成这种区别的原因就是场景切换特效播放期间,会同时渲染两个场景,所以从事件上看,可以看到第二个场景的 enter 事件出现后,第一个场景的 exit 事件才出现。因此,我们在使用节点事件时,不应该假定事件出现的顺序,而是根据特定事件采取特定的处理措施。
通常建议如下:
enter: 这里可以做一些场景初始化工作
exit: 如果场景切换使用了特效,可以在这里停止场景中的一些动画,避免切换场景的特效导致帧率下降
cleanup: 适合做清理工作

为了简化使用,quick 为 cc.Node 封装了几个现成的方法,开发者如果从 Node(或继承类)创建自己的 Lua 类,那么可以直接覆盖这几个方法:
require("framework.init")-- 定义一个自己的 cc.Node 继承类local MyNode = class("MyNode",function(scenename)    local node = display.newNode()    node.scenename = scenename    return nodeend)function MyNode:onEnter()    printf("node in scene [%s] method %s",self.scenename,"onEnter")endfunction MyNode:onExit()    printf("node in scene [%s] method %s","onExit")endfunction MyNode:onEnterTransitionFinish()    printf("node in scene [%s] method %s","onEnterTransitionFinish")endfunction MyNode:onExitTransitionStart()    printf("node in scene [%s] method %s","onExitTransitionStart")endfunction MyNode:onCleanup()    printf("node in scene [%s] method %s","onCleanup")end-- 首先创建一个空白场景local sceneInit = display.newScene("sceneInit")-- 进入该场景display.replaceScene(sceneInit)local function createTestScene(name)    local scene = display.newScene(name)    local node = MyNode.new(name)    node:setNodeEventEnabled(true) -- 启用节点事件,会调用节点预定义的方法    scene:addChild(node)    return sceneend-- 等待 1.0 秒创建第一个测试场景sceneInit:performWithDelay(function()    local scene1 = createTestScene("scene1")    display.replaceScene(scene1)    -- 等待 1.0 秒创建第二个测试场景    scene1:performWithDelay(function()        print("--------")        local scene2 = createTestScene("scene2")        display.replaceScene(scene2,1.0)    end,1.0)
执行结果如下:
node in scene [scene1] method onEnternode in scene [scene1] method onEnterTransitionFinish--------node in scene [scene1] method onExitTransitionStartnode in scene [scene2] method onEnternode in scene [scene1] method onExitnode in scene [scene2] method onEnterTransitionFinishnode in scene [scene1] method onCleanup
效果和直接注册事件一样。两种方式让开发者可以根据实际需求灵活选择。 总结

以上是内存溢出为你收集整理的[cocos2dx_Lua]quick中的节点事件全部内容,希望文章能够帮你解决[cocos2dx_Lua]quick中的节点事件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1084825.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存