zoukankan      html  css  js  c++  java
  • Cocos2d-x——导入Cocostudio资源

    (搬运自我在SegmentFault的博客)

    目前正在和实训的小组成员一起做一款手机2D游戏,我们采用了Cocos2d-x进行开发。之前虽然早有耳闻,这次却是第一次认真地学习和使用Cocos2d-x。最开始的几天就是在不停的看文档和爬坑。其中一个坑就是Cocostudio这货。官网的文档滞后而且不够详细,为了弄清楚,借鉴了很多博客,也阅读了示例代码。

    本人Cocos2d-x的版本是3.1,Cocostudio的版本是1.5.
    Cocostudio目前的功能包括UI编辑器、动画编辑器、场景编辑器和数据编辑器。数据编辑器没有涉及到,就不说了。剩下三者中主要讲下导入UI编辑器的资源。
    UI编辑器导出的文件包括一个.ExportJson文件,一个.plist文件和一个.png文件。Cocostudio中文官网中说的是TouchGroup,英文官网中是UILayer,可是都已经不存在了。UILayer变成了Layer,现在也可以不创建Layer,直接加到场景上面。所以代码可以这样:

    Node *pNode = GUIReader::getInstance()->widgetFromJsonFile("test.ExportJson");
    this->addChild(pNode);
    

    下面就可以用getChildByTag来获取组件了。不过getChildByTag貌似只能按照树的结构一层层照下来,显得很麻烦,而且不能按照名字来取。所以,现在可以用ui中的Helper直接从树中获取组件,用name或者tag。但seekWidgetByTagseekWidgetByName的第一个参数是Widget类型,需要将pNode转成Widget类型。(从.ExportJson文件可以看出来,pNode本来就是一个Widget类型的树)

    Button *button = (Button*)(ui::Helper::seekWidgetByName(pNode, "button"));
    

    顺便附上绑定事件监听的代码,使看到的人免去寻找之苦。

    button->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));
    

    touchEvent是自己写的方法。这个方法大致是如下用法,注意pSendertype的使用。

        void SingleMenuScene::selectEvent(Ref *pSender, Widget::TouchEventType type)
    {
    	switch(type)
    	{
    	case Widget::TouchEventType::ENDED:
    		GameSetting::Map map = GameSetting::Map::DEFAULT;
    		if(pSender == defaultBtn)
    		{
    			map = GameSetting::Map::DEFAULT;
    		}
    		else if(pSender == snowBtn)
    		{
    			map = GameSetting::Map::SNOW;
    		}
    
    		Scene *game = BattleScene::createScene(map);
    		TransitionScene *transition = TransitionFade::create(0.5, game);
    		Director::getInstance()->replaceScene(transition);
    
    	}
    }
    

    导入动画编辑器的动画的代码如下:

    CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Animation0.png","Animation0.plist","Animation.ExportJson");
    CCArmature *armature = CCArmature::create("Animation");
    armature->getAnimation()->playByIndex(0);
    armature->setScale(0.5f);
    armature->setPosition(ccp(visibleSize.width * 0.5, visibleSize.height * 0.5));
    this->addChild(armature);
    

    导入场景编辑器的场景的代码如下:

    Node* pNode = SceneReader::getInstance()->createNodeWithSceneFile("scene.ExportJson");
    this->addChild(pNode);
    

    这个读出的Node貌似不能转成Widget,因为它不仅包括UI组件还有动画等资源。获取组件和绑定事件监听可以这样写:

    ComRender *render = (ComRender*)(pNode->getChildByTag(10010)->getComponent("GUIComponent"));
    Widget *widget = (Widget*)(render->getNode());
    widget->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));
  • 相关阅读:
    挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)
    SQLSERVER中的鬼影索引
    SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间
    SQLSERVER中NULL位图的作用
    SQLSERVER到底能识别多少个逻辑CPU?
    不正常关机引起的数据库置疑
    如何在大型的并且有表分区的数据库中进行DBCC CHECKDB操作
    索引视图是否物理存储在数据库中以及使用索引视图的一些见解
    Oracle非重要文件恢复,redo、暂时文件、索引文件、password文件
    最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
  • 原文地址:https://www.cnblogs.com/CodeCabin/p/3962041.html
Copyright © 2011-2022 走看看