`
runfeel
  • 浏览: 905445 次
文章分类
社区版块
存档分类
最新评论

【cocos2dx开发技巧7】脚本lua的使用--集成cocosbuilder

 
阅读更多

转发,请保持地址:http://blog.csdn.net/stalendp/article/details/9154485

由于cocosBuilder几乎包办了游戏界面的编程,所以自己在上一版cocos2dx中(还没在lua中对cocosbuilder进行集成),我就自己实现了套集成方案,一直想写出来,但是由于改动了lib中的代码,解释起来也不那么容易,所以一直耽搁了;刚刚发布的新版本中,cocos2dx增加了这样的支持,试用了一下,发现比较ok,特意写下这片文章,以供大家参考。

一、创建工程

1. 在xcode中创建一个cocos2dx_lua的工程,命名为MyCCBTest。

2. 创建cocosBuilder工程,保存到lua工程目录下,命名为ccb;


3. 配置cocosBuilder工程相关属性。

a)把MyCCBTest/ccb/Resources目录下的文件(除了ccb文件外)移动到MyCCBTest/Resources目录下;

b) 在cocosBuilder菜单下,选择File/Project Setting.., 在弹出的对话框的Resource paths下添加MyCCBTest/Resources目录。并去掉JavaScript Based project前的钩,如下图:


完成之后,cocosbuilder左边的导航如下图(图中的ccbi文件夹在步骤c中创建的):

c) 先在MyCCBTest/Resources下创建一个文件夹ccbi;然后在cocosBuilder菜单下,选择File/Publish Setting..,在弹出的对话框中,Publish to directory选则刚刚建立的MyCCBTest/Resources/ccbi, 然后在对话框的最后,勾选Only publish ccb-files; 其他的,如Html5,Android,Iphone等选项没有要求(我暂时没去管),结果如下图:


在cocosBuilder的菜单中点击File/Publish, 就可以把ccb文件发布了,如下图:


然后把生成的文件引入到xcode的工程中,千万不要忘记这一步。引用的时候,尽量使用文件的reference。



二、编辑ccb文件

1. 我把原先的menu去掉了,加上了一个control按钮,使title为ClickMe,并指定Select的Selector为onClick,target为DocumentRoot;如下图:


调整位置:



2. 创建新的动画;创建一个timeline,命名为myClick,并切换到此timeline下。(详细请参考《[cocos2dx开发技巧2]工具CocosBuilder的使用--集成》 中的 “编辑ccb文件--动画”)

在myClick下,对“HelloCocosBuilder”文字进行位置动画的编辑(我让文字沿着手机屏幕的四边按顺时针移动),如下图:


在文字移动到上图的位置时,我插入了一个音效和两个回调函数(方法为,按住Alt键,然后点击相应的位置;这个Alt键时在windows键上的,mac键自己可以试一下);然后双击新加入的点,使callback的名称为onFirstCB, onSecondCB,音效为effect1.wav,如下图:


这样,在动画运行到靠近2s的时候,会发声并调用onCallback函数。

三、编辑代码

1. 引入相关环境
CCB功能被整合到lua的extension中了,所以如果要在lua中使用cocosbuilder,需要引入相关的环境;
在Classes/AppDelegate.ccp中,加入头文件#include"Lua_extensions_CCB.h", 并在applicationDidFinishLaunching函数中用tolua_extensions_ccb_open注册环境:
bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
    
    // turn on display FPS
    pDirector->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60);

    // register lua engine
    CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);

    tolua_extensions_ccb_open(pEngine->getLuaStack()->getLuaState());
    
    std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("hello.lua");
    pEngine->executeScriptFile(path.c_str());

    return true;
}

2. 修改Resources/hello.lua文件,如下:
function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
    print(debug.traceback())
    print("----------------------------------------")
end

local function main()
    -- avoid memory leak
    collectgarbage("setpause", 100)
    collectgarbage("setstepmul", 5000)

    local cclog = function(...)
        print(string.format(...))
    end

   require "CCBReaderLoad"
	MainScene = MainScene or {}
	ccb["MainScene"] = MainScene  --这里ccb中的参数要和ccb中根节点的JS Controller的名称相同
	
	MainScene.onClick = function() -- 这里的onClick是ClickMe按钮的回调函数
		if nil ~= MainScene["mAnimationManager"] then
	        local animationMgr = tolua.cast(MainScene["mAnimationManager"],"CCBAnimationManager")
	        if nil ~= animationMgr then
	            animationMgr:runAnimationsForSequenceNamedTweenDuration("myClick", 0)  --执行myClick动画
	        end
	    end
	end
	MainScene.onFirstCB = function()  -- 动画的第一个回调函数
		 local ccLabelTTF = tolua.cast(MainScene.helloLabel,"CCLabelTTF")
		ccLabelTTF:setString("onFisrtCB")
	end
	
	MainScene.onSecondCB = function()   -- 动画的第二个回调函数
		 local ccLabelTTF = tolua.cast(MainScene.helloLabel,"CCLabelTTF")
		ccLabelTTF:setString("onSecondCB")
	end
   
    -- run
    
	local function HelloCCBTestMainLayer()
	  	local  proxy = CCBProxy:create()
    	local  node  = CCBReaderLoad("ccbi/MainScene.ccbi",proxy,true,"MainScene")
    	local  layer = tolua.cast(node,"CCLayer")
	    return layer
	end
	
	function runCocosBuilder()
	    cclog("HelloCCBSceneTestMain")
	    local scene = CCScene:create()
	    scene:addChild(HelloCCBTestMainLayer())
	    return scene
	end
	
   local scene  = runCocosBuilder()


    if nil ~= scene then
        CCDirector:sharedDirector():pushScene(CCTransitionFade:create(0.5, scene, ccc3(0,0,0))); 
    end 
end

xpcall(main, __G__TRACKBACK__)

其实,代码还可以简化,比如为赋值,还可以简单。
目前为
local ccLabelTTF = tolua.cast(MainScene.helloLabel,"CCLabelTTF")
ccLabelTTF:setString("onFisrtCB")
由于没有CCLabelTTF的信息,所以要cast一下;实际中,我可以获取这个类信息,节省掉一些cast代码,如下:
MainScene.helloLabel:setString("onFisrtCB")
我将在下篇文章介绍。

另外列一下,lib中相关的代码位置:
libs/lua/script/CCBReaderLoad.lua
libs/lua/cocos2dx_support
libs/extensions/CCBReader
各位有兴趣的话,可以去参考一下源代码。

最后附上本文使用的例子:
--


分享到:
评论

相关推荐

    vscode-coco2dx-lua-api.7z

    用vsdoe开发cocos2dx-lua的辅助文件,用于代码提示,提高代码效率。一并提交了制作脚本。 cocos2dx-lua,vscode代码提示文件,附带制作脚本

    cocos2dx-lua在vs2015上的调试插件

    cocos2dx lua debug的插件,可以断点lua,看堆栈信息,单步调试lua。 解压后,先安装BabeLua For 2015 V3.2.2.0.vsix,再安装babelua-compat-1.06-VS2015

    cocos2dx登陆模块客户端lua脚本

    cocos2dx上面的登陆系统lua实现

    cocos2dx-csd转lua py脚本文件.rar

    软件介绍: cocos 的cocostudio工程文件,Csd_Lua.py是cocos2dx- csd转成对应lua的脚本文件。用得到的同学可以试试。

    cocos2dx lua绑定

    cocos2dx lua绑定,基于tolua++、Python工具实现cococs2dx环境下的lua脚本绑定。

    quick-cocos2d-x3.3 lua开发曹操传源码

    quick-cocos2d-x3.3 lua开发曹操传源码,可编译通过 引擎版本:Cocos2dx-lua 3.3 语言:纯lua实现,逻辑代码大约2W多行,剧情脚本+数据大约7W多行(采用脚本进行转换的)

    cocos2d-js/lua游戏【解密】套件

    1. android砸壳 2. 文件解密 2.1. 新版jsc解密 2.2. lua文件自动解密脚本 3. 抓包软件mac&wind 4. 数据报文解密脚本 5. 安卓hook工具包

    cocos2d-x 3.x lua 热更新列表版本解决方案

    cocos2d-x 3.x lua 热更新列表版本解决方案,使用官方assetsManager 在lua脚本端完成,通过版本列表的方式进行迭代更新。

    关于手动绑定cocos2dx-lua C++接口详细教程

    该文档详细说明了如何自定cocos2dx-lua(quick) C++接口并导出接口供lua端调用,从环境配置,文件编译,接口测试,平台(Android和Ios)编译一步一步进行详细说明,按照文档一步步操作就能生成你想要的C++接口,简单...

    cocos2dx lua脚本编译工具

    cd 到目录运行script_compile.bat,复制lua代码路径。回车生成编译后的lua文件在out目录。可以直接被cocos2dx 加载运行

    lua2js4cocos:lua将cocos2d-js转换为javascript

    lua2js4cocos lua转换为cocos的javascript cocos2dx-lua到cocos2dx-js 将lua文件放入输入中运行lua2js.py脚本,该js文件将在输出中生成。

    cocos2d实现slider滑块效果

    哎,真的非常遗憾,我一个人完成游戏的编辑器开发,脚本开发,游戏代码开发,很不容易,因为我学object-c,coco2d才看了2个星期的书就直接开发了,以前是搞c++的吗。感觉4个人开发游戏真的很累,游戏为了脱颖出更加...

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    【Cocos2dx-lua 3.11.1】打包lua项目为安卓apk-附件资源

    【Cocos2dx-lua 3.11.1】打包lua项目为安卓apk-附件资源

    lua utf8 unicode ansi 转换

    require "lc" print(lc.help());... u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06

    使用BabeLua调试Cocos2d-x的Lua脚本

    使用BabeLua调试

    cocos2d实现RollNunber(数字滚动效果)

    哎,真的非常遗憾,我一个人完成游戏的编辑器开发,脚本开发,游戏代码开发,很不容易,因为我学object-c,coco2d才看了2个星期的书就直接开发了,以前是搞c++的吗。感觉4个人开发游戏真的很累,游戏为了脱颖出更加...

    CocosLua:swift工程调用Cocos2dx-lua工程配置;

    手把手教你swift项目添加cocos2dx-lua标签(空格分隔): iOS本文所用各版本信息:Xcode9.2 + swift4版本cocos2d-x v3.17集成思路首先网上给出一个C系的思路,本人未亲测,并且以C调用lua,绕过了cocos2d-x的调用...

    cocos2dx-csd转lua

    cocos 的cocostudio工程文件 csd转成对应的lua脚本,控件_区分

Global site tag (gtag.js) - Google Analytics