首先在使用Lua脚本之前,先讨论下什么样的情况下需要用到C++和lua混合开发。
cocos2dx有C++版本、Lua版本、JS版本(使用这部分的开发者估计现在都转向cocos creator了吧)。
纯C++开发:
优点:由于cocos2dx使用c++编写的开源引擎,若是C++开发,更容易接触到引擎底层,可以根据实际需求修改引擎;同时也可以学习引擎组大佬们的优质代码。
缺点:1、无法热更新,有很多联网手游每周都会更新签到、抽卡等活动。这么频繁的更新,在游戏审核这关可能就过不了。
2、每次修改之后都要重新编译。若修改的文件关联到了很多其他文件,那编译时间会大大增加,目前本人工作就深受其害。
当然也不是所有的游戏都需要用到热更新,本人之前一直都是用C++开发休闲单机游戏,这类游戏更新不是很频繁。
C++和lua混合开发:用C++开发游戏大部分固定内容,更新比较频繁的模块(如:活动模块)使用lua脚本开发。 毋庸置疑,这种开发方式即有C++开发的优势,又弥补了无法热更新的缺点。
以上纯属个人观点。
C++代码
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);
return true;
}
void HelloWorld::menuCloseCallback(Ref* pSender)
{
//调用lua脚本
ScriptEngineManager::getInstance()->setScriptEngine(LuaEngine::getInstance());
LuaEngine::getInstance()->executeScriptFile("test1.lua");
}
Lua脚本
require "cocos.init"
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end
local function addLayer()
local cclog = function(...)
print(string.format(...))
end
local visibleSize = cc.Director:getInstance():getVisibleSize()
local origin = cc.Director:getInstance():getVisibleOrigin()
local function initUI(layer)
local sp = cc.Sprite:create("HelloWorld.png")
sp:setPosition(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)
layer:addChild(sp,1)
end
local function createLayerMap()
local layerWroldMap = cc.Layer:create()
initUI(layerWroldMap)
return layerWroldMap
end
cc.Director:getInstance():getRunningScene():addChild(createLayerMap(),3,1)
end
点击closeItem,在回调中调用lua脚本,在lua脚本中创建了一个layer并且在layer上加了一个cocos精灵,最后把layer加到当前scene上,很简单的例子。