Cocos2d-x 3.x开发——导入Cocostudio资源

转自--https://segmentfault.com/a/1190000000593010

          http://www.benmutou.com/archives/918

目前正在和实训的小组成员一起做一款手机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));
Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

这篇的内容很简单,获取UI控件,然后使用它。

 

还记得我们在UI编辑器中给三个按钮分别命名了吧?

现在要用上了。

 

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址: http://www.benmutou.com/archives/918

文章来源:笨木头与游戏开发

 

根据名字查找控件

首先给TollgateScene再include一些头文件,不然等会编译又报错了:

    
    
  1. #include "editor-support/cocostudio/CCSGUIReader.h"
  2. #include "cocostudio/CocoStudio.h"
  3. #include "ui/CocosGUI.h"
  4. using namespace cocos2d::ui;
  5. using namespace cocostudio;

 

上面就是比较完整的使用UI所需要用到的头文件了。

 

然后,获取UI控件的方法如下,继续修改createOprUI函数:

    
    
  1. void TollgateScene::createOprUI()
  2. {
  3.     auto UI = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("OprUI_1.ExportJson");
  4.     this->addChild(UI);
  5.  
  6.     /* 获取按钮对象 */
  7.     Button* rightBtn = (Button*)Helper::seekWidgetByName(UI, "rightBtn");
  8.     Button* quickMoveBtn = (Button*)Helper::seekWidgetByName(UI, "quickMoveBtn");
  9.     Button* leftBtn = (Button*)Helper::seekWidgetByName(UI, "leftBtn");
  10. }

Helper::seekWidgetByName函数会从UI里面找控件,一层层的找,父控件找不到,就找子控件,如此递归,最后找的名字相符的控件,返回这个控件对象。

 

很简单,不多解释喇~

 

添加按钮回调事件

OK,最后一步了,现在按钮摆在那里什么都做不了,我们给按钮添加回调事件~

 

先给TollgateScene添加三个函数声明:

    
    
  1.     void moveToLeft(Ref* sender, TouchEventType type);
  2.     void moveToRight(Ref* sender, TouchEventType type);
  3.     void quickMove(Ref* sender, TouchEventType type);

这是Button点击事件回调时所需要的函数格式。

 

然后,继续修改createOprUI函数:

    
    
  1. void TollgateScene::createOprUI()
  2. {
  3.     auto UI = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("OprUI_1.ExportJson");
  4.     this->addChild(UI);
  5.  
  6.     /* 获取按钮对象 */
  7.     Button* rightBtn = (Button*)Helper::seekWidgetByName(UI, "rightBtn");
  8.     Button* quickMoveBtn = (Button*)Helper::seekWidgetByName(UI, "quickMoveBtn");
  9.     Button* leftBtn = (Button*)Helper::seekWidgetByName(UI, "leftBtn");
  10.  
  11.     /* 添加按钮回调事件 */
  12.     leftBtn->addTouchEventListener(this, toucheventselector(TollgateScene::moveToLeft));
  13.     rightBtn->addTouchEventListener(this, toucheventselector(TollgateScene::moveToRight));
  14.     quickMoveBtn->addTouchEventListener(this, toucheventselector(TollgateScene::quickMove));
  15. }

 

利用addTouchEventListener函数就可以绑定按钮的回调事件了~

 

最后了,看看三个回调函数的实现:

    
    
  1. void TollgateScene::moveToLeft(Ref* sender, TouchEventType type)
  2. {
  3.     switch (type)
  4.     {
  5.     case TOUCH_EVENT_ENDED:
  6.         m_player->moveToLeft();
  7.         break;
  8.  
  9.     }
  10. }
  11.  
  12. void TollgateScene::moveToRight(Ref* sender, TouchEventType type)
  13. {
  14.     switch (type)
  15.     {
  16.     case TOUCH_EVENT_ENDED:
  17.         m_player->moveToRight();
  18.         break;
  19.  
  20.     }
  21. }
  22.  
  23. void TollgateScene::quickMove(Ref* sender, TouchEventType type)
  24. {
  25.     switch (type)
  26.     {
  27.     case TOUCH_EVENT_ENDED:
  28.         m_player->quickMove();
  29.         break;
  30.  
  31.     }
  32. }

是不是感觉有点小复杂?

应该说,有点小麻烦,因为按钮事件绑定的时候,是没有区分“按下”、“移动”、“松开”的,所以我们要自己判断一下,TOUCH_EVENT_ENDED就是按钮点击,然后松开的时候的事件。

如果大家觉得麻烦,可以自己改源码,添加一些函数,在绑定按钮事件的时候,可以指定绑定哪种事件。以及可以使用std::function来作为参数,这样很方便,当然,跑题了。为了避免大家混乱,这里就不介绍了。

 

运行测试

OK,现在大家运行游戏,然后点击这三个操作按钮,看看主角是不是能左右移动以及放屁(向下冲)吧~

 

 

下一篇,添加碰撞检测,让主角碰到墙壁之后,进行加血。

没错,就是加血,不是扣血~因为《别救我》胜利的条件是血量为0,碰到墙是要惩罚的~

惩罚的方式就是加血~



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值