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秒时,就会触发旋转动作。
*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秒时,就会触发旋转动作。
相关文章推荐
- cocos2dx 利用CCLabelTTF设置字的水平间距与垂直间距
- 在Xcode下编译cocos2d-x语言为lua时出错的解决方案
- cocos2d-x 利用CCLabelTTF制作文字描边与阴影效果的实现方法
- cocos2D(五岁以下儿童)---- CCNode
- cocos基础教程(1)Mac环境下搭建
- Cocos2dx-jsb 中Node的onEnter过程分析(1)
- cocos2dx 3.x api
- cocos2dx 3.x 弃用列表
- 【cocos2dx-3.0beta-制作flappybird】尾随时代潮流,关于引擎升级
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十五节:3D粒子系统
- cocos2d-x 血量条实现:LoadingBar、ProgressTimer和Slider实现示例
- cocos2d-x 粒子编辑器和使用
- lua 中处理cocos2dx 的button 事件
- Cocos2d-x3.0 捕Android菜单键和返回键
- 关于cocos2d-x中弧度和角度的转换问题
- cocos2d-x 3.2 物理小游戏教程2 block it 物理世界 墙壁
- 关于ToggleMenu触发器菜单
- 【收集】cocos2dx中加载使用plist文件
- 创建自己的Sprite子类时需要做哪些工作?
- 从cocos2d中导入项目到Android