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. SVNKIT的SVNCommitClient的doMkDir的操作

    package com.repositoryclient.svnoptions; import java.io.File; import org.tmatesoft.svn.core.SVNCommi ...

  2. HTML5游戏开发进阶指南

    <HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.)    译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...

  3. 内存分析工具 MAT 的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  4. 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp; 第一Shader写作

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  5. ubuntu 搭建svn服务器

    1.安装Subversion sudo apt-get install subversion 2.创建资源库 cd /home/username/ svnserve -d -r /home/usern ...

  6. apache cxf之 一个简单的JAX-WS服务程序

    推荐一本apache cxf的书籍: apache cxf的配置,这边就不做介绍了.请参照我关于它配置的博文. 开发步骤: 1.新建Java project,build path引入cxf runti ...

  7. 无法解析该名称 outlook必须处于联机,控制面板删除账户

    无法解析该名称 outlook必须处于联机,控制面板删除账户

  8. java连接数据库——JDBC连接数据库

    DBUtil.java   // 数据库操作文件 package com.bjpowernode.jdbc.util; import java.io.File; import java.io.File ...

  9. 自定义ComboBox,简简单单实现

    private void Button_Click(object sender, RoutedEventArgs e) { Popup1.PlacementTarget = TesTextBox; P ...

  10. Boosting算法简介

    一.Boosting算法的发展历史 Boosting算法是一种把若干个分类器整合为一个分类器的方法,在boosting算法产生之前,还出现过两种比较重要的将多个分类器整合为一个分类器的方法,即boos ...