cocos2dx脱坑之旅 3 热更新

本文介绍了如何利用lua的package.loaded特性实现代码热更新,通过`package.loaded[xxx] = nil`让虚拟机重新加载代码,显著提升开发效率。主要展示了如何在`jzq2.lua`中进行UI刷新和事件处理,以及如何在`MainLayer`中调用这些刷新函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要测试代码,写完就能看到效果,不用重启 exe,加快开发速度。运用这个原理写其他代码也一样。

核心原理 package.loaded["xxx"] = nil,让lua虚拟机重新读取 xxx代码。


local MainLayer = class("MainLayer")

function MainLayer.showUI()
    local layer = cc.LayerColor:create(cc.c4b(0,0,0,255))
    -- local snake = require("app.game.snake.snake")
    -- snake.showUI(layer)
    -- print(nil == false)
    -- local someTest = require("app.game.snake.someTest")
    -- someTest.showUI(layer)
    require("app.jzq")
    jzq.init(layer)
    return layer
end

return MainLayer
--临时测试代码用,退出重新读取页面lua文件,不用重启exe

cc.exports.jzq = {}
--没有限制全局变量直接 jzq={}

function jzq.reFreashJzq2()
    log("are jzq2 ok")
    if package.loaded["app.jzq2"] then
        jzq2.clear()
        package.loaded["app.jzq2"] = nil
        jzq2 = nil
    end
    --最核心部分 让lua重新读取 jzq2.lua文件
    require("app.jzq2")
    
end

function jzq.init(mainLayer)
    local layer = cc.Layer:create()
 
    local function onKeyPressed(keyCode,event)
        if keyCode == 133 then --j
            jzq.reFreashJzq2()
        end
    end
    local function onKeyReleased(keyCode,event)
        log("释放"..keyCode)
    end
    local listener = cc.EventListenerKeyboard:create()
    listener:registerScriptHandler(onKeyPressed, cc.Handler.EVENT_KEYBOARD_PRESSED)
    --listener:registerScriptHandler(onKeyReleased, cc.Handler.EVENT_KEYBOARD_RELEASED)
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, layer)

    layer:addTo(mainLayer, 10000)

    jzq.layer = layer
end  
--把一些常用代码复制到这里,用的时候直接从这里复制。
--要不是这里放的代码太多,我直接用这个文件重载代码就行了。


return jzq 

 

cc.exports.jzq2 = {}

function jzq2.Test()
    --测试代码写在这里,写完直接刷新运行看效果
    log("jzq2 very ok")
end

function jzq2.clear()
    jzq2.layer:removeFromParent()
end

jzq2.count = 0
function jzq2.init()
    jzq2.count = jzq2.count + 1
    if jzq2.count == 2 then
        error("俺也不知道发生了啥事")
    end
    local layer = cc.LayerColor:create(cc.c4b(255,255,255,125),200,100)
    layer:addTo(jzq.layer):move(20,100)
    jzq2.layer = layer

    local  listenner = cc.EventListenerTouchOneByOne:create()
    listenner:setSwallowTouches(true)
    listenner:registerScriptHandler(function(touch, event)
        if cc.rectContainsPoint(layer:getBoundingBox(), touch:getLocation() ) then
            return true
        end
        return false
    end, cc.Handler.EVENT_TOUCH_BEGAN )

    listenner:registerScriptHandler(function(touch, event)
       layer:setPosition(cc.pAdd(touch:getDelta(),cc.p(layer:getPosition())))
    end, cc.Handler.EVENT_TOUCH_MOVED )
    
    --[[ 实现 onTouchEnded 事件回调函数
    listenner:registerScriptHandler(function(touch, event)
        --print("EVENT_TOUCH_ENDED")
    end, cc.Handler.EVENT_TOUCH_ENDED )
    listenner:registerScriptHandler(function(touch, event)
       --print("EVENT_TOUCH_CANCELLED")
   end, cc.Handler.EVENT_TOUCH_CANCELLED )]]

    local eventDispatcher = layer:getEventDispatcher()
    -- 添加监听器
    eventDispatcher:addEventListenerWithSceneGraphPriority(listenner, layer) --33333

    --现在jzq2可以随便拖到,防止当着ui了

    local label = cc.Label:createWithSystemFont("jzq2重载成功", "", 30)
    label:setColor(cc.c3b(255,0,0))
    label:addTo(layer):move(100,-20)
    label:runAction(cc.FadeOut:create(3))
    --加个提示
    local txt = ccui.Text:create("重载", "", 30)
    txt:setTouchEnabled(true)
    txt:addClickEventListener(function(sender)
        jzq.reFreashJzq2()
        --现在直接点也可以刷新了,不用按j键了
        log(sender:getName())
    end)
    txt:setColor(cc.c3b(255,0,0))
    txt:addTo(layer):move(100,20):setName("txt")

    jzq2.Test()
end

jzq2.init()

return jzq2

 

找不到工作啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值