Cocos2d-x屏幕触摸事件

触碰事件主要分为两类:单点触碰 和 多点触碰。

cocos2dx引擎中实现触碰的类CCTouchDelegate。而CCLayer类默认继承了CCTouchDelegate接口,所以CCLayer的子类就很方便地为我们提供了触摸相关的操作。

1.单点触摸事件

单点触碰TargetedDelegate,顾名思义,就是只接受一个点的触摸响应事件。在使用触碰之前,必须要先注册触碰委托。单点触碰的注册委托函数为addTargetedDelegate。

void TouchMove::onEnter(){
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);
    CCLayer::onEnter();
}
void TouchMove::onExit(){
	CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCLayer::onExit();  
}

单点触摸事件的响应函数如下,其中CCTouch类是用来存储用户触摸屏幕的过程中,其触摸点的相关信息。也就是保存了触碰的整个过程中,手指所在的位置坐标。

bool TouchMove::ccTouchBegan(CCTouch* touch,CCEvent* event){
	 CCLOG("ccTouchBegan");
 
        //获取CCSprite精灵
        CCSprite* sp = (CCSprite*)this->getChildByTag(1);
 
        //设置精灵的坐标为: 当前触点位置
        CCPoint pTouch = touch->getLocation();
        sp->setPosition( pTouch );
 
        return true;
}
void TouchMove::ccTouchMoved(CCTouch* touch,CCEvent* event){
		CCLOG("ccTouchMoved");
 
        //获取可视区域尺寸大小
        CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();
 
        //获取CCSprite精灵
        CCSprite* sp = (CCSprite*)this->getChildByTag(1);
 
        //实现精灵的触屏移动
        CCPoint pos = touch->getDelta();        //获得触屏滑动的偏移量
        CCPoint currentPos = sp->getPosition(); //获得精灵的当前坐标
 
        currentPos = ccpAdd(currentPos, pos);   //精灵+偏移量 后的坐标
 
        sp->setPosition(currentPos);            //设置触屏移动后的坐标
}
void TouchMove::ccTouchEnded(CCTouch* touch,CCEvent* event){
	 CCLOG("ccTouchEnded");
 
        //获取CCSprite精灵
        CCSprite* sp = (CCSprite*)this->getChildByTag(1);
 
        //设置精灵的坐标为: 触屏开始时的触点位置
        CCPoint touchStartPos = touch->getStartLocation();
        sp->setPosition( touchStartPos );
}
2.多点触控

多点触碰的委托注册放在onEnter的生命函数中会造成程序异常退出。所以注册多点触碰都需要重写如下函数:registerWithTouchDispatcher。开启多点触碰,除了注册触

碰委托外,还需要调用setTouchEnabled(true)来启用触碰。

    void TouchMove::registerWithTouchDispatcher()</span>
    {
        CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);
    }
    //启用多点触碰
    this->setTouchEnabled(true);

多点触控的响应函数如下,其中CCSet类是一个集合类,和C++中的Set是类似的。在这里CCSet的数据元素类型为CCTouch,其主要存储的是多点触碰的触摸点CCTouch集合。使用迭代器CCSetIterator进行CCSet集合中多个触点CCTouch的遍历。

virtual void ccTouchesBegan(CCSet* touches, CCEvent* event);       //触碰开始
    virtual void ccTouchesMoved(CCSet* touches, CCEvent* event);       //触碰移动
    virtual void ccTouchesEnded(CCSet* touches, CCEvent* event);       //触碰结束
    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); //取消多点触屏

for (CCSetIterator iter = touches->begin() ;iter != touches->end(); iter++) 
{
	//获取触点后,就和单点一样的处理了
<span style="white-space:pre">	</span>CCTouch* touch = (CCTouch*)(*iter);
<span style="white-space:pre">	</span>......
}


 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值