您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 利用schedule实现长按触发事件功能

2015-09-14 15:04 225 查看
在cocos2dx中给我们提供了很多点击屏幕触发的事件监听,比如CCMenu类的一系列 ,ccTouchBegan(CCTouch
*pTouch, CCEvent *pEvent),ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent), ccTouchEnded(CCTouch
*pTouch, CCEvent *pEvent),ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)等监听方法,但有时项目中会要求当长按某一精灵达到一定时间时才响应触发事件,而不是简单的按下抬起,这时就可以利用schedule来实现,下面是实现代码。

.h文件

[cpp]
view plaincopy





#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "cocos-ext.h"

using namespace std;
using namespace cocos2d;
using namespace extension;

enum{
backgroundTag = 0,
};

class HelloWorld : public CCLayer
{
public:
virtual bool init();
static CCScene* scene();

CCSprite* red_sp;
CCSprite* green_sp;
CCSprite* blue_sp;
CCSprite* longTouch_sp;

void update();

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
virtual void onEnter();
virtual void onExit();

CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

.cpp文件

[cpp]
view plaincopy





#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
CCScene *scene = CCScene::create();
HelloWorld *layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}

bool HelloWorld::init()
{
if ( !CCLayer::init() )
{
return false;
}

CCSize size = CCDirector::sharedDirector()->getWinSize();

//添加一背景当点击此背景时弹出键盘
CCSprite* background = CCSprite::create("HelloWorld.png");
background->setScale(2);
background->setPosition(ccp(size.width*0.5, size.height*0.5));
this->addChild(background,1,backgroundTag);

//红色精灵
red_sp = CCSprite::create("Icon.png");
red_sp->setColor(ccRED);
red_sp->setPosition(ccp(size.width*0.3, size.height*0.5));
this->addChild(red_sp,1,1);
//绿色精灵
green_sp = CCSprite::create("Icon.png");
green_sp->setColor(ccGREEN);
green_sp->setPosition(ccp(size.width*0.5, size.height*0.5));
this->addChild(green_sp,1,2);
//蓝色精灵
blue_sp = CCSprite::create("Icon.png");
blue_sp->setColor(ccBLUE);
blue_sp->setPosition(ccp(size.width*0.7, size.height*0.5));
this->addChild(blue_sp,1,3);

return true;
}

void HelloWorld::update()
{
this->unschedule(schedule_selector(HelloWorld::update));
//被长按触发的精灵做旋转动作
longTouch_sp->runAction(CCRotateBy::create(1, 360));
}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint touch_point = pTouch->getLocation();
if (red_sp->boundingBox().containsPoint(touch_point)) {
this->schedule(schedule_selector(HelloWorld::update), 1);
longTouch_sp = red_sp;
}else if(green_sp->boundingBox().containsPoint(touch_point)){
this->schedule(schedule_selector(HelloWorld::update), 1);
longTouch_sp = green_sp;
}else if(blue_sp->boundingBox().containsPoint(touch_point)){
this->schedule(schedule_selector(HelloWorld::update), 1);
longTouch_sp = blue_sp;
}
return true;
}

void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint touch_point = pTouch->getLocation();
if (longTouch_sp) {
//当手指滑动超出所点精灵范围时取消触发
if (!longTouch_sp->boundingBox().containsPoint(touch_point)) {
this->unschedule(schedule_selector(HelloWorld::update));
}
}
}

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
this->unschedule(schedule_selector(HelloWorld::update));
}

void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){}


void HelloWorld::onEnter()
{
//事件注册
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
CCLayer::onEnter();
}
void HelloWorld::onExit()
{
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}

效果如下图,当长按某一精灵达到1秒时,就会触发旋转动作。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: