加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2d-x之Touch事件处理机制

发布时间:2020-12-14 21:22:02 所属栏目:百科 来源:网络整理
导读:http://www.cppblog.com/Tongy0/archive/2013/03/10/198325.aspx 一、两种机制的四种不同的事件 CCStandardTouchDelegate 默认事件 virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); 处理按下事件 virtual void ccTouchesMoved(CCSet *pTouch

http://www.cppblog.com/Tongy0/archive/2013/03/10/198325.aspx


一、两种机制的四种不同的事件

CCStandardTouchDelegate 默认事件
virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); 处理按下事件
virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent); 处理松开事件
virtual void ccTouchesCancelled(CCSet *pTouches,CCEvent *pEvent); 处理打断事件
CCTargetedTouchDelegate
virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent); 处理用户按下事件,true表示继续处理,否则false.
virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent); 处理松开事件
virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent); 处理打断事件

两者的区别: CCSetCCTouch ,一个事件集合一个单个事件。

事件分发的顺序: CCTargetedTouchDelegateCCStandardTouchDelegate

默认情况下所有 CCLayer 都没有启用触摸事件,需要 this->setIsTouchEnabled(true); 启用。

如需更改事件: void registerWithTouchDispatcher(void) {}

class MyLayer: public cocos2d:CCLayer {
public:
    virtual void registerWithTouchDispatcher(void);

    // addStandardDelegate()
    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

    // addTargetedDelegate()
    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);
}

void MyLayer::registerWithTouchDispatcher(void) {
    // 委托,优先级
    CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority);
    // 委托,优先级,是否继续处理
    CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);

    // 2.0版本以后
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority);
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}

利用 ccTouchBeganccTouchesBegan 加以实现点击的回调

void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {
    // 单点
    CCTouch *pTouch = (CCTouch*)(pTouches->anyObject());

    // 所有点
    for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) {
        CCTouch *pCurTouch =  (CCTouch*)(*iterTouch);
    }

    // 获取点在视图中的坐标(左上角为原点)
    CCPoint touchLocation = pTouch->getLocationInView();
    // 把点的坐标转换成OpenGL坐标(左下角为原点)
    touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
    // 把OpenGL的坐标转换成CCLayer的坐标
    CCPoint local = convertToNodeSpace(touchLocation)
    // 大小为100x100,坐标为(0,0)的矩形
    CCRect * rect = CCRectMake(0, 0, 100, 100);
    // 判断该坐标是否在rect矩形内
    bool flag = rect.containsPoint(local)
    if(flag) {
        // 回调
    } else {
        // 不执行
    }
}

http://blog.sina.com.cn/s/blog_6c97abf10102v6hs.html


移动时代,手机很重要的一部分就是可以人机交互,玩家通过手指在屏幕上移动点击与游戏进行互动,传达信息。相比PC上鼠标的输入,这种触控能带给用户更真实的体验,所以触摸事件也是游戏中不可缺少的部分,并且随着手机硬件的不断提升,现在市场上大部分手机屏幕也支持多点触摸。本节视频将介绍在引擎中如何响应单点和多点触摸事件。

////////////////////22222222221111单点触控

class MyScene : public CCLayer
{
public:
MyScene(void);
~MyScene(void);
virtual bool init();
static CCScene *scene();

void menuCallback(CCObject* pSender);

virtual voidonEnter();
virtual void onExit();

virtual boolccTouchBegan(CCTouch *pTouch,CCEvent*event);//第一次触屏事件
virtual void ccTouchMoved(CCTouch *pTouch,CCEvent*event);//滑动操作
virtual void CCTouchEnded(CCTouch *pTouch,CCEvent*event);//当离开屏幕时候,响应的事件
virtual void ccTouchCancelled(CCTouch*pTouch,CCEvent *event);//取消

CCSprite *sp;

CREATE_FUNC(MyScene);

};
//////////////////////////////////////////////
void MyScene:: onEnter()
{
CCLayer::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,true);
//1,委托目标,2,值越小,优先级别越高,如果0,按钮最先被响应。3,是否拦截后面的操作

}

void MyScene::onExit()
{
CCLayer::onExit();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool MyScene:: ccTouchBegan(CCTouch *pTouch,CCEvent*event)//第一次触屏事件
{
CCPoint pos =pTouch->getLocation();//返回OPenGL坐标

sp =CCSprite::create("icon.png");//创建一个精灵
sp->setPosition(pos);
addChild(sp);

CCLOG("TouchBegan");


returntrue;//true,继续响应后面的,false,就不响应后面的了
}

void MyScene::ccTouchMoved(CCTouch *pTouch,CCEvent*event)//滑动操作
{
CCPoint pos =pTouch->getLocation();//返回OPenGL坐标
sp->setPosition(pos);

CCLOG("TouchMoved");
}
void MyScene::CCTouchEnded(CCTouch *pTouch,CCEvent*event)//当离开屏幕时候,响应的事件
{
CCLOG("TouchEnded");
}
void MyScene::ccTouchCancelled(CCTouch *pTouch,CCEvent*event)//取消
{
CCLOG("TouchCancelled");
}

//////////////多点触控

virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *event);
virtual void ccTouchesMoved(CCSet*pTouches,CCEvent *event);
virtual void ccTouchesEnded(CCSet*pTouches,CCEvent *event);

//

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

CCSetIterator iter = pTouches->begin();
for(;iter != pTouches->end(); iter++)
{
CCTouch *pTouch =(CCTouch*)(*iter);
CCPoint pos =pTouch->getLocation();

CCSprite *sp =CCSprite::create("icon.png");
sp->setPosition(pos);
addChild(sp);
}

}

//////////////

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

//多点触控也可设置成单点触控

CCTouch *touch =(CCTouch*)pTouches->anyObject();
CCPoint pos = touch->getStartLocation();
CCSprite *sp =CCSprite::create("icon.png");
sp->setPosition(pos);
addChild(sp);

}

void MyScene::ccTouchesMoved(CCSet *pTouches,CCEvent *event)
{

}

void MyScene::ccTouchesEnded(CCSet *pTouches,CCEvent *event)
{

}

//////////////333333333333333

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

CCSetIterator iter = pTouches->begin();
for(;iter != pTouches->end(); iter++)
{
CCTouch *pTouch =(CCTouch*)(*iter);
CCPoint pos =pTouch->getLocation();

pTouch->getID();//可以得到有几个点

} //CCTouch *touch =(CCTouch*)pTouches->anyObject(); //CCPoint pos =touch->getStartLocation(); //CCSprite *sp =CCSprite::create("icon.png"); //sp->setPosition(pos); //addChild(sp); }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读