• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
指尖上的快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

day04 CMenu的坐标体系 制作课程菜单体会 CCControlSlider拉动条 CCMenu

Day04

1,初识CCMenu的坐标体系

CCMenu本质上是一个CCLayer,初始大小与屏幕大小一致,锚点在中心(0.5, 0.5).

一般添加Menu的方式为

CCMenuItem *fontitem = CCMenuItemFont::create("fontitem");

fontitem->setTarget(this, menu_selector(T10CCMenu::mymenu));

CCMenu *menu = CCMenu::create();

menu->addChild(fontitem);

addChild(menu)

其中: 这个过程一共做了几件事,一是将CCMenuItem添加到CCMenu中,二是把CCMenuItem的锚点挂在CCMenu的锚点上, 三是把CCMenu的锚点setpostion(ccp(240,160)),.伪代码实现为

Fontitem->setAnchorPoint(ccp(0.5, 0.5));

menu->setAnchorPoint(ccp(0.5, 0.5));

Fontitem->setpostion(ccp(menu的锚点坐标));

Menu-> setpostion(ccp(240, 160))

所以不管将CCMenu的锚点设置于屏幕何处,只要还在屏上,就能在相应位置看见Fontitem.因为Fontitem是添加到CCMenu上的

另外: Fontitem的坐标系是以CCMenu的锚点为原点(0, 0)的

 

setTarget:补齐对象属性

 

2.CCMenu

typedef void (CCObject::*SEL_MenuHandler)(CCObject*);

作为CCMenu之类的回调函数

其中参数CCObject*代表传递过去的MenuItem

menu->getChildren() 返回MenuItem子集,类型为CCArray*

 

3. CCControlSlider(头文件#include "cocos-ext.h" ,  命名空间USING_NS_CC_EXT;)

CCControlSlider *slider = CCControlSlider::create("sliderTrack.png", "sliderProgress.png", "sliderThumb.png");

创建拉动条,

setValue:设置拉动条的当前值,该代码也会触发CCControlSlider相关回调函数

getValue:获取拉动条的当前值.

addTargetWithActionForControlEvents:设置事件

 

4.制做课程菜单体会

主要有两条经验,一开始真是走不了少弯路.

一个就是限定拉动菜单不出屏幕:

其核心思想就是.自定义Rect,大小与屏幕大小一致,拖动时如有两个条件同时满足时,拖动无效,1.Rect包含了最上面的菜单的锚点,2.拖动方向为正(即继续往屏幕上方拖动), Rect包含了最下面的菜单的锚点,拖动方向为负(即继续往屏幕下方拖动),代码为

         if (reWin.containsPoint(firstInWorld) && pTouch->getDelta().y < 0)

                   return;

 

         if (reWin.containsPoint(lastInWorld) && pTouch->getDelta().y > 0)

                   return;

注:坐标均为世界坐标.

 

Tback:为每个菜单增加回到主菜单功能

一种是先创建TBack层,只创建层,不用创建scene,然后在分scene中添加两个层,

一个是TBack层,一个是分scene层,然后其中addChild另外一个,最后再把外层Layer用 scene添加

代码为

        CCScene *scene = CCScene::create();

        T01FrameLayer *layer1 = T01FrameLayer::create();//分scene层

        TBack *layer = TBack::create();  //TBack层

        layer1->addChild(layer);

        scene->addChild(layer1);

        return scene;

不过这种方式比较耗费内存,因为添加了两个层.

 

还有一种是 抽象出一个层,添加一个回到主菜单的按钮,分scene继承这个层,然后初始化父类将父类层的特性加载到子类中来.

这种方式比较节省内存,因为只有一个层.

 

 

  1. CCControlButton

         CCScale9Sprite *bgButton = CCScale9Sprite::create("button.png");

         CCScale9Sprite *bgButtonLighted = CCScale9Sprite::create("buttonHighlighted.png");

         CCLabelTTF *ttf = CCLabelTTF::create("Touch Me", "Arial", 30);

         CCControlButton *Button = CCControlButton::create(ttf, bgButton);

         Button->setPosition(ccp(240, 160));

         addChild(Button);

         Button->setBackgroundSpriteForState(bgButtonLighted, CCControlStateHighlighted);

         Button->setTitleColorForState(ccGREEN, CCControlStateHighlighted);

         Button->addTargetWithActionForControlEvents(this, cccontrol_selector(T11UI::buttonclicked), CCControlEventTouchDown);

         Button->addTargetWithActionForControlEvents(this, cccontrol_selector(T11UI::buttoninside), CCControlEventTouchDragInside);

     CCControlStateHighlighted指的是被点击后的状态

posted @ 2015-12-28 11:12  指尖上的快乐  阅读(157)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3