`

(转)如何使用 CocoStudio UI 编辑器实现设置界面并且包括代码

 
阅读更多

1 游戏中必不可少的 UI 元素

./cocostudioUI/image04.png

一个成功的游戏离不开友好的用户体验,而用户体验则取决于功能是否合理,界面是否美观等因素,除了游戏的核心玩法之外,游戏中的各种“配置功能”也是必不可缺的,更准确的说,游戏中存在那么些必不可少的 UI 元素。

上图所示是近期非常火爆的游戏《乱斗堂》的截图,内容是其“配置界面”,如果要实现这样一个“配置界面”,如果是你,你该从何下手!首先要有素材(当然请美工制作了),然后我们编写代码,这样一个界面我们可以用一个层来实现,加载各种图片素材,逐一添加至层。其实,这都没什么,只是你需要手动设置坐标,不断的运行调试,才能达到最终想要的效果而已。效果出来了,实现具体的功能,点击操作该如何实现,如果所有显示的图片都是精灵,那么你需要做触摸处理,判断点击有效否,然后可能需要修改精灵图片(不同的点击效果),聪明一点的做法是实用 CCMenu 来实现点击功能,但如此可能会引入其它问题,CCMenu 的触摸优先级别很高,以至于多层 UI 的情况,处理起来变得繁杂。而更聪明一点的做法,就是设计一套 UI 系统,来满足各种需求!

我们在编写游戏之前还需要实现一套自己的 UI 系统?当然不是,即便是 Cocos2d 的第一个 python 版本,也不是一夕而就的,而是开发多个游戏之后总结、规范、封装重用之后的框架,而 UI 系统也符合这么个客观规律。都是为了解决实际开发过程中遇到的问题,重用相同的功能。简化我们的开发。

下面介绍如何使用 CocoStudio 的 UI 编辑器来帮助我们实现这样一个“配置界面”,并且实现其配置功能。

2 使用 CocoStudio UI 编辑器设计配置界面

2.1 首先建立主配置界面:

  1. 安装好 CocoStudio 程序,并准备好所需要的素材
    QQ截图20130724172821
  2. 建立新的项目,命名“ChaosFight”,设置分辨率(根据实际需要),这里手动填写分辨率。
  3. 导入游戏的素材到项目,在界面添加图片框控件,显示背景./cocostudioUI/image06.png
  4. 根据需要添加控件,在这个主界面上我们添加了,一个图片框,下面四个文本按钮,再下面一排四个图片按钮,最下面是两个文本按钮和一个文本框(文本域)。
    ./cocostudioUI/image07.png
  5. 在编辑时,我们需要注意以下几点:
    • 设置图片按钮之时,可以设置禁用时显示的图片。所有的可点击操作的控件,需要启用“交互”属性。
    • 设置按钮属性 默认图片 与 点击效果图 的图片相同(或者不同,按下效果图如果不设置,实际操作按下也不显示,空白)

    QQ截图20130724172132

  6. 导出各部分资源文件

2.2 其次我们需要一个 “修改密码” 的二级 UI 界面:

  1. 新建立项目,并导入相关资源。
  2. 设计界面,如下图所示:
    ./cocostudioUI/image02.png
    这里我们添加了三组密码框。而在设计这样三个类似控件集的时候,有个技巧,我们首先局部好一个个控件区域,如上“旧密码”区域,然后我们将相关的控件树结构,统一在一起,如图:
    ./cocostudioUI/image01.png
    QQ截图20130724171717

    点击右侧对象结构,我们可以复制整个树枝“节点”,然后粘贴到树中,如上图,“新密码”区域,我们将相关的控件集合在“新密码”节点,然后拖动此节点,可以很好的完成内部元素的相对位置。
  3. 修改相关属性,命名规范并导出资源

以上时设计界面的简单步骤,所有的都是可视化操作,所见即所得,已经提供了常用的控件,并且还在不断添加完善。

3 编写代码控制页面逻辑

  1. 建立新的工程,引入 CocoGUILIB 扩展库,和 UI 编辑器导出的资源文件(工程建立步骤请实时关注官方说明,不同版本操作步骤不同,这里使用的时 2.1.4e 版本,请下载最新的版本库,以使用最简单的方法配置环境等。)
  2. 创建一个新的场景类,用于加载我们的 UI 资源,并编写相关逻辑,其关键代码如下(实现加载,跳转逻辑控制功能) 所有代码即工程资源:
  3.  工程代码下载 地址:点击下载整个工程

 

#ifndef TestCpp_ChaosFight_h
#define TestCpp_ChaosFight_h

#include "cocos2d.h"
#include "CocosGUI.h"

USING_NS_CC;
USING_NS_CC_EXT;

class ChaosFightUI: public CCLayer{
public:
    static CCScene* scene();
    virtual bool init();
    CREATE_FUNC(ChaosFightUI);
    
    void tbChangePwdCallback(CCObject* pSender);
    void tbBindingEmailCallback(CCObject* pSender);
    void tbChangeRoleCallback(CCObject* pSender);
    void tbLogoutCallback(CCObject* pSender);
    
    void btnSoundEffectCallback(CCObject* pSender);
    void btnMusicEffectCallback(CCObject* pSender);
    void btnSavingElectricityCallback(CCObject* pSender);
    void btnVideoCallback(CCObject* pSender);
    
    void tbAboutCallback(CCObject* pSender);
    void tbClearCacheCallback(CCObject* pSender);
    
    
    void btnXCallback(CCObject* pSender);
    void tbOkCallback(CCObject* pSender);

private:
    UILayer* ul;
    
    
    UILayer* ulPwd;
    
    UIButton* btnX;
    UITextButton* tbOk;
    
    UITextField* tfOldPwd;
    UITextField* tfNewPwd;
    UITextField* tfNewPwdConfirm;
    
};


#endif

 

    实现代码

 

#include "ChaosFight.h"

CCScene* ChaosFightUI::scene(){
    CCScene* scene = CCScene::create();
    CCLayer* layer = ChaosFightUI::create();
    scene->addChild(layer);
    return scene;
}

bool ChaosFightUI::init(){
    bool bRef = false;
    
    do{
        CC_BREAK_IF(! CCLayer::init());
        
        ul = UILayer::create();
        // 设置 UI 层的tag
        this->addChild(ul, 0, 100);
        ul->addWidget(CCUIHELPER->createWidgetFromJsonFile("ChaosFight_1/ChaosFight_1.json"));
        
        // 获得各个控件,并添加点击事件
        UITextButton* tbChangePwd = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbChangePwd"));
        UITextButton* tbBindingEmail = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbBindingEmail"));
        UITextButton* tbChangeRole = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbChangeRole"));
        UITextButton* tbLogout = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbLogout"));
        
        
        UIButton* btnSoundEffect = dynamic_cast<UIButton*>(ul->getWidgetByName("btnSoundEffect"));
        UIButton* btnMusic = dynamic_cast<UIButton*>(ul->getWidgetByName("btnMusic"));
        UIButton* btnSavingElectricity = dynamic_cast<UIButton*>(ul->getWidgetByName("btnSavingElectricity"));
        UIButton* btnVideo = dynamic_cast<UIButton*>(ul->getWidgetByName("btnVideo"));
        
        UITextButton* tbAbout = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbAbout"));
        UITextButton* tbClearCache = dynamic_cast<UITextButton*>(ul->getWidgetByName("tbClearCache"));
        
        // 设置字体颜色
        tbChangePwd->setTextColor(0, 0, 0);
        tbBindingEmail->setTextColor(0, 0, 0);
        tbChangeRole->setTextColor(0, 0, 0);
        tbLogout->setTextColor(0, 0, 0);
        
        tbAbout->setTextColor(0, 0, 0);
        tbClearCache->setTextColor(0, 0, 0);
        
        // 为控件添加处理事件
        tbChangePwd->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbChangePwdCallback));
        tbBindingEmail->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbBindingEmailCallback));
        tbChangeRole->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbChangeRoleCallback));
        tbLogout->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbLogoutCallback));

        btnSoundEffect->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::btnSoundEffectCallback));
        btnMusic->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::btnMusicEffectCallback));
        btnSavingElectricity->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::btnSavingElectricityCallback));
        btnVideo->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::btnVideoCallback));

        tbAbout->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbAboutCallback));
        tbClearCache->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbClearCacheCallback));
        
        
        bRef = true;
    }while(0);
    return bRef;
}

void ChaosFightUI::tbChangePwdCallback(cocos2d::CCObject *pSender){
    // 创建加载修改密码界面 ulPwd 作为类成员属性,以便重用  
    ulPwd = UILayer::create();
    ulPwd->addWidget(CCUIHELPER->createWidgetFromJsonFile("ChaosFightPassword_1/ChaosFightPassword_1.json"));
    this->addChild(ulPwd);
    ulPwd->setAnchorPoint(CCPoint(0.5,0.5));
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    ulPwd->setPosition(CCPoint(winSize.width / 2 - 250, winSize.height / 2 - 180));
    
    // 获取点击确定按钮
    tbOk = dynamic_cast<UITextButton*>(ulPwd->getWidgetByName("tbOk"));
    tbOk->addReleaseEvent(this, coco_releaseselector(ChaosFightUI::tbOkCallback));
    tbOk->setTextColor(0, 0, 0);
    
    tfOldPwd = dynamic_cast<UITextField*>(ulPwd->getWidgetByName("tfOldPwd"));
    tfNewPwd = dynamic_cast<UITextField*>(ulPwd->getWidgetByName("tfNewPwd"));
    tfNewPwdConfirm = dynamic_cast<UITextField*>(ulPwd->getWidgetByName("tfNewPwdConfirm"));
    
    tfOldPwd->setColor(ccc3(0, 0, 0));
    tfNewPwd->setColor(ccc3(0, 0, 0));
    tfNewPwdConfirm->setColor(ccc3(0, 0, 0));
    

    ul->setTouchEnabled(false);

}

void ChaosFightUI::tbBindingEmailCallback(cocos2d::CCObject *pSender){
    CCMessageBox("绑定邮箱", "title");
}

void ChaosFightUI::tbChangeRoleCallback(cocos2d::CCObject* pSender){
    CCMessageBox("切换角色", "title");
}

void ChaosFightUI::tbLogoutCallback(cocos2d::CCObject *pSender){
    CCMessageBox("注销", "title");
}

void ChaosFightUI::btnSoundEffectCallback(cocos2d::CCObject *pSender){
    CCMessageBox("音效", "title");
}

void ChaosFightUI::btnMusicEffectCallback(cocos2d::CCObject *pSender){
    CCMessageBox("音乐", "title");
}

void ChaosFightUI::btnSavingElectricityCallback(cocos2d::CCObject *pSender){
    CCMessageBox("省电", "title");
}

void ChaosFightUI::btnVideoCallback(cocos2d::CCObject *pSender){
    CCMessageBox("片头", "title");
}

void ChaosFightUI::tbAboutCallback(cocos2d::CCObject *pSender){
    CCMessageBox("关于", "title");
}

void ChaosFightUI::tbClearCacheCallback(cocos2d::CCObject *pSender){
    CCMessageBox("清楚缓存", "title");
}

void ChaosFightUI::btnXCallback(cocos2d::CCObject *pSender){
    CCMessageBox("btnX", "title");
}

void ChaosFightUI::tbOkCallback(cocos2d::CCObject *pSender){
    // 获取文本框值,并且打印
    const char* value = tfOldPwd->getStringValue();
    CCLog(value);
    ul->setTouchEnabled(true);
    this->removeChild(ulPwd);
}

 

 

 

  1. 最后运行效果如下:./cocostudioUI/image03.png二级 UI 界面:./cocostudioUI/image00.png文本输入框控件:./cocostudioUI/image05.png

 

分享到:
评论

相关推荐

    cocos2d-x3.1 Cocostudio 场景编辑器

    《cocos2d-x3.1与Cocostudio场景编辑器详解》 在游戏开发领域,cocos2d-x3.1是一个广泛使用的2D游戏引擎,它为开发者提供了强大的功能,支持跨平台的游戏开发。Cocostudio是cocos2d-x生态系统中的一个重要组成部分...

    CocoStudio 场景编辑器API使用手册

    在《CocoStudio 场景编辑器API使用手册》中,我们将深入探讨这一主题,了解如何利用这些API实现游戏开发中的各种功能。 首先,场景编辑器API是基于Cocos2d-x框架的,因此理解Cocos2d-x的基本概念和结构对于使用API...

    粗略使用cocostudio制作的scrollview

    首先,我们需要了解Cocostudio的UI编辑器。在Cocostudio中,你可以创建一个新的UI场景,并在舞台上添加各种UI元素,包括ScrollView。在UI编辑器中,你可以调整ScrollView的大小,设置其滚动方向(水平或垂直),并为...

    基于CocoStudio 1.4 的DemoShop源代码

    此外,CocoStudio的动画编辑器使得制作复杂的交互式动画变得简单,而资源管理功能则方便了资源的导入、组织和导出。 在"DemoShop"项目中,源代码与资源文件并存,这是Cocos2dx项目的一般结构。源代码通常包括游戏...

    CocoStudio GUI使用教程

    `resetSystem`接口用于完全清除并重新初始化UI系统,而`replaceUISceneWithFile`则通过读取json文件(通常由UI编辑器导出生成)来初始化UI系统。 在UI控件的创建和使用方面,创建UI控件的方法主要有两种:通过编码...

    Cocos2d-html5基于CocoStudio编辑器开发的DemoLogin

    3. UI编辑器:设计UI布局,支持各种控件,如按钮、文本框等。 4. 动画编辑器:制作角色动画,支持骨骼动画和帧动画。 5. 数据表编辑器:编辑游戏数据,如角色属性、关卡配置等。 三、DemoLogin开发流程 1. 创建项目...

    cocos2dx3.0 读取cocostudio UI控件

    CocosStudio是Cocos2d-x提供的一款可视化编辑工具,允许开发者设计UI界面和制作动画,而无需编写大量的代码。 在Cocos2d-x 3.0中读取CocosStudio创建的UI控件是开发过程中常见的需求。这通常涉及到以下几个关键知识...

    Cocos2d-html5基于CocoStudio编辑器开发的DemoBag

    在CocoStudio中,开发者可以设计游戏界面,创建UI元素,如按钮、文本框等,并设置相应的交互行为。对于模拟穿戴装备,CocoStudio允许设计者创建装备模型,定义其动画效果,并将这些元素导出为JSON格式,供Cocos2d-...

    CocoStudio 0.1.6.0

    2. **场景编辑器**:CocoStudio内含强大的场景编辑器,允许开发者通过拖放方式创建游戏场景,包括添加、排列和设置各个游戏对象的属性。开发者可以轻松调整对象的位置、大小、旋转角度和层级关系。 3. **动画编辑器...

    CocoStudio各种例子源代码大全

    - CocoStudio的动画编辑器允许创建角色动画,包括帧序列动画和骨骼动画。 - 通过源代码,你可以学习如何控制动画播放,以及如何与其他游戏逻辑进行集成。 4. **资源管理**: - 示例代码会展示CocoStudio如何处理...

    捕鱼达人cocostudio做的启动界面

    Cocostudio内置的动画编辑器可以方便地创建和编辑这些动画,使启动界面更加生动有趣。 3. **交互设置**:启动界面通常会有点击进入游戏的按钮,Cocostudio可以设置触控事件,使得玩家点击后能顺利进入游戏。这涉及...

    CocoStudio v0.2.4.1

    UI编辑器: 1. 解决UI编辑器0.2.4.0版本因为透明度引起的问题。 2. 解决锚点重新打开不正确的问题。 3. 层容器颜色设置在属性窗口添加了填充颜色开关。 4. 解决了重新打开工程后根节点panel大小为0的问题。 Coco...

    cocos2d-x3.1 Cocostudio

    3. 场景管理:通过场景编辑器,开发者可以组织游戏的不同阶段,设置交互事件,实现游戏逻辑。 4. 导出功能:Cocostudio可以导出为cocos2d-x项目文件,无缝接入到开发流程中。 三、项目结构解析 根据压缩包内的...

    CocoStudio安装文件最新绿色安全版本

    1. **界面设计**:CocoStudio的UI编辑器允许开发者直观地创建和布局游戏界面,支持多种控件如按钮、文本框、图片等,且可以自定义样式和交互效果。通过拖拽方式,非程序员也能轻松完成界面设计。 2. **动画编辑**:...

    基于CocoStudio 1.4 的ImageViewer源代码

    总的来说,基于CocoStudio 1.4的ImageViewer源代码涵盖了Cocos2dx的基本使用,包括资源加载、UI布局、事件处理和动画效果。通过理解这些代码,开发者可以更好地利用CocoStudio和Cocos2dx创建出具有丰富交互性和视觉...

    cocostudio工具集(安卓游戏开发)

    CocoStudio是一套专业的游戏开发工具集,帮助开发者快速创建游戏资源,将大部分繁琐的游戏开发工作使用编辑器来快速制作,CocoStudio包含了游戏开发中核心的几个游戏编辑器,UI编辑器、动画编辑器、场景编辑器、数据...

    CocoStudio闹钟

    它的UI编辑器允许用户拖放控件,调整布局,设置属性,大大简化了UI设计流程。此外,CocoStudio还包含一个动画编辑器,支持骨骼动画和帧动画的制作,为应用程序增加了生动的表现力。 在“CocoStudio闹钟”项目中,...

    CocoStudio_v1.0-mac.dmg.zip

    1. **Cocostudio的用途**:Cocostudio主要用于2D游戏的界面设计和交互制作,它提供了可视化编辑器来创建游戏UI,如按钮、滑块、菜单等,并且可以方便地导入和管理资源。此外,Cocostudio还支持序列帧动画编辑,让...

    CocoStudio_v0.1.0_ALPHA

    cocos2d-x 的编辑工具 这个是Windows版,进入编辑器后有中文界面 CocoStudio工具集 CocoStudio包含强大的UI编辑、动画编辑、场景编辑等工具 CocoStudio完全免费!

Global site tag (gtag.js) - Google Analytics