当用户点击再松开后才会响应菜单事件,而在游戏中有些游戏需要玩家点击后就处理事件,如玩坦克大战的时候,玩家是点击一下就发射子弹,并是点击松手后发射子弹,在Cocos2d-X中没有这种消息,下面就通过自定义的方式实现当用户点击后就调用处理函数
程序:当用户点击后处理消息松开手后处理结束
首先自定义一个MyMenu类用于处理点击事件
/*
1)注册定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
*/
class MyMenu : public CCMenu
{
public:
CREATE_FUNC(MyMenu);
//当手按下的时候
bool ccTouchBegan(CCTouch* touch, CCEvent* ev)
{
bool bRet = CCMenu::ccTouchBegan(touch, ev);
if (bRet)
{
// 注册定时器函数
scheduleUpdate();
return true;
}
return false;
}
void ccTouchEnded(CCTouch* touch, CCEvent* ev)
{
//定时器停止计时
unscheduleAllSelectors();
}
//每次帧循环都会被调用
//dt上一次帧循环到这次帧循环所花的时间
void update(float dt)
{
if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
{
this->m_pSelectedItem->activate();
}
}
};
在Menu.h中添加下面的代码(代码中包含了自定义的MyMenu类)
#ifndef __Menu_H__
#define __Menu_H__
#include "cocos2d.h"
USING_NS_CC;
class Menu : public CCLayer
{
public:
virtual bool init();
static CCScene* scene();
//响应菜单事件
void menuHandler(CCObject*);
CREATE_FUNC(Menu);
};
/*
1)注册定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
*/
class MyMenu : public CCMenu
{
public:
CREATE_FUNC(MyMenu);
//当手按下的时候
bool ccTouchBegan(CCTouch* touch, CCEvent* ev)
{
bool bRet = CCMenu::ccTouchBegan(touch, ev);
if (bRet)
{
// 注册定时器函数
scheduleUpdate();
return true;
}
return false;
}
void ccTouchEnded(CCTouch* touch, CCEvent* ev)
{
//定时器停止计时
unscheduleAllSelectors();
}
//每次帧循环都会被调用
//dt上一次帧循环到这次帧循环所花的时间
void update(float dt)
{
if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
{
this->m_pSelectedItem->activate();
}
}
};
#endif // Menu
在Menu.cpp中添加下面的代码
#include "Menu.h"
CCScene* Menu::scene()
{
CCScene *scene = CCScene::create();
Menu *layer = Menu::create();
scene->addChild(layer);
return scene;
}
bool Menu::init()
{
//初始化父类层
CCLayer::init();
//得到窗口的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//创建菜单项
CCMenuItem* item = CCMenuItemFont::create("Click Me",
this, menu_selector(Menu::menuHandler));
//使用自定义的MyMenu创建菜单
MyMenu* menu = MyMenu::create();
//添加菜单
addChild(menu);
//添加菜单项
menu->addChild(item);
return true;
}
//响应菜单事件
void Menu::menuHandler(CCObject*)
{
CCLog("I am Clicked");
}
执行结果:
当点中“Click Me”不松手,会一直打印“ Iam Clicked”直到松手