• 感觉4个人开发游戏真的很累,游戏为了脱颖出更加真实的效果还使用了物理引擎,在老大的同意的情况下,我共享cocos2d自己写的一些大家比较常用的,因为cocos2d有些控件不怎么好用或者没有,反正我觉得是这样的。...
  • cocos2d-x Button控件总结

    2013-03-14 23:30:16
    CCMenu这是一个抽象的东西,容纳菜单项...Button::ButtonTest(void) { //设置字体大小 CCMenuItemFont::setFontSize( 30 ); //根据名字设置字体  CCMenuItemFont::setFontName("Courier New"); //设置能点击
    CCMenu这是一个抽象的东西,容纳菜单项CCMenuItem的容器
    
    CCMenuItem继承图:
    Button::ButtonTest(void)
    {
    //设置字体大小
    CCMenuItemFont::setFontSize( 30 );
    //根据名字设置字体
        CCMenuItemFont::setFontName("Courier New");
    //设置能点击
        setTouchEnabled(true);
        // Font Item
       
    //参数说明:第一个图片名字,第二参数截图menuitemsprite.png的一个对象(x,y,w,h),说明此处的x,y为图片的坐标喔~
        CCSprite* spriteNormal = CCSprite::create("menuitemsprite.png", CCRectMake(0,23*2,115,23));
        CCSprite* spriteSelected = CCSprite::create("menuitemsprite.png", CCRectMake(0,23*1,115,23));
        CCSprite* spriteDisabled = CCSprite::create("menuitemsprite.png", CCRectMake(0,23*0,115,23));
    //创建一个CCMenuItemSprite,参数:添加三种状态CCSprite,添加item1的节点,注册返回监听
        CCMenuItemSprite* item1 = CCMenuItemSprite::create(spriteNormal, spriteSelected, spriteDisabled, this, menu_selector(MenuTestLayer::menuCallback) );
       
        // 创建一个CCMenuItemImage,参数:同上
    CCMenuItem* item2 = CCMenuItemImage::create("SendScoreButton.png", "SendScoreButtonPressed.png", this, menu_selector(MenuTestLayer::menuCallback2) );
        // 创建一个CCLabelAtlas标签(Atlas一般是指图片集合),参数:内容(图片资源中存在,如果不存在,不显示),图片,宽,高
        CCLabelAtlas* labelAtlas = CCLabelAtlas::create("0123456789", "fonts/labelatlas.png", 16, 24, '.');
    //创建一个CCMenuItemLebel标签
        CCMenuItemLabel* item3 = CCMenuItemLabel::create(labelAtlas, this, menu_selector(MenuTestLayer::menuCallbackDisabled) );
        item3->setDisabledColor( ccc3(32,32,64) );//设置不能点击的颜色(一般采用灰色)
        item3->setColor( ccc3(200,200,255) );//设置item3标签颜色
       
        // 创建一个CCMenuItemFont
        CCMenuItemFont *item4 = CCMenuItemFont::create("I toggle enable items", this, menu_selector(MenuTestLayer::menuCallbackEnable) );
        item4->setFontSizeObj(20);
        item4->setFontName("Marker Felt");
       
        // 创建一个CCLabelBMFont标签,参数:内容,字体配置fnt文件
        CCLabelBMFont* label = CCLabelBMFont::create("configuration", "fonts/bitmapFontTest3.fnt");
        CCMenuItemLabel* item5 = CCMenuItemLabel::create(label, this, menu_selector(MenuTestLayer::menuCallbackConfig));
        item5->setScale( 0.8f );
        // 创建一个CCMenuItemFont
        CCMenuItemFont::setFontName("Marker Felt");
        CCMenuItemFont *item6 = CCMenuItemFont::create("Priority Test", this, menu_selector(MenuTestLayer::menuCallbackPriorityTest));
        // 创建一个CCMenuItemFont
        CCMenuItemFont* item7 = CCMenuItemFont::create("Quit", this, menu_selector(MenuTestLayer::onQuit));
        //为CCMenuItemFon添加一个颜色循环变化动画....item7也是父类CCNode的子类,自然也可以添加动画啦
        CCActionInterval* color_action = CCTintBy::create(0.5f, 0, -255, -255);
        CCActionInterval* color_back = color_action->reverse();
        CCFiniteTimeAction* seq = CCSequence::create(color_action, color_back, NULL);
        item7->runAction(CCRepeatForever::create((CCActionInterval*)seq));
    //创建CCMenu菜单,其他可认为是菜单项
        CCMenu* menu = CCMenu::create( item1, item2, item3, item4, item5, item6, item7, NULL);
        menu->alignItemsVertically();//可以理解为设置成垂直排列
    //menu->alignItemsHorizontally();//水平排列
       
        // elastic effect
        CCSize s = CCDirector::sharedDirector()->getWinSize();
       
        int i=0;
        CCNode* child;
        CCArray * pArray = menu->getChildren();
        CCObject* pObject = NULL;
    //将pArray里面的对象转成CCObject对象,原因获得坐标等信息
        CCARRAY_FOREACH(pArray, pObject)
        {
            if(pObject == NULL)
                break;
            child = (CCNode*)pObject;
            CCPoint dstPoint = child->getPosition();
            int offset = (int) (s.width/2 + 50);
            if( i % 2 == 0)
                offset = -offset;
           
            child->setPosition( CCPointMake( dstPoint.x + offset, dstPoint.y) );
            child->runAction( CCEaseElasticOut::create( CCMoveBy::create(2, CCPointMake(dstPoint.x - offset,0)), 0.35f) );
            i++;
        }
        m_disabledItem = item3; item3->retain();
        m_disabledItem->setEnabled( false );
        addChild(menu);
        menu->setPosition(ccp(s.width/2, s.height/2));
    }
    展开全文
  • cocos2d框架介绍

    2011-09-13 10:54:29
    cocos2d引擎 2.0 cocos2d简介 Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andriod三个平

    cocos2d引擎

    2.0 cocos2d简介

    Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andriod三个平台上运行.最新的版本是1.0.0,该引擎C++的版本还引入了lua脚本系统.cocos2d是完全开源的引擎,开发者可以任意使用该代码而不用公开源代码.cocos2d被广泛的使用,其中包括Zynga,南宫梦等知名游戏公司.Cocos2d不仅仅只是一个2D图形引擎库,他还提供了一些对游戏逻辑支持的系统.cocos2d提供了一个简单的声音引擎,支持播放mp3,wave,ogg等文件格式的音乐.cocos2d可以和物理引擎box2d配合使用,实现碰撞等物理效果.cocos2d引擎的结构清晰,文档和实例比较丰富.易学易用.

    2.1 cocos2d 基本结构

    Cocos2d采用场景树结构来管理游戏对象,把一个游戏划分为不同的场景,场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏对象.游戏对象又可以执行Action来修改其属性.每一个时刻都有一个场景在独立运行,通过切换不同的场景来完成一个游戏流程.cocos2d还采用了引用计数的方式来管理内存,基本上所有的类都派生于拥有引用计数的机制的CCObject.其基本框架类图如下: 

    a.      CCApplication,负责平台相关的初始化,消息处理等,是一个单件类

    b.      CCDirector,主要职责是管理场景和切换场景,游戏暂停等.另外他还负责初始化openes相关的一东西.也是一个单件类

    c.      CCNode,节点类,是游戏中最重要的对象,在cocos2dk中,任何可见的或不可以的游戏逻辑对象都是一个节点,节点有以下特点:

    a)        是一个容器,可以包含任意多个其它节点.

    b)        可以执行一个行为(CCAction)

    c)        可以执行一定时的任务回调

    d)        拥有坐标变换(transform)信息,如postion,scale,rotation等

    e)        由于一个节点可以添加任意个子节点,所有的节点组成一个树状结构,因此父节点的坐标变换会影响子节点在世界坐标系中的坐标,一个节点只能拥有一个父节点

    d.      CCAction,动作类,CCAtion就好像指派给CCNode的命令一样,在特定时间(或立即)内修改CCNode的属性,例如位置,旋转,缩放等

    e.      CCScene,场景类,和PL中的stage类似,游戏场景一般是指在某个时刻能独立运行的部分,包括可见的怪物,地形和不可见的逻辑脚本等.例如一个游戏的一个特定关卡,游戏菜单,过场动画等都是一个独立的场景.cocos2d中的场景又由不同的层(CCLayer)组成.由于CCScene是CCNode的子类,因此可以可以用CCAction来修改其属性

    f.       CCLayer类,场景中的层类,一个场景可以拥有多个层,如HUD层,游戏对象层,背景层,天空层等,层是一个可以绘制的区域.可以将ui,sprite等对象添加到其中.除此之外,层还接收输入消息,可以在层的类中处理输入消息,和CCScene一样,CClayer是CCNode的子类,也可以用CCAction来修改其属性

    2.2资源管理与文件系统

    资源管理可以分为两个方面,一是管理一些原生(Raw)的资源,例如模型,贴图,脚本,字体等.另外一种资源是在游戏运行时分配的游戏对象.他们需要能被快速的访问.一般来说,没有被引用的游戏对象一般不会立即被释放,会先缓存到某个地方.在加载新的场景时.才会被释放.在一些大型的渲染系统中,资源会被分为三个阶段,硬盘,内存,显存资源,分别采用不同的策略和cache机制来管理,cocos2d没有明显的提出资源管理的概念,但使用了一些cache的机制来缓存已经加载了的纹理,frame,animation等.对于运行时分配的游戏对象,cocos2d也提供了一个autorelease的机制,在游戏切换场景时,将会对autorelease的对象进行内存回收.由于cocos2d采用了引用计数的机制.循环引用是一个需要关注的问题.

    对于文件系统,cocos2d封装了一个简单的类CCFileUtils,该类除了能读取普通的文件之外,还可以从zip文件读取文件.该类还读取plist文件生成一个CCDictionary对象.

    2.3 sprite与渲染系统

             Cocos2d的Sprite由Texure,frame,和animation组成,由openes负责渲染主要的类关系如下:


    a.      Sprite 可以看成是某一时刻,一个2d的图片的一个剪辑部分

    b.      frame由texture和一个矩形(quad)组成

    c.      texture代表一个可以被绘制的2维的纹理

    d.      imgae对应硬盘中不同类型的图片,例如jpg,png,tga等.它知道如何从文件中读取不同类型的图片,生成缓冲数据,供texture使用

    e.      CCAnimation由一系列的frame组成,类似于电影的胶片集合

    f.       CCAnimate,动画action,实现在指定时间内在sprite上播放指定的动画(CCAnimation)

    2.3.1 Texture与Image

             Cocos2d中的CCTexture2D用来描述一个2d的纹理,它知道如何将自己绘制到屏幕上.通过该类还可以设置纹理过滤,抗锯齿等参数.该类还提供了一个接口,将字符串创建成纹理.该类所包含的纹理大小必须是2^n.因此纹理的大小不一定就等于图片的大小.CCTexture2D以下成员:

    a.      name,指向纹理在显存中的地址

    b.      pixelFormat,描述纹理的格式,例如RGBA888,或RGB565等

    c.      pixelWidth,pixelHeight,纹理的宽高

    d.      maxS,maxT,纹理的最大坐标

    既然已经有了CCTexture2D这样的类纹理的渲染,那么还需要Imgae类做什么呢?因为图片的格式多样,不同的格式,不同平台下有不同的加载方法,因此cocos2d使用了一个CCImage类封装不同格式的图片在不同平台下的加载.如果说CCImage中的buffer对应的是内在资源,那么CCTexture2D对应的buffer是显存资源.

    2.3.2 Frame与Animation

             上面讲过,Frame保存了一个纹理和矩形,在cocos2d中,一般都会给frame起个名字,以字典的形式保存在CCSpriteFrameCache中,方便随时读取.CCSpriteFrameCache支持从plist(类似于xml)文件读取图片,根据文件生成一系列的frame,并且给每个frame都生成一个名字. plist的文件可以使用很多第三方工具生成,例如Zwoptex(http://zwoptexapp.com/),TexturePacker(http://code-and-web.de/texturepacker);

    CCAnimation类用来在CCspreite对象上实现动画.他保存了一系列的frame.和frame之间的延时.可以通过使用CCAnimationaction来在sprite上播放一个动画.

    2.3.3 渲染流程

             由于cocos2d只处理2d图形,渲染采用了固定流水线的方式.当时也可以直接使用openes的函数来完成一些高级的特效.和渲染相关的类有CCTexutre2D,CCTexutreAtlas, CCSprite,CCRenderTexture,CCRenderTexture支持将数据渲染到纹理上.另外CCNode还一个相机类,但一般情况都不使用.只有在实现一些3D特效的时候,才使用相机的一些特性.

    2.4 粒子系统

    Cocos2d支持两种类型的粒子系统,点状(CCParticleSystemPoint)和方形(CCParticleQuadSsytem)粒子系统,Quad类型的系统支持一些额外的特性

    a.      可以旋转

    b.      可以是任何大小的,而point的尺寸不能超过64

    c.      Quad类型的粒子系统可以被整体缩放

    d.      Quad类型的粒子系统比Point粒子系统消耗更多的内存和显存

    粒子系统还支持从plist文件中读取数据,plist文件可以通过第三方工具生成,例如ParticleDesigner(http://particledesigner.71squared.com/),和ParticleMint

    2.5 UI与字体

             Cocos2d中只有简单的ui实现,支持button,label,toggle三种类型的ui,另外还支持简单的文本输入框(TextField).类关系图如下:


    a.      CCMenu从CClayer派生而来,可以处理输入消息,CCMenu包含多个CCMenuItem对象,在接收到输入消息之后,根据触摸位置,将输入消息分发到相应MenuItem,执行回调函数

    b.      CCMenu还提供一个对齐菜单项的接口

    c.      CCMenuItem 菜单项的基类,目前cocos2d只从CCMenuItem派生了CCMenuItemLabel,CCMenuItemSprite,CCMenuToggle三个类.当然也可以派生新的类,实现其它的菜单项,例如checkbox等.

     

    Cocos2d支持两种类型的字体,一种是平台相关的TTF字体,另外一种是平台无关的美术字体,该类型字体可以通过字体编辑器(例如http://glyphdesigner.71squared.com/)自己来定义形状和大小,使用起来和sprite差不多,比较方便.

    2.6 简单的TileMap

             Cocos2d支持的是一种TMX(TileMap XML)格式的地图,该地图可以由TileMapEditor生成(http://www.mapeditor.org/),TMX地图有以下特点

    a.      支持正交(orthogonal),六边形(hexagonal),45度等距(isometric)地图

    b.      支持对象组,对象,和属性

    和地图相关的类如下:


    a.      以上类图是简化后的,实现的类还包含了objectgroup,property,TileSetInfo等

    b.      一个TiledMap拥有多个layer

    c.      一个layer拥有多个tile(用sprite来表示)

    d.      由于每个tile都被看作一个sprite对象,因此每个tile可以被独立的,移动,旋转,缩放甚至执行action等.

    e.      layer保存了一个对应于tileid的二维数组,只有在需要的时候才会根据tile id 创建相应的tile(sprite),这样可以既可以节省存储空间,也可以提高渲染效率.

    f.       Tile可以在运行时被添加和删除

    g.      http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps网页上有关于tileMap使用的详细教程

    2.7 游戏逻辑的支持

             前面已经讲过Cocos2d不仅仅只是一个2D渲染引擎,它还提供了一个支持游戏逻辑的系统,首先所有可见的对象,场景和layer都以场景树的数据结构来保存,对root(一般都是scene)执行的操作都会影响root的孩子节点.如果root被缩放或者平移,那么root的所有孩子节点也会被缩放和平移.所有的节点类(CCNode)都继承了一个接口 SelectorProtocol,该接口有一系列的回调函数,在特定的条件下回调来完成相应的逻辑处理.其中最基本也是最重要的是与schedule相关的回调接口.下面将介绍一下schedule任务系统

    2.7.0 Schedule系统

             Scheule系统也叫任务系统或者事件系统,任务指一个时间片内定时发生的事件.在cocos2d中的CCNode可以订制一个计划任务.通过回调函数来完成一个特定的逻辑.相关的类图如下


    a.      CCSchedule可以将selectorProtocol接口对象添加到任务列表中.

    b.      CCTimer每一帧都检查对应的任务是否达到执行时间点,如果达到则执行回调函数.

    c.      CCNode派生于SelecotrProtocol,根据需要重载实现回调函数,实现相应的逻辑

    2.7.1 Action介绍

             Action就像一些可以被执行的命令,通常情况下,一个action会修改一个CCNode对象的一些属性,让一个CCNode对象执行一些动作,例如改变其的位置,朝向.让一个Sprite播放动画等.如果这个action是在一定时间段内完成的,我们称它为IntervalAction,如果是立即执行的,我们称它为InstantAction.例如CCMoveBy在一定时间段内将一个CCNode对象移动一定的距离.因此它是IntervalAction的子类.而CCCallFunc实现立即执行一个架回调函数.因此它是InstantAction的子类.

             Action的设计采用了组合模式和装饰模式,可以将一系列的action组合起来,让CCNodec对象执行,就像给CCNode下达一系列的命令一样.例如以下代码

            

    CCActionInterval* move =CCMoveBy::actionWithDuration(0.5f, ccp(0,160));

             CCActionInterval*rotate = CCRotateBy::actionWithDuration(2, 360);

             CCActionInterval*scale = CCScaleBy::actionWithDuration(2, 5);

             CCActionInterval*opacity = CCFadeOut::actionWithDuration(2);

             CCActionInterval*fadein = CCFadeIn::actionWithDuration(2);

                      CCActionInterval* scaleback =CCScaleTo::actionWithDuration(1, 1);

    CCFiniteTimeAction*seq0 = CCSequence::actions(move, rotate, scale, opacity, fadein, scaleback,NULL);

    Actor->runAction(seq0);

             该代码解释如下:

    a.      Actor在0.5秒之内向y方向移动160个单位,

    b.      让actor在2秒内,旋转360度

    c.      将actor2秒内放大5倍

    d.      2秒内淡出

    e.      2秒内淡入

    f.       1秒之内缩放到原始大小

    2.8 网络支持

             Cocos2d没有提供专门的网络库

    2.9 脚本支持

             Cocos2dX最近的版本提供了lua脚本支持,在1.1.0版本结合了tolua++,基本上将所有类的成员函数都导出到脚本中.除此之外,还增加了一些脚本回调函数,例如菜单的消息处理可以通过执行一段脚本来完成.也可以添加计划任务来回调脚本函数.cocos2d中虽然有一个简单的实例来说明如何使用lua,但具体的效率如何还待进一步验证

    2.10 声音引擎支持

             Cocos2d使用了一个简单的声音引擎,支持Wav,mp3,ogg,caf格式音频文件播放.但该引擎没有提供音量设置

    2.11 物理引擎支持

             Cocos2d可以和box2d,chipmunk物理引擎结合在一起,实现碰撞,重力等物理效果模拟.在代码的实例中,有大量与box2d和chipmunk结合的实例,可以供学习和研究使用.

    2.12 cocos2d的缺点

             Cocs2d不但是处理了2D渲染,还将整个渲染系统和游戏逻辑紧密的耦合在一起,因此在使用coco2d渲染时,不得不使用他的整个逻辑相关的代码.因此很难在使用其渲染库的同时又自己设计一套逻辑框架.对于一些小型游戏来说,可以使用其可以进行快速的迭代和开发.但对于一些大型游戏,为了使用系统运行更稳定,结构更清晰.更易于扩展,一般都会将各个模块独立开来.以方便不同的人员分工开发和维护.

    展开全文
  • Cocos2d-x button控件

    2015-04-18 11:17:14
    #include "editor-support/cocostudio/CCSGUIReader.h"#include "cocostudio/CocoStudio.h"#include "ui/CocosGUI.h"using namespace cocos2d::ui;using namespace cocostudio;   上面就是比较完整...


    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::moveToRight));
    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. }
    展开全文
  • UIButton公有属性、方法 /** * 创建一个UIButton实例 * @param normalImage 默认状态时的图片 ... * @param disableImage 禁用状态时的图片 * @param texType 图片类型(Local、Plist) * @return UIButton实例...

    UIButton公有属性、方法

    /**
     * 创建一个UIButton实例
     * @param normalImage   默认状态时的图片
     * @param selectedImage 点击状态时的图片
     * @param disableImage  禁用状态时的图片
     * @param texType       图片类型(Local、Plist)
     * @return UIButton实例
     */
    static Button* create(const std::string& normalImage,
                          const std::string& selectedImage = "",
                          const std::string& disableImage = "",
                          TextureResType texType = TextureResType::LOCAL);
    
    /**
     * 加载UIbutton图片
     * @param normal    默认状态时的图片
     * @param selected  点击状态时的图片
     * @param disabled  禁用状态时的图片
     * @param texType   图片类型(Local、Plist)
     */
    void loadTextures(const std::string& normal,
                      const std::string& selected,
                      const std::string& disabled = "",
                      TextureResType texType = TextureResType::LOCAL);
    
    /**
     * 加载UIbutton默认状态下的图片
     * @param normal    图片
     * @param texType   图片类型(Local、Plist)
     */
    void loadTextureNormal(const std::string& normal, TextureResType texType = TextureResType::LOCAL);
    
    /**
     * 加载UIbutton点击状态下的图片
     * @param selected   图片
     * @param texType    图片类型(Local、Plist)
     */
    void loadTexturePressed(const std::string& selected, TextureResType texType = TextureResType::LOCAL);
    
    /**
     * 加载UIbutton禁用状态下的图片
     * @param disabled   图片
     * @param texType    图片类型(Local、Plist)
     */
    void loadTextureDisabled(const std::string& disabled, TextureResType texType = TextureResType::LOCAL);
    
    /**
     * 设置九宫格拉伸范围
     * 只有在调用setScale9Enabled(true)时,capInset才会影响所有按钮的scale9渲染器
     * @param capInsets 拉伸范围
     */
    void setCapInsets(const Rect &capInsets);
    
    /**
     * 设置默认状态下的capInsets 
     * @param capInsets 拉伸范围
     */
    void setCapInsetsNormalRenderer(const Rect &capInsets);
    
    /**
     * 获取默认状态下的capInsets
     * @return 拉伸范围
     */
    const Rect& getCapInsetsNormalRenderer()const;
    
    /**
     * 设置点击状态下的capInsets 
     * @param capInsets 拉伸范围
     */
    void setCapInsetsPressedRenderer(const Rect &capInsets);
    
    /**
     * 获取点击状态下的capInsets
     * @return 拉伸范围
     */
    const Rect& getCapInsetsPressedRenderer()const;
    
    /**
     * 设置禁用状态下的capInsets 
     * @param capInsets 拉伸范围
     */
    void setCapInsetsDisabledRenderer(const Rect &capInsets);
    
    /**
     * 获取禁用状态下的capInsets
     * @return 拉伸范围
     */
    const Rect& getCapInsetsDisabledRenderer()const;
    
    /**
     * 启用scale9渲染
     * @param 是否启用
     */
    virtual void setScale9Enabled(bool enable);
    
    /**
     * 查询是否启用scale9渲染
     * @return true 或 false
     */
    bool isScale9Enabled()const;
    
    /**
     * 设置UIButton在按下时是否进行缩放
     * @param true 或 false
     */
    void setPressedActionEnabled(bool enabled);
    
    /**
     * 设置UIButton的标题
     * @param text 标题内容
     */
    void setTitleText(const std::string& text);
    
    /**
     * 获取UIbutton的标题
     * @return 标题内容
     */
    const std::string getTitleText() const;
    
    /**
     * 设置UIButton的标题颜色
     * @param color 标题颜色
     */
    void setTitleColor(const Color3B& color);
    
    /**
     * 获取UIButton的标题颜色
     * @return 标题颜色
     */
    Color3B getTitleColor() const;
    
    /**
     * 设置UIButton的标题大小
     * @param size 标题大小
     */
    void setTitleFontSize(float size);
    
    /**
     * 获取UIButton的标题大小
     * @return 标题大小
     */
    float getTitleFontSize() const;
    
    /**
     * 设置UIButton的标题字体
     * @param fontName 字体
     */
    void setTitleFontName(const std::string& fontName);
    
    /**
     * 获取UIButton的标题字体
     * @return 字体
     */
    const std::string getTitleFontName() const;
    
    /**
     * 设置UIButton的标题水平对齐
     * @param hAlignment 水平对齐
     */
    void setTitleAlignment(TextHAlignment hAlignment);
    
    /**
     * 设置UIButton的标题水平对齐、垂直对齐
     * @param hAlignment 水平对齐
     * @param vAlignment 垂直对齐
     */
    void setTitleAlignment(TextHAlignment hAlignment, TextVAlignment vAlignment);
    
    /** 
     * 当用户按下按钮时,按钮将缩放到一个比例。
     * 按钮的最终比例等于(按钮原始比例+ _zoomScale)
     * @param scale 缩放比例
     */
    void setZoomScale(float scale);
    
    /**
     * 返回一个按钮的缩放比例
     * @return 缩放比例
     */
    float getZoomScale()const;
    
    /**
     * 返回默认状态下的九宫格精灵
     * @return 默认状态下的九宫格精灵
     */
    Scale9Sprite* getRendererNormal() const { return _buttonNormalRenderer; }
    
    /**
     * 返回点击状态下的九宫格精灵
     * @return 点击状态下的九宫格精灵
     */
    Scale9Sprite* getRendererClicked() const { return _buttonClickedRenderer; }
    
    /**
     * 返回禁用状态下的九宫格精灵
     * @return 禁用状态下的九宫格精灵
     */
    Scale9Sprite* getRendererDisabled() const { return _buttonDisabledRenderer; }
    

    UIButton 示例

    // 初始化,参数分别是默认状态、按下状态、禁用状态下的图片
    var button = new ccui.Button("", "", "");  
    
    // 锚点
    button.setAnchorPoint(0.5, 0.5);
    
    // 设置图片(正常情况下的图片、点击时的图片、禁用时的图片)
    button.loadTextures("res/a.png", "res/b.png", "res/c.png");
    
    // 位置
    button.setPosition(10, 10);  
    
    // 设置是否伴随点击缩放按钮图片  
    emojiBtn.setPressedActionEnabled(false);
    
    // 按钮标题
    button.setTitleText(emojiList[i]);
    
    // 按钮标题大小
    button.setTitleFontSize(40);
    
    // 按钮标题颜色 两者相同
    button.setTitleColor(cc.color(53,53,53))
    button.setColor(cc.color(0, 0, 0, 255));
    
    // 设置字体样式
    button.setTitleFontName("宋体,微软雅黑");
    
    // 允许按钮穿透(解决在tableView上无法滚动的问题)
    button.setSwallowTouches(false);
    
    // 透明按钮(先设置图片,然后再调用loadTextures,参数传入"")
    var copy_button = new ccui.Button(this.btn_back_img, this.btn_back_img, "", 1);
    copy_button.loadTextures("", "", "");
    
    // 设置按钮回调
    button.addTouchEventListener( function(sender, type) {
        if (type == ccui.Widget.TOUCH_ENDED) {
    
        }
    }.bind(this), this);
    
    this.addChild(button);
    
    展开全文
  • Button API 继承于 Component 模块: cc 按钮组件。可以被按下,或者点击。 按钮可以通过修改 Transition 来设置按钮状态过渡的方式: -Button.Transition.NONE // 不做任何过渡 -Button.Transition.COLOR // ...


    Button   API

    继承于 Component
    模块: cc

    按钮组件。可以被按下,或者点击。

    按钮可以通过修改 Transition 来设置按钮状态过渡的方式:
    -Button.Transition.NONE // 不做任何过渡
    -Button.Transition.COLOR // 进行颜色之间过渡
    -Button.Transition.SPRITE // 进行精灵之间过渡

    按钮可以绑定事件(但是必须要在按钮的 Node 上才能绑定事件):
    // 以下事件可以在全平台上都触发
    -cc.Node.EventType.TOUCH_START // 按下时事件
    -cc.Node.EventType.TOUCH_Move // 按住移动后事件
    -cc.Node.EventType.TOUCH_END // 按下后松开后事件
    -cc.Node.EventType.TOUCH_CANCEL // 按下取消事件
    // 以下事件只在 PC 平台上触发
    -cc.Node.EventType.MOUSE_DOWN // 鼠标按下时事件
    -cc.Node.EventType.MOUSE_MOVE // 鼠标按住移动后事件
    -cc.Node.EventType.MOUSE_ENTER // 鼠标进入目标事件
    -cc.Node.EventType.MOUSE_LEAVE // 鼠标离开目标事件
    -cc.Node.EventType.MOUSE_UP // 鼠标松开事件
    -cc.Node.EventType.MOUSE_WHEEL // 鼠标滚轮事件

    示例:

    // Add an event to the button.
    button.node.on(cc.Node.EventType.TOUCH_START, function (event) {
         cc.log("This is a callback after the trigger event");
    });
    

    属性(properties)

    interactable Boolean

    按钮事件是否被响应,如果为 false,则按钮将被禁用。

    transition Button.Transition

    按钮状态改变时过渡方式。

    normalColor Color

    普通状态下按钮所显示的颜色。

    pressedColor Color

    按下状态时按钮所显示的颜色。

    hoverColor Color

    悬停状态下按钮所显示的颜色。

    disabledColor Color

    禁用状态下按钮所显示的颜色。

    duration Number

    颜色过渡时所需时间

    normalSprite SpriteFrame

    普通状态下按钮所显示的 Sprite 。

    pressedSprite SpriteFrame

    按下状态时按钮所显示的 Sprite 。

    hoverSprite SpriteFrame

    悬停状态下按钮所显示的 Sprite 。

    disabledSprite SpriteFrame

    禁用状态下按钮所显示的 Sprite 。

    target Node

    需要过渡的目标。当前按钮状态改变有:-如果 Transition type 选择 Button.Transition.NONE,按钮不做任何过渡。-如果 Transition type 选择 Button.Transition.COLOR,按钮会对目标颜色进行颜色之间的过渡。-如果 Transition type 选择 Button.Transition.NONE,按钮会对目标 Sprite 进行 Sprite 之间的过渡。

    clickEvents Component.EventHandler[]

    按钮的点击事件列表。

    node Node

    继承自 Component:

    该组件被附加到的节点。组件总会附加到一个节点。

    示例:

    cc.log(comp.node);
    

    uuid StringreadOnly

    继承自 Component:

    组件的 uuid,用于编辑器。

    示例:

    cc.log(comp.uuid);
    

    enabled Boolean

    继承自 Component:

    表示该组件自身是否启用。

    示例:

    comp.enabled = true;
    cc.log(comp.enabled);
    

    enabledInHierarchy BooleanreadOnly

    继承自 Component:

    表示该组件是否被启用并且所在的节点也处于激活状态。。

    示例:

    cc.log(comp.enabledInHierarchy);
    

    _isOnLoadCalled BooleanreadOnly

    继承自 Component:

    onLoad 是否被调用。

    示例:

    cc.log(_isOnLoadCalled);
    

    name String

    该对象的名称。

    示例:

    obj.name = "New Obj";
    

    isValid BooleanreadOnly

    表示该对象是否可用(被销毁后将不可用)。

    示例:

    cc.log(obj.isValid);
    

    方法

    update ( )

    继承自 Component:

    如果该组件启用,则每帧调用 update。

    lateUpdate ( )

    继承自 Component:

    如果该组件启用,则每帧调用 LateUpdate。

    onLoad ( )

    继承自 Component:

    当附加到一个激活的节点上或者其节点第一次激活时候调用。

    start ( )

    继承自 Component:

    如果该组件第一次启用,则在所有组件的 update 之前调用。

    onEnable ( )

    继承自 Component:

    当该组件被启用,并且它的节点也激活时。

    onDisable ( )

    继承自 Component:

    当该组件被禁用或节点变为无效时调用。

    onDestroy ( )

    继承自 Component:

    当该组件被销毁时调用

    onFocusInEditor ( )

    继承自 Component:

    onLostFocusInEditor ( )

    继承自 Component:

    addComponent

    (
    • typeOrTypename
    )
    Component

    继承自 Component:

    向节点添加一个组件类,你还可以通过传入脚本的名称来添加组件。

    名称 类型 描述
    typeOrTypename Function |String

    the constructor or the class name of the component to add

    返回:

    类型: Component

    the newly added component

    示例:

    var sprite = node.addComponent(cc.Sprite);
    var test = node.addComponent("Test");
    

    getComponent

    (
    • typeOrClassName
    )
    Component

    继承自 Component:

    获取节点上指定类型的组件,如果节点有附加指定类型的组件,则返回,如果没有则为空。
    传入参数也可以是脚本的名称。

    名称 类型 描述
    typeOrClassName Function |String  

    返回:

    类型: Component

    示例:

    // get sprite component.
    var sprite = node.getComponent(cc.Sprite);
    // get custom test calss.
    var test = node.getComponent("Test");
    

    getComponents

    (
    • typeOrClassName
    )
    Component[]

    继承自 Component:

    返回节点上指定类型的所有组件。

    名称 类型 描述
    typeOrClassName Function |String  

    返回:

    类型: Component[]

    示例:

    var sprites = node.getComponents(cc.Sprite);
    var tests = node.getComponents("Test");
    

    getComponentInChildren

    (
    • typeOrClassName
    )
    Component

    继承自 Component:

    递归查找所有子节点中第一个匹配指定类型的组件。

    名称 类型 描述
    typeOrClassName Function |String  

    返回:

    类型: Component

    示例:

    var sprite = node.getComponentInChildren(cc.Sprite);
    var Test = node.getComponentInChildren("Test");
    

    getComponentsInChildren

    (
    • typeOrClassName
    )
    Component[]

    继承自 Component:

    递归查找自身或所有子节点中指定类型的组件

    名称 类型 描述
    typeOrClassName Function |String  

    返回:

    类型: Component[]

    示例:

    var sprites = node.getComponentsInChildren(cc.Sprite);
    var tests = node.getComponentsInChildren("Test");
    

    _getLocalBounds

    (
    • out_rect
    )

    继承自 Component:

    如果组件的包围盒与节点不同,您可以实现该方法以提供自定义的轴向对齐的包围盒(AABB),以便编辑器的场景视图可以正确地执行点选测试。

    名称 类型 描述
    out_rect Rect

    the Rect to receive the bounding box

    onRestore ( )

    继承自 Component:

    onRestore 是用户在检查器菜单点击 Reset 时,对此组件执行撤消操作后调用的。

    如果组件包含了“内部状态”(不在 CCClass 属性中定义的临时成员变量),那么你可能需要实现该方法。

    编辑器执行撤销/重做操作时,将调用组件的 get set 来录制和还原组件的状态。然而,在极端的情况下,它可能无法良好运作。
    那么你就应该实现这个方法,手动根据组件的属性同步“内部状态”。一旦你实现这个方法,当用户撤销或重做时,组件的所有 get set 都不会再被调用。这意味着仅仅指定了默认值的属性将被编辑器记录和还原。

    同样的,编辑可能无法在极端情况下正确地重置您的组件。
    于是如果你需要支持组件重置菜单,你需要在该方法中手工同步组件属性到“内部状态”。
    一旦你实现这个方法,组件的所有 get set 都不会在重置操作时被调用。这意味着仅仅指定了默认值的属性将被编辑器重置。
    此方法仅在编辑器下会被调用。

    schedule

    (
    • callback
    • [interval =0]
    • [repeat =cc.macro.REPEAT_FOREVER]
    • [delay =0]
    )

    继承自 Component:

    调度一个自定义的回调函数。
    如果回调函数已调度,那么将不会重复调度它,只会更新时间间隔参数。

    名称 类型 描述
    callback function

    The callback function

    interval optional Number 0

    Tick interval in seconds. 0 means tick every frame. If interval = 0, it's recommended to use scheduleUpdate() instead.

    repeat optional Number cc.macro.REPEAT_FOREVER

    The selector will be executed (repeat + 1) times, you can use kCCRepeatForever for tick infinitely.

    delay optional Number 0

    The amount of time that the first tick will wait before execution.

    示例:

    var timeCallback = function (dt) {
      cc.log("time: " + dt);
    }
    this.schedule(timeCallback, 1);
    

    scheduleOnce

    (
    • callback
    • [delay =0]
    )

    继承自 Component:

    调度一个只运行一次的回调函数,可以指定 0 让回调函数在下一帧立即执行或者在一定的延时之后执行。

    名称 类型 描述
    callback function

    A function wrapped as a selector

    delay optional Number 0

    The amount of time that the first tick will wait before execution.

    示例:

    var timeCallback = function (dt) {
      cc.log("time: " + dt);
    }
    this.scheduleOnce(timeCallback, 2);
    

    unschedule

    (
    • callback_fn
    )

    继承自 Component:

    取消调度一个自定义的回调函数。

    名称 类型 描述
    callback_fn function

    A function wrapped as a selector

    示例:

    this.unschedule(_callback);
    

    unscheduleAllCallbacks ( )

    继承自 Component:

    取消调度所有已调度的回调函数:定制的回调函数以及 'update' 回调函数。动作不受此方法影响。

    示例:

    this.unscheduleAllCallbacks();
    

    destroy ( ) Boolean

    销毁该对象,并释放所有它对其它对象的引用。
    销毁后,CCObject 不再可用。您可以在访问对象之前使用 cc.isValid(obj) 来检查对象是否已被销毁。实际销毁操作会延迟到当前帧渲染前执行。

    返回:

    类型: Boolean

    whether it is the first time the destroy being called

    示例:

    obj.destroy();
     
    

    Button(按钮)组件参考

    Button 组件可以响应用户的点击操作,当用户点击 Button 时,Button 自身会有状态变化。另外,Button 还可以让用户在完成点击操作后响应一个自定义的行为。

    button.png

    button-color

    点击属性检查器下面的添加组件按钮,然后从添加 UI 组件中选择Button,即可添加 Button 组件到节点上。

    按钮的脚本接口请参考Button API

    Button 属性

    属性 功能说明
    interactable 布尔类型,设为 false 时,则 Button 组件进入禁用状态。
    Transition 枚举类型,包括 NONE, COLOR 和 SPRITE。每种类型对应不同的 Transition 设置。详情见Button Transition章节。
    Click Event 列表类型,默认为空,用户添加的每一个事件由节点引用,组件名称和一个响应函数组成。详情见Button 事件章节

    Button Transition

    Button 的 Transition 用来指定当用户点击 Button 时的状态表现。目前主要有 NONE,COLOR 和 SPRITE。

    transition

    Color Transition

    color-transition

    属性 功能说明
    Normal Button 在 Normal 状态下的颜色。
    Pressed Button 在 Pressed 状态下的颜色。
    Hover Button 在 Hover 状态下的颜色。
    Disabled Button 在 Disabled 状态下的颜色。
    Duration Button 状态切换需要的时间间隔。

    Sprite Transition

    sprite-transition

    属性 功能说明
    Normal Button 在 Normal 状态下的 SpriteFrame。
    Pressed Button 在 Pressed 状态下的 SpriteFrame。
    Hover Button 在 Hover 状态下的 SpriteFrame。
    Disabled Button 在 Disabled 状态下的 SpriteFrame。

    Button 事件

    button-event

    属性 功能说明
    Target 带有脚本组件的节点。
    Component 脚本组件名称。
    Handler 指定一个回调函数,当用户点击 Button 并释放时会触发此函数。

    详细说明

    Button 目前只支持 On Click 事件,即当用户点击并释放 Button 时才会触发相应的回调函数。

    Button 的回调函数带一个 event 参数,如果需要在回调里面取到 Button 组件,可以通过下面的方法:

    callback: function(event) {
        var node = event.target;
        var button = node.getComponent(cc.Button);
    }

    通过脚本添加回调

    button.clickEvents.push(new cc.Component.EventHandler(...))


    展开全文
  • 最近进入了一个第三方的api游戏,需要自定义一个返回按钮,来作为退出游戏的逻辑处理,刚开始的是使用cocos2d Button控件,像平时那样调整层级或者ZOrder,但是无论设置多高,Webview都始终在最上层。原来WebView是...
  • cocos2d-x3.0 GUI Button PageView Layout ListView ScrollView Image Checkbox editBox #pragma mark 页面视图 cocos2d::ui::Layout * UItest:: createLayout(int index){  auto ly = cocos2d::ui::L
  • 1,Cocos2d中的Button可以通过两种方式创建: 代码: localbtn=ccui.Button:create() CocosStudio: 直接使用Button空间,拖拽到指定的位置调整好需要的属性即可。 localbtn=panel:getChildByName("button") ...
  • // 创建一个按钮 auto btn_img_1 = Scale9Sprite::create("res/button.png"); btn_img_1->setContentSize(Size(76,33)); // 按钮文本 auto btn_text = Label::createWithTTF("按钮", "fonts/Marker Fel
  • 1.添加监听事件 local function onTouch() print("Hello") end
  • Cocos2d-x 3.x版2048游戏开发 本篇博客给大家介绍如何快速开发2048这样一款休闲游戏,理解整个2048游戏的开发流程,从本篇博客你将可以学习到以下内容:2048游戏的逻辑Cocos2d-x中上下左右手势的识别游戏中卡片类的...
  • 注意:原文是基于Cocos2d-iphone的教程,现已改为Cocos2d-X-3.0Beta版本。 当你在使用cocos2d制作一个游戏的时候,你很可能会发现,你需要的第一个东西就是“按钮”。(比如游戏开始时的菜单选择界面等)这个教程将...
  • cocos2d 按钮

    2018-04-06 12:37:07
    注意: 菜单项必须添加到菜单才可以点击用 菜单项 图片按钮 //... auto visableSize=Director::getInstance()->getVisibleSize();//获取可视区大小 auto menu=Menu::create(); menu->setPosition(...
  • Button不是cocos2d::ui 的成员
  • Button就是按钮,Cocos中提供了Button类对按钮进行相关的操作。我们看一下Button类继承关系图: 可以看到,Button是继承自Widget类,Widget类就是控件类,我们所有的控件包括Button按钮类、CheckBox复选框类、...
  • 最近在一家公司实习,自己就自学了cocos2dx,花了两个星期把cocos2dx-c++学了一遍,做了4个游戏。之后开始学习quick-cocoscocos-lua,单当我在学的时候发现,自己其实存在很多问题,主要体现在不熟练。加之quick和...
  • cocos2d-x 3.2 扇形按钮

    2014-08-27 10:14:19
    今天心血来潮做了个扇形按钮,想起android的扇形按钮那是非常的复杂,而cocos2d-x做起来却这么方便。 HelloWorld.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class ...
  • Cocos2d-x 3.x中有使用cocosGUI的Widget取代cocos2d-x extension中的控件的趋势,并且开始采用C++ 11中的一些新特性,比如Lambda...下面用cocos2d::ui::Button的使用来展示一下cocosGUI中Widget的使用以及事件的...
  • 初学cocos2dx开发游戏,在实际开发游戏中遇到一些问题,比如滑动菜单,滑动button不截断ListView的滑动。 下面发表一下个人见解,本人初学,如各位大佬发现错误,请指正   用ListView实现button滚动   像这样...
1 2 3 4 5 ... 20
收藏数 5,879
精华内容 2,351