首先在使用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上,很簡單的例子。