1
头文件

TMenu.h

#ifndef
__TMENU_H__

#define
__TMENU_H__

#include
"cocos2d.h"

USING_NS_CC;

class
TMenu :public
CCLayer

{

public:

static
CCScene *
scene();

CREATE_FUNC(TMenu);

bool
init();

CCMenu *
menu;

void
menuCallback(CCObject
* sender);

void
closeCallback(CCObject
* sender);

virtual
bool
ccTouchBegan(CCTouch
*pTouch,
CCEvent *pEvent);

virtual
void
ccTouchMoved(CCTouch
*pTouch,
CCEvent *pEvent);

};

#endif

TMenu.cpp

#include
"TMenu.h"

#include
"AppMacros.h"

#include
"T02LayerSprite.h"

#include
"T03LayerZorder.h"

#include
"T04ColorLayer.h"

#include
"T05Coordinate.h"

#include
"T06BatchNode.h"

#include
"T07Schedule.h"

#include
"T08Touch.h"

#include
"T09Memory.h"

#include
"T10Label.h"

//通过sizeof(menu_array)求出数组占用的总空间大小

//通过sizeof(*menu_array)求出数组中的每一个元素的大小

static
char *
menu_array[]

{

"T02LayerSprite.h",

"T03LayerZorder.h",

"T04ColorLayer.h",

"T05Coordinate.h",

"T06BatchNode.h",

"T07Schedule.h",

"T08Touch.h",

"T09Memory.h",

"T10Label.h"

};

CCScene *
TMenu::scene()

{

CCScene *
scene =
CCScene::create();

TMenu *
layer =
TMenu::create();

scene->addChild(layer);

return
scene;

}

bool
TMenu::init()

{

CCLayer::init();

menu =
CCMenu::create();

//通过以下的方式实现将菜单项加入到menu中

for (int
i = 0;
i <
sizeof(menu_array)
/ sizeof(*menu_array);
i++)

{

CCMenuItem *
item =
CCMenuItemFont::create(menu_array[i],

this,

menu_selector(TMenu::menuCallback));

menu->addChild(item);

}

//设置菜单的显示方向为垂直方向

menu->alignItemsVertically();

addChild(menu);

CCArray * array =
menu->getChildren();

CCObject *
obj;

int
i = 0;

CCARRAY_FOREACH(array,
obj)

{

CCMenuItem *
item = (CCMenuItem*)obj;

item->setTag(i
+ 1 + 10000);

i++;

}

CCMenuItem *
closeItem =
CCMenuItemImage::create("CloseNormal.png",
"CloseSelected.png");

closeItem->setTarget(this,
menu_selector(TMenu::closeCallback));

CCMenu *
menu2 =
CCMenu::create(closeItem,
NULL);

menu2->setPosition(CCPointZero);

closeItem->setPosition(ccp(winSize.width
- closeItem->getContentSize().width
/ 2,

winSize.height
- closeItem->getContentSize().height
/ 2));

addChild(menu2);

//设置触摸事件,为可touch

setTouchEnabled(true);

setTouchMode(kCCTouchesOneByOne);

return
true;

}

//当点击到菜单之后跳转到指定的CCScene中去

void
TMenu::menuCallback(CCObject
* sender)

{

CCMenuItem *
item = (CCMenuItem
*)sender;

CCScene *
pScene =
NULL;

switch (item->getTag()
- 10000)

{

case 1:

pScene =
T02LayerSprite::scene();

break;

case 2:

pScene =
T03LayerZorder::scene();

break;

case 3:

pScene =
T04ColorLayer::scene();

break;

case 4:

pScene =
T05Coordinate::scene();

break;

case 5:

pScene =
T06BatchNode::scene();

break;

case 6:

pScene =
T07Schedule::scene();

break;

case 7:

pScene =
T08Touch::scene();

break;

case 8:

pScene =
T09Memory::scene();

break;

case 9:

pScene =
T10Label::scene();

break;

}

if (pScene
!= NULL)

{

//通过CCDirector的sharedDirector来实现场景的切换

CCDirector::sharedDirector()->replaceScene(pScene);

}

}

//当点击关闭的时候游戏退出

void
TMenu::closeCallback(CCObject
* sender)

{

exit(0);

}

bool
TMenu::ccTouchBegan(CCTouch
*pTouch,
CCEvent *pEvent)

{

return
true;

}

