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);
}
运行结果: