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);    //滑动
    


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

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

Cocos2d-x 处理双击事件

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

Cocos2d-x 3.0开发(三)点击交互的四种处理

1、概述 在Cocos2d-x 3.0中,更改了dispatch机制。同时加入了两种新的交互形式:listener 和touchEvent回调。加上先前版本中的点击函数回调,与重写layer层的...
  • fansongy
  • fansongy
  • 2013年10月14日 21:30
  • 67601

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

分类: cocos2d-x2014-04-11 22:30 1435人阅读 评论(0) 收藏 举报 cocos2dx [cpp] view plaincopyprint...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年12月19日 17:44
  • 1338

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

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

cocos2dx 按钮长按事件

通过touchBegin 结合 schedule 来实现 void UILayer::longTouchUpdate(float delay){ m_isLongPress = true; ...
  • strivero
  • strivero
  • 2015年12月14日 18:19
  • 2313

Cocos2dx-Lua 长按手势

Cocos2dx只有touchUpInsid的按钮或菜单,有时可能会想要一个长按手势来触发事件。 -- 这是类名,命名这件事还是很麻烦的,凑合就是Button吧 local Button = {}...
  • drmadness
  • drmadness
  • 2015年01月28日 12:56
  • 1000

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

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

Cocos Creator 系统内置事件(摘自官方文档)

系统内置事件 如上一篇文档所述,cc.Node 有一套完整的事件监听和分发机制。在这套机制之上,我们提供了一些基础的系统事件,这篇文档将介绍这些事件的使用方式。 系统事件遵守通用的注册方式,开发者...
  • alpha_xiao
  • alpha_xiao
  • 2016年08月03日 11:43
  • 1476

Cocos2d-x Lua实现长按事件

local MainScene = class("MainScene", cc.load("mvc").ViewBase)-- 弹出的层 local InfoLayer = class('InfoLa...
  • forestsenlin
  • forestsenlin
  • 2016年05月31日 20:00
  • 1160
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx touch 单击、双击、三连击和长按事件处理
举报原因:
原因补充:

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