1.我用最新的2.3的cocostudio摆了个简单的界面:


继承关系(名字比较乱没改):


2.在cocos2dx lua程序中使用

【加载界面】

用cocostudio导出为csb文件,放到资源目录去,添加该ui代码如下:

-- load csb
local node = cc.csloader:createNode('Test.csb')
layer:addChild(node)

【按钮Button】

cocos3.x的版本比较强调用事件来传递消息,减少模块间的耦合。这里gui的处理也基本时给要处理的控件添加事件侦听。

-- btn
local btn = node:getChildByName('btn_ok')
btn:addTouchEventListener(function(sender,state)
    -- 2
    if state == ccui.TouchEventType.ended then
        print('on btn ok')
    end    
end)

【进度条LoadingBar和复选框CheckBox】
-- loading bar
local loading = node:getChildByName('LoadingBar_1')

-- checkBox
local chk = node:getChildByName('CheckBox_1')
chk:addEventListener(function (sender,type)
    -- 0
    if type == ccui.CheckBoxEventType.selected then
        -- sel
        print('sel')
        loading:setPercent(50)
    else
        -- unsel
        print('unsel')
        loading:setPercent(0)
    end
end)

【列表控件ListView】

容器有好几个,ScrollView和PageView都比较容易,这里说下ListView。

ListView可以设置列表项的模型,设置了后可以轻松的克隆多个。他的用处就是美术可以在编辑器里把模板编辑好,程序拿来克隆就行了。如果有多种类型,美术就多摆几个,程序搭框架的时候封装一层设置模型的逻辑来选择用哪个模板,这样也可以实现不同的列表项。具体后面有空可以写些例子。

下面设置模板并创建多个:

-- set item model
local item = list:getChildByName('Image_item')
list:setItemmodel(item)
list:removeAllChildren()

for i = 1,10 do
    list:pushBackDefaultItem()
end
我这里的模板是在编辑器里放在listview下的,设置完就移除了(注意移除要用listview来remove,不要removeFromParent)。此时的运行效果如下:


下面我们想要相应按钮按下:

list:addEventListener(function (sender,type)
    -- 0
    if type == ccui.ListViewEventType.ONSELECTEDITEM_START then
        -- sel
        print("select child index = ",sender:getCurSelectedindex())        
        loading:setPercent(50)
    else
        -- unsel
        print('unsel')
        loading:setPercent(0)
    end
end)
当按钮刚按下(其实是其touchBegan的时候)的时候是start事件,抬起的时候(即touchEnded)是end事件。这时你会问为何添加的是list的事件,却能在按钮按下的时候收到消息。这是因为他们的基类Widget和ListView做了一些事情。

Widget会在touchBegan之类的触摸处理里向父亲传递该事件:

bool Widget::onTouchBegan(Touch *touch,Event *unusedEvent)
{
    _hitted = false;
    if (isVisible() && isEnabled() && isAncestorsEnabled() && isAncestorsVisible(this) )
    {
        _touchBeganPosition = touch->getLocation();
        if(hitTest(_touchBeganPosition) && isClippingParentContainsPoint(_touchBeganPosition))
        {
            _hitted = true;
        }
    }
    if (!_hitted)
    {
        return false;
    }
    setHighlighted(true);

    /*
     * Propagate touch events to its parents
     */
    if (_propagatetouchEvents)
    {
        this->propagatetouchEvent(TouchEventType::BEGAN,this,touch);
    }

    pushDownEvent();
    return true;
}

void Widget::interceptTouchEvent(cocos2d::ui::Widget::TouchEventType event,cocos2d::ui::Widget *sender,Touch *touch)
{
    Widget* widgetParent = getWidgetParent();
    if (widgetParent)
    {
        widgetParent->interceptTouchEvent(event,sender,touch);
    }

}
这样当一个widget被触摸的时候,他的祖先们都会(有机会)得知他的某个后辈被触摸了。所以这里按钮按下时,listview能收到该事件并处理:
void ListView::interceptTouchEvent(TouchEventType event,Widget *sender,Touch* touch)
{
    ScrollView::interceptTouchEvent(event,touch);
    if (event != TouchEventType::MOVED)
    {
        Widget* parent = sender;
        while (parent)
        {
            if (parent && parent->getParent() == _innerContainer)
            {
                _curSelectedindex = getIndex(parent);
                break;
            }
            parent = dynamic_cast<Widget*>(parent->getParent());
        }
        if (sender->isHighlighted()) {
            selectedItemEvent(event);
        }
    }
}

