• 【cocos2dx开发技巧10】cocosStudio的集成以及c++11的新特性


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

    非常长时间没有碰cocos2dx了,近期又用起来了。花了好几个小时又一次熟悉了一下,发现非常多新的特性值得用来写文章。好吧,先从最经常使用的開始。

    近期用windows,使用cocosStudio。就从这个開始吧。顺带介绍一下project的创建。以及c++11的特性。

    曾经开发使用cocosBuilder开发界面(相关集成见这篇文章)。

    准备工作

    1)准备NDK、andrdoid-SDK,VisualStudio等工具。并环境变量设置NDK_ROOT,ANDROID_SDK_ROOT,Path等

    2)安装Python 2.7.x (不是3.x.x);

    3)下载cocos2d-x-3.2压缩包

    创建游戏项目

    打开命令行工具,切换到cocos2d-x-3.2文件夹下。运行命令:

    1)  setup.py, 用来环境变量设置

    2)cocos new circleTheLine -p com.evilgame.circleTheLine -l cpp -d x:yourprojectpath , 用来创建项目

    在2)命令运行完后, x:yourprojectpath文件夹下。会出现例如以下内容;点击proj.win32下的visualStudio工程,就能够打开项目。

    使用CocosStudio创建界面

    我这里仅仅是做一个页面,所以仅仅选择UI Editor来制作。


    制作的界面例如以下:


    然后把该项目导出,得到NewUi_1.json。test.png, test.plist文件。把这三个文件复制到游戏根文件夹下的Resources文件夹下。

    集成cocos2dx

    如今的目标是。当用户点击“測试button”后,改变界面上的文字。

    1)增加对应的libproject。

    由于cocosStudio的使用,须要依赖于libCocosStudio, libGUI, libExtensions三个库。详细路径例如以下(D:Program Filescocos2d-x-3.2为根文件夹)

    libCocosStudio D:Program Filescocos2d-x-3.2cocoseditor-supportcocostudio
    libGUI D:Program Filescocos2d-x-3.2cocosuiproj.win32
    libExtensions D:Program Filescocos2d-x-3.2extensionsproj.win32

    须要改动visualStudio,对它们进行引用。详细例如以下:

    1a) 把上面的三个project增加“解决方式”中。

    右击项目。在弹出的菜单中选择 加入/现有项,例如以下:


    1b) 加入引用依赖:(解决链接的问题)

    右击项目,在弹出的菜单中选择 属性,在弹出的对话框中做例如以下操作:


    1c)加入头文件:(解决编译的问题)

    #include "cocostudio/CocoStudio.h"
    #include "ui/CocosGUI.h"
    
    USING_NS_CC;
    using namespace cocostudio;
    using namespace ui;
    注意,命名空间ui,事实上是cocos2d的子命名空间;所以须要写在USING_NS_CC以下,或者写成:

    using namespace cocos2d::ui;

    假设上面路径无法找到,请依照以下的方法,查看是否包括了对应的路径。

    右击项目,在弹出的菜单中选择 属性,在弹出的对话框中做例如以下操作:


    当中@{EngineRoot}是宏变量。用来指定cocos2dx的根文件夹(我这里是D:Program Filescocos2d-x-3.2);头文件就是相对于这里的“附加包括文件夹”的设置的。

    所以做对应的调整。确保路径正确。

    2)显示该界面:

            node = GUIReader::shareReader()->widgetFromJsonFile("NewUi_1.json");
            // 这里的node是类变量
    	if (node == nullptr)
    	{
    		return true;
    	}
    	this->addChild(node);
    
    // 当然读取场景文件,能够用下面的语句
    // CCNode *pNode = SceneReader::sharedSceneReader()->createNodeWithSceneFile("SceneEditorTest/SceneEditorTest.json"); 

    3)绑定button事件:

    	Button* button = static_cast<Button*>(node->getChildByName("btnTest"));
    	button->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type) {
    		if (type == Widget::TouchEventType::ENDED) {
    			// 注意node的生命周期的问题
    			TextBMFont* nn = static_cast<TextBMFont*>(node->getChildByName("displayMsg")); 
    			nn->setString("msg changed!!");
    		}
    	});
    上面的代码使用了C++11的lambda表达式特性,以下将做介绍。

    C++11特性--lambda表达式

    c++最终能够使用lambda表达式了!

    这将为编码带来极大的方便,上面的样例代码。非常好地体现了。

    1) 三种方法的对照:
    写法1(未用lambda表达式):
    auto closeItem = MenuItemImage::create(  
                                            "CloseNormal.png",  
                                            "CloseSelected.png",  
                                            CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));  
                                              
    void HelloWorld::menuCloseCallback(Object* sender)  
    {  
        Director::getInstance()->end();  
    }  
    
    写法2(lambda函数指针):
    auto callEnd = [](Object* sender)  
    {  
        Director::getInstance()->end();//直接在这里加入button要调用的代码   
    };    
    auto closeItem = MenuItemImage::create(  
                                            "CloseNormal.png",  
                                            "CloseSelected.png",  
                        allEnd);     
    写法3(lambda表达式):
    auto closeItem = MenuItemImage::create(  
                                            "CloseNormal.png",  
                                            "CloseSelected.png",  
                                            [](Object* sender)  
                        {  
                            Director::getInstance()->end();//直接在这里加入button要调用的代码  
                        });  
    
    假设要设定表达式可以訪问外部变量。可以在 [] 内写入 & 或者 = 加上变量名,当中 & 表示按引用訪问。= 表示按值訪问。变量之间用逗号分隔,比方 [=factor, &total] 表示按值訪问变量 factor,而按引用訪问 total。假设是引用的话。须要注意该对象的生命周期,回调函数的生命周期和控件同样。

    另外很多其它技术分享和讨论,请加群:385121586


    參考:

    C++11特性:http://blog.csdn.net/star530/article/details/19913611
    官方样例中的ExtensionTest/CocoStudioSceneTest/SceneEditorTest.cpp
  • 相关阅读:
    flume和kafka整合(转)
    Flume目录
    Flume的安装配置
    HBase系统架构及数据结构(转)
    toolbar ,textfield,图片拉伸,Bundle
    poj 1017 Packets
    jQuery使用serialize(),serializeArray()方法取得表单数据+字符串和对象类型两种表单提交的方法
    Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
    LintCode-落单的数 III
    LeetCode90:Subsets II
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7251425.html
Copyright © 2020-2023  润新知