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上,很简单的例子。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值