CocoStudio基础教程(2)关联程序逻辑与cocoStudio导出文件

1、概述

上篇说到将CocoStudio的导出文件在程序中运行出来,但是并没有用户交互,即点击响应,程序的逻辑判断也都没有。这篇中我们把它们加进去,这样就可以算一个完整的程序了。

2、界面编辑

大部分界面编辑都在CocoStudio中完成,现在我们要做的工作是将所需要交互控件的Tag记下来,这样我们可以通过Tag找到这个控件。将Tag整理后我将其记录到一个.h文件中这样在工程中就可以使用了,例如:

const int UI_BUTTON_CLEAR = 8;
const int UI_BUTTON_START = 9;
const int UI_SLIDER_SPEED = 10;
const int UI_LOADINGBAR_LOADING = 3;
const int UI_LABELATLAS_LIFENUM = 7; 

3、程序关联

关联的核心在于设置响应函数、读取与改变控件状态。

1、响应函数的设置

按钮是要有响应函数的,由于它是UIWidget的一个子类,所以采用的是TouchEvent的回调方式。

//定义
void touchButton(Object* obj,cocos2d::extension::TouchEventType eventType);  

//挂载
UIButton* startBtn = dynamic_cast<UIButton*>(m_layout->getChildByTag(UI_BUTTON_START));
startBtn->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));  

UIButton* pauseBtn = dynamic_cast<UIButton*>(m_layout->getChildByTag(UI_BUTTON_CLEAR));
pauseBtn->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));  

//实现
void HelloWorld::touchButton(Object* obj,TouchEventType eventType)
{
    auto button = dynamic_cast<UIButton*>(obj);
    int tag = button->getTag();
    switch(eventType)
    {
    case TouchEventType::TOUCH_EVENT_ENDED:
        if(tag == UI_BUTTON_START)
        {
            changeRunning();
        }
        else
        {
            clearRunning();
        }
    }
} 

值得注意的是这个场景中有两个按钮,我们可以采用Tag来进行区分。

2、控件的读取与更改

对于进度条和数字,我们需要做的是读取它的状态,并对它进行改变。在这个例子中我们需要在schedule的回调函数中做。Schedule的相关知识比较简单,此处不做讨论,有兴趣的同学可查阅其他资料。

void HelloWorld::runningSchedule(float dt)
{
    int speed = dynamic_cast<UISlider*>(m_layout->getChildByTag(UI_SLIDER_SPEED))->getPercent();
    auto loadingBar = dynamic_cast<UILoadingBar*>(m_layout->getChildByTag(UI_LOADINGBAR_LOADING));
    int prc = loadingBar->getPercent() + speed / 15;
    if(prc > 100)
    {
        prc = 1;
    }
    loadingBar->setPercent(prc);  

    auto numLabel = dynamic_cast<UILabelAtlas*>(m_layout->getChildByTag(UI_LABELATLAS_LIFENUM));
    int num = atoi(numLabel->getStringValue());
    num++;
    char buff[100];
    sprintf_s(buff,"%d",num);
    numLabel->setStringValue(buff);  

}  

void HelloWorld::clearRunning()
{
    if(m_isRunning)
    {
        changeRunning();
    }  

    dynamic_cast<UILabelAtlas*>(m_layout->getChildByTag(UI_LABELATLAS_LIFENUM))->setStringValue("1");
    dynamic_cast<UILoadingBar*>(m_layout->getChildByTag(UI_LOADINGBAR_LOADING))->setPercent(1);
    dynamic_cast<UISlider*>(m_layout->getChildByTag(UI_SLIDER_SPEED))->setPercent(1);
}
void HelloWorld::changeRunning()
{
    if(m_isRunning)
    {
        //pause
        this->unschedule(schedule_selector(HelloWorld::runningSchedule));
        m_isRunning = false;
        UIButton* button = dynamic_cast<UIButton*>(m_layout->getChildByTag(UI_BUTTON_START));
        button->setTitleText("运行");
    }
    else
    {
        //start
        this->schedule(schedule_selector(HelloWorld::runningSchedule));
        m_isRunning = true;
        UIButton* button = dynamic_cast<UIButton*>(m_layout->getChildByTag(UI_BUTTON_START));
        button->setTitleText("暂停");
    }
}  

4、总结