void
TMenu::ccTouchMoved(CCTouch
*pTouch,
CCEvent *pEvent){

CCRect
rcWin =
CCRect(0,40,winSize.width,winSize.height
- 80);

CCMenuItem *
firstItem = (CCMenuItem
*)menu->getChildren()->objectAtIndex(0);

CCMenuItem *
lastItem = (CCMenuItem
*)menu->getChildren()->lastObject();

CCPoint
firstInWorld =
menu->convertToWorldSpace(firstItem->getPosition());

CCPoint
lastInWorld =
menu->convertToWorldSpace(lastItem->getPosition());

//当中Delta的坐标表示的是開始坐标的减去最后坐标的差值

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

return;

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

return;

menu->setPositionY(menu->getPositionY()
+ pTouch->getDelta().y);

}

执行结果:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

3.cocos2dx它Menu,由menu为了实现场景切换的更多相关文章

  1. 动态更新Toolbar Menu以及Menu中同时显示文字和图标

    动态更新Toolbar Menu以及Menu中同时显示文字和图标 我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptions ...

  2. Android -- Options Menu,Context Menu,Popup Menu

    Options Menu                                                                           创建选项菜单的步骤: 1. ...

  3. Cocos2d-x场景切换相关函数介绍

    场景切换是通过导演类Director实现的,其中的相关函数如下: runWithScene(Scene* scene).该函数可以运行场景.只能在启动第一个场景时候调用该函数.如果已经有一个场景运行情 ...

  4. Learning Cocos2d-x for WP8(6)——场景切换和场景过渡效果

    原文:Learning Cocos2d-x for WP8(6)--场景切换和场景过渡效果 C#(wp7)兄弟篇 Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果 ...

  5. Cocos2d-X研究之3.0 场景切换特效汇总

    Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...

  6. cocos2dx 3.1从零学习(二)——菜单、场景切换、场景传值

    回想一下上一篇的内容,我们已经学会了创建一个新的场景scene,加入sprite和label到层中.掌握了定时事件schedule. 我们能够顺利的写出打飞机的主场景框架. 上一篇的内容我练习了七个新 ...

  7. 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画

     1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...

  8. cocos2d-x 帧循环不严谨造成场景切换卡顿

    最近在用cocos2d-x做引导界面,2dx版本是2.2.3,场景切换加上了效果,所有资源都已经使用texturepacker打包预加载,但是在实际运行调试中,场景切换相当卡顿. 各种纠结后,无意中将 ...

  9. [Cocos2d-x For WP8]Transition 场景切换

    在游戏中通常会打完了一关之后就会从当前的场景转换到另外一关的场景了,在Cocos2d-x中是由CCScene类表示一个场景.那么场景(CCScene)是为游戏中的精灵(CCSprite)提供了舞台,场 ...

  10. Cocos2d-x多场景切换生命周期

    在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...

随机推荐

  1. HighChart学习-更新数据data Series与重绘

    一:HighChart介绍 基于JQuery的纯JavaScript的图标库,支持各种图表显示,同时还支持Mootools 与Prototype详细版本支持在这里: JQuery 1.3.2 - 1. ...

  2. SWT中的Tree中 添加右键弹出菜单

    先看一下效果: 如图:在树上单击鼠标右键会弹出 弹出式菜单.做法其实很简单,先做一个树: final TreeViewer treeViewer = new TreeViewer(group, SWT ...

  3. hdu5046(重复覆盖+二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...

  4. shiro权限架作战

    shiro框架作为一种特权的开源框架,通过身份验证和授权从具体的业务逻辑分离极大地提高了我们的发展速度,它的易用性使得它越来越受到人们的青睐.上一页ACL架相比,shiro能更easy的实现权限控制, ...

  5. Top 10 Mistakes Java Developers Make(转)

    文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开发者经常会这样做: ? 1 List<String> list = A ...

  6. Redis 的性能幻想与残酷现实(转)

    2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的 ...

  7. Git双机同步

    如果使用git init 初始化,当客户端仓库push内容时,服务器端仓库可以看到log,但是更新的文件不能显示,必须使用git reset --hard才能更新内容

  8. codeforces293E (树上点分治+树状数组)

    和poj1747相比起来,只不过是限制条件多了一维. 而多了这一维,所以需要用树状数组来维护,从而快速得到答案. 因为没注意传进树状数组函数的参数可能是<=0的,导致超时了好久. #pragma ...

  9. TCP header

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vzc2VyNDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  10. JQuery打印

    jquery.jqprint-0.3.js JQuery提供的局部打印功能: <input type="button" value="打印" onclic ...