cocos2dx C++工程中使用lua腳本(二):C++調用lua腳本(一)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章