cocos2dx C++工程中使用lua脚本(三):C++调用lua脚本(二)

本节介绍给节点加组件(其实就是一个lua脚本)的方式。

C++代码如下:

#include "CCComponentLua.h"
bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2;
    float y = origin.y + closeItem->getContentSize().height/2;
    closeItem->setPosition(Vec2(x,y));

    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    //给当前scene添加一个lua脚本组件
    this->addComponent(ComponentLua::create("test.lua"));

    return true;
}

Lua代码:

-- scene.lua
require "cocos.init"

local scene = {
    onEnter = function(self)
        local visibleSize = cc.Director:getInstance():getVisibleSize()
        --创建精灵
        local sprite = cc.Sprite:create("HelloWorld.png")
        sprite:setPosition(visibleSize.width/2, visibleSize.height/2)
        self:getOwner():addChild(sprite)

        --触摸处理
        local function touchBeganCallBack(touch, event)
        	print("touchBegan")
        	local location = touch:getLocation()
        	sprite:setPosition(location)
        	return true
        end

        local function touchMovedCallBack(touch, event)
        	print("touchMoved")
        	local location = touch:getLocation()
        	sprite:setPosition(location)
        end

        local function touchEndedCallBack(touch, event)
        	print("touchEnded")
        	local location = touch:getLocation()
        	sprite:setPosition(location)
        end
        
        --设置触摸监听
        local listener = cc.EventListenerTouchOneByOne:create()
        listener:registerScriptHandler(touchBeganCallBack, cc.Handler.EVENT_TOUCH_BEGAN)
        listener:registerScriptHandler(touchMovedCallBack, cc.Handler.EVENT_TOUCH_MOVED)
        listener:registerScriptHandler(touchEndedCallBack, cc.Handler.EVENT_TOUCH_ENDED)
        cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, self:getOwner())
    end,

    onExit = function(self)
        
    end,

    update = function(self)
       
    end
}

return scene

在lua脚本中有三个函数onEnter、onExit、update,熟悉C++版本的人就应该知道Node类中也有这三个函数, 当这个脚本挂在某个Node上面之后,引擎底层C++部分在触发这三个函数的时候,就会相应触发本节点上所挂脚本的对应函数。

底层源码部分展示:

在Node的OnEnter函数中,会遍历这个节点上所有脚本,并触发脚本中的OnEnter函数。

如果熟悉Cocos Creator就会发现,这种使用lua脚本的方式和creator挂载js(ts)脚本很相似。只不过creator是用可视化编辑器创建节点,拖拽挂载脚本;而我们使用C++代码创建节点和绑定脚本,殊途同归!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值