本节介绍给节点加组件(其实就是一个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++代码创建节点和绑定脚本,殊途同归!