void ListView::selectedItemEvent(TouchEventType event)
{
    this->retain();
    switch (event)
    {
        case TouchEventType::BEGAN:
        {
            if (_listViewEventListener && _listViewEventSelector)
            {
                (_listViewEventListener->*_listViewEventSelector)(this,LISTVIEW_ONSELECTEDITEM_START);
            }
            if (_eventCallback) {
                _eventCallback(this,EventType::ON_SELECTED_ITEM_START);
            }
            if (_ccEventCallback)
            {
                _ccEventCallback(this,static_cast<int>(EventType::ON_SELECTED_ITEM_START));
            }
        }
        break;
        default:
        {
            if (_listViewEventListener && _listViewEventSelector)
            {
                (_listViewEventListener->*_listViewEventSelector)(this,LISTVIEW_ONSELECTEDITEM_END);
            }
            if (_eventCallback) {
                _eventCallback(this,EventType::ON_SELECTED_ITEM_END);
            }
            if (_ccEventCallback)
            {
                _ccEventCallback(this,static_cast<int>(EventType::ON_SELECTED_ITEM_END));
            }
        }
        break;
    }
    this->release();
}
这样的结果就是只要某个item下的某个按钮被触摸了listview就会收到,所以问题也来了,如果有多个按钮怎么办?上面listview的事件参数只有this(是listview指针)和事件类型,没法知道是哪个按钮被按下了。通过curSel只能得知是哪个item被按下了,需要区分是item下的哪个按钮被按下了,则最好给按钮添加事件处理。

你担心按钮多懒得添加,那么我们就使用模板呗,给模板加事件处理,通过模板克隆的列表项也会有该处理的。将下面这段lua代码添加到设置模板之前:

-- set item callback: we can just add event to model,and diff from curSel
local item0 = list:getItem(0)
local btn_0 = item0:getChildByName('Button_2')
btn_0:addTouchEventListener(function(sender,state)
    if state == 2 then
        print('on btn test 0')
    end    
end)
这样就能给每个列表项的按钮添加事件并响应了。所以listview的触摸事件只能用于1个按钮的情况吧(不知后面是否会在事件里加入按钮的参数),多个按钮的话给模板里的该按钮加就行。

cocos2dx——cocostudio界面的使用详解的更多相关文章

  1. ios – 在React Native中设置ListView的高度

    我需要设置ListView的宽度和高度.当设置宽度按预期工作时,设置高度无效,ListView总是伸展到屏幕的几乎底部.我用这种方式在render方法中创建ListView:这是它的风格:我还尝试通过此命令在方法中设置其高度:当我尝试使用此命令设置宽度时,它可以工作.但设定高度什么都不做.如何将ListView的高度设置为所需的值?

  2. Android ListView中的弹出菜单问题

    )方法并把方法在您的适配器类中.注意:act是在创建构造函数适配器时必须绑定的Activity,例如:在Activity中,您可以编写代码:

  3. android – 在listview中添加viewpager作为滚动标题

    我试图在列表标题中添加Viewpager(使用支持库4),但它没有显示任何内容.这是我的代码请帮忙.它将在列表标题中不作为项目,因此它不应该是一个问题.解决方法listadapter之后的listview页眉和页脚显示.如果你尝试setadapter,并且看不到viewpager.检查viewpager的宽度和高度.如果viewpager的宽度或高度值为0.在viewgroup中创建LienarL

  4. android – Listview滚动错误5.1

    刚注意到ListView中一个非常奇怪的错误,似乎只能重现5.1,我真的很想知道没有人提起它.很容易重现:查找具有足够项目的ListView,滚动到列表的3/4,现在快速向上滚动,您会注意到ListView滚动一直到底部!现在IMO这是一个非常严重的错误,我想尽快找到解决方法/修复,所以任何人都有一个?更新:ListView.java没有从SDK21更改,但AbsListView.java没有.解决方法您可以使用回收站视图而不是列表视图,因为Google可能不再支持它.试试YouTube上的幻灯片视频.它

  5. android – 在ListView中禁用项目焦点

    当我点击它时,如何从ListView中的Item禁用焦点,以便没有关注点击?解决方法以下是禁用ListView焦点的答案.在适配器中覆盖isEnabled方法并返回false.

  6. Android – 从ListView中删除项目时的动画

    我在一个活动中有一个ListView.在每个列表项中都有一个文本和一个CheckBox.单击CheckBox,我想从ListView中删除该项目,并希望添加一个动画,如向下滑动或淡出,然后删除.有帮助吗?

  7. android – 如何在ListView中正确使用TextSwitcher?

    ),然后播放动画.text2到text1的更改正确发生.我的理解原因如下–在显示text2之前,itemTime的所有视图都被删除,因此它被重新创建,这就是为什么一些其他值被显示为秒的原因.但为什么它显示其他记录的价值呢?

  8. android – 带复选框的ListView项目 – 如何删除复选框涟漪效应?

    我有一个带有项目的ListView包含一个复选框和一些其他元素.问题是,当我点击Android5设备上的列表项时,我看起来像这样:我不希望在复选框周围产生涟漪效应.我怎么能实现这一点?

  9. android – 如何在ListView中的同一行放置多个项目?

    我有一个链接到自定义适配器的项目的ArrayList.这些项目按字母顺序排列.我希望我的ListView在ListView的每一行上最多有四个项目,并按字母顺序分隔行.例如:[嗨][医院][酒店][热点][屋][不可能][不大可能]因此,多个项目将位于ListView的同一行.有没有办法在自定义Adapter类的getView()方法中使用位置变量来实现这一目的?如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. android – 允许用户选择SD卡上的文件夹

    我正在寻找一种方法,允许用户按下按钮浏览SD卡的内容,然后选择一个文件夹,其路径将返回给应用程序.类似于在Windows上启动“浏览…”

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部