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);
}
執行結果:
?
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。