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继承这个层,然后初始化父类将父类层的特性加载到子类中来.
这种方式比较节省内存,因为只有一个层.
- 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指的是被点击后的状态
浙公网安备 33010602011771号