cocos2dx touch 单击、双击、三连击和长按事件处理

原创 2014年04月11日 22:30:52
#include "TouchTest.h"

TouchTest::TouchTest()
{
    m_longProgress=false;
}



bool isTouch=false;

bool isMoved=false;

int pressTimes=0;

int touchCounts=0;

void TouchTest::updateSingleDelay(float ft)
{
    if (touchCounts == 1) {
        onSingleCLick();
        touchCounts=0;
    }
    
}

void TouchTest::updateDoubleDelay(float ft)
{
    if (touchCounts == 2 )
    {
        onDoubleClick();
        touchCounts=0;
    }
}

void TouchTest::updatelongprogress(float ft)
{
    if (isTouch) {
        pressTimes++;
        
        if (pressTimes >= 2) {
            m_longProgress=true;
            onLongPressed();
            
        }
    }
    else
    {
        pressTimes=0;
    }
}

long long TouchTest::getCurrentTime()
{
    struct timeval tm;
    gettimeofday(&tm, NULL);
    return (long long)(tm.tv_sec*1000 + tm.tv_usec/1000);
}


bool TouchTest::touchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
    
    m_startPoint=touch->getLocation();

    isTouch=true;
        
    m_startTime=getCurrentTime();
       
        //处理长按事件
    this->schedule(schedule_selector(TouchTest::updatelongprogress),1);
    
    return true;
}

void TouchTest::touchMoved(cocos2d::Touch *touch, cocos2d::Event *event)
{
    isMoved=true;
    Point curPoint=touch->getLocation();
    onMove(curPoint);
    
}

void TouchTest::touchEnded(cocos2d::Touch *touch, cocos2d::Event *event)
{
    isTouch=false;
    pressTimes=0;
    this->unschedule(schedule_selector(TouchTest::updatelongprogress));
    
    //如果刚完成长按事件 则把按下次数清零 长按状态置空 直接返回 不继续执行
    if (m_longProgress ) {
        touchCounts=0;
        m_longProgress=false;
        
        return;
    }
    
    m_endPoint=touch->getLocation();
    
    long long endTime=getCurrentTime();
    
    long long timeDis=endTime-m_startTime;
    
    E_SWIP_DIR dir=GetSwipDir(m_startPoint, m_endPoint,timeDis);
    
    if ( dir != E_INVAILD) {
        onSwip(m_startPoint, m_endPoint, dir);
        return;
    }
    
    //做连击判断
    if (isMoved) {
        isMoved=false;
        return;
    }
    if (touchCounts == 2) {
        onThreeClick();
        touchCounts=0;
    }
    else if (touchCounts == 1) {
        this->scheduleOnce(schedule_selector(TouchTest::updateDoubleDelay), 0.25);
        touchCounts++;
    }
    else if (touchCounts == 0) {
        this->scheduleOnce(schedule_selector(TouchTest::updateSingleDelay), 0.25);
        touchCounts++;
    }
    
    
    
}

#include <iostream>
#include "cocos2d.h"
USING_NS_CC;


const int minSwipdistance=100;
const int minSwiptime=1000;    //毫秒
const int maxClickedDis=20;

enum E_SWIP_DIR
{
    E_INVAILD,
    E_LEFT,
    E_RIGHT,
    E_UP,
    E_DOWN
};

class TouchTest:public Layer
{
public:
    TouchTest();
    
    bool touchBegan(Touch * touch,Event * event);
    void touchMoved(Touch * touch,Event * event);
    void touchEnded(Touch * touch,Event * event);
    void touchCancel(Touch * touch,Event * event);
    
    void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);
    
    
    void updateSingleDelay(float);
    void updateDoubleDelay(float);

    void updatelongprogress(float);
    
    long long getCurrentTime();

    
    void stopSchedule();
    
private:
    E_SWIP_DIR GetSwipDir(Point start,Point end,long long timeDis);
    
public:
    virtual void onSingleCLick();        //单击
    virtual void onDoubleClick();        //双击
    virtual void onThreeClick();         //3连击
    virtual void onLongPressed();        //长按
    virtual void onMove(Point);          //移动
    virtual void onSwip(Point,Point,E_SWIP_DIR);    //滑动
    


相关文章推荐

cocos2dx 按钮长按事件

通过touchBegin 结合 schedule 来实现 void UILayer::longTouchUpdate(float delay){ m_isLongPress = true; ...

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

感谢点评与关注,欢迎转载与分享。 勤奋努力,持之以恒! 在cocos2dx中给我们提供了很多点击屏幕触发的事件监听,比如CCMenu类的一系列 ,ccTouchBegan(CCTouc...

cocos2dx touch 单击、双击、三连击和长按事件处理

[cpp] view plain copy  print? #include "TouchTest.h"      TouchTest::TouchTest()   {       m_l...

Cocos2d-x处理双击事件的两种方法!

在 Cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现。 下面介绍两种方式实现双击事件的处理...

Cocos2d-x 处理双击事件

由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现。 (一)方法一 第一种方法就是利用两次touch之间的时间间隔来判定是单击或者是双击,一般来说,双击...

Cocos2d-x Lua实现长按事件

local MainScene = class("MainScene", cc.load("mvc").ViewBase)-- 弹出的层 local InfoLayer = class('InfoLa...

onTouchEvent,onClick,onLongClick的return值注意事项

1.onTouch中返回true,表示事件已经被消费(consume),不在沿着视图树(View Hierarchy)传递。 在Android中,一次用户操作可以被不同的View按次序分别处理,并将完...

cocos studio的事件绑定 Click Touch Event

Click由于未指定target,是找不到this的,所以一般不用,除非是全局函数回调。 Touch和Event都有target,可以正常回调。 由于 cocos-js中对 事件绑定有些b...

cocos2dx-lua捕获用户touch事件的几种方式

这里只针对lua1.为每个关心的事件注册回调函数 具体分为以下几种 1>单点触摸 2>多点触摸...

Cocos2d-JS 触摸事件

触摸事件的时间方面 触摸事件有两个事件监听器:cc.EventListener.TOUCH_ONE_BY_ONE和cc.EventListener.TOUCH_ALL_AT_ONCE,分别对应单点触...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx touch 单击、双击、三连击和长按事件处理
举报原因:
原因补充:

(最多只允许输入30个字)