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

感谢点评与关注,欢迎转载与分享。
勤奋努力,持之以恒!


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


.h文件
#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文件
#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秒时,就会触发旋转动作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值