通过建立一个Tag的索引表来找到UI中的控件资源,然后取到对其进行操作。这其中可能会有的问题是,如果多个UI控件被加载Tag可能会重复,大家要注意这点。希望cocoStudio在未来的版本中能够将Tag索引表导出成资源的.h文件。

时间: 2024-10-06 10:29:47

CocoStudio基础教程(2)关联程序逻辑与cocoStudio导出文件的相关文章

CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件

1.概述 我们有了UI交互.有了动画人物.有了物理模拟,还差最后一步——将这些元素融合起来.这就要用到cocoStudio中的场景编辑器了.这次我们要将先前我们做过的所有东西都放到一个场景中去.这项工程比看起来是要简单. 2.创建场景 运行CocoStudio,选择SceneEditor.进入后创建一个新的工程:MyScene.然后找到先前我们制作的UI部分的导出资源.动画部分的导出资源,将其复制到这个场景工程的Resource文件夹下. 资源准备完成,我们就可以开始制作场景了.制作比较简单,就

CocoStudio基础教程(1)创建UI并载入到程序中

1.概述 CocoStudio的使用无疑是cocos2d-x 3.0的重要组成部分,接下来我们用它来创建一组UI,并将其读入到程序中显示出来.先上效果图: 2.导出 在导出之前,最好先创建一个新的工程.运行我们的脚本文件,给新工程起名为:HelloStudio.编译运行,保证它没问题. 回到CocoStudio中,点选 文件 –> 导出项目 .在导出资源的位置,选择“导出使用大图”.同时将目录改为我们项目文件的Resource目录. 4.加载到程序中 bool HelloWorld::init(

python入门基础教程04 Python程序基本组成

Python程序基本组成 Python和其他高级语言一样,几乎都是首先从某些地方接收一些数据(如键盘或文件或者赋值),接着对数据进行必要的处理,之后把处理的结果传到某个地方去(输出到文件.数据库或者打印到屏幕上). Python程序基本架构如下: 程序初始化部分 程序数据的输入部分 程序数据的处理部分 程序数据的输出部分 程序结束部分 数据输出 在Python语言里可以通过print函数实现数据的输出操作,print 函数的语法结构如下所示. Python在执行print语句时,首先是计算一下p

【Hadoop基础教程】7、Hadoop之一对多关联查询

我们都知道一个地址拥有着多家公司,本案例将通过两种类型输入文件:address类(地址)和company类(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star)的关联信息. 开发环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.hadoop-1.2.1 1. Map过程 首先使用默认的TextInputFormat类对输入文件进行

【Hadoop基础教程】8、Hadoop之一对多关联查询

我们都知道一个地址拥有着多家公司,本案例将通过两种类型输入文件:address类(地址)和company类(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star)的关联信息. 开发环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.hadoop-1.2.1 1. Map过程 首先使用默认的TextInputFormat类对输入文件进行

Android程序开发0基础教程(一)

程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统,内核为Linux. 作为开发人员,我们所关心的是这个平台的架构以及所支持的开发语言.以下是这个平台的架构模型: 这个平台有下面功能: + Application framework: 可重用的和可替换的组件部分,在这个层面上,全部的软件都是平等的. + Dalvik virtul machine:

《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)

曾攀老师的<有限元分析基础教程>第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解.但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如已经知道了杆单元的起点和终点坐标,仍然需要另外给出单元局部坐标与整体坐标的夹角,这完全没必要.于是我就用Python重构了这段程序,当然并不是把书中的MATLAB代码翻译成python(事实上完全可以这么干,而且很快!).比如我使用了面向对象的思想,把杆单元写成了一个类,这样思路比较清晰. #! /usr/b

iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序

iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序 程序是为了实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.本章将以编写第一个Sprite Kit程序为主线,为开发者讲解什么是Sprite Kit.苹果账号的注册.Xcode的下载和安装.编写程序.调试等内容.选自iOS游戏框架Sprite Kit基础教程Swift版上册大学霸 1.1  Sprite Kit介绍 从iOS 7开始添加了Sprite Kit.本节将为开发者讲解什么是Sprite Ki

Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这次既然学习了Python这个小练习当然不能放过(其实这个加密程序我用c++,java都写过可以说也算比较熟了).加密原理就是循环读取文件每个字节,然后进行相应的加密运算后就是加密操作了,解密时候进行逆运算就是解密操作了. 比如我们读取文件的第一个字节数据是20(读取出来的每位数据为0~255,因为8