Cocos2d—X游戏开发之CCTouch屏幕触摸事件获取(九)

手持设备的一大革命和创新就是触摸技术的发展,那么作为手机游戏的开发,又怎么能不使用触摸技术呢?

Cocos2d—X封装了单点触摸和多点触摸,大家使用起来应该说是比较容易的哈。

好的,废话不说,先看下Cocos2d—X的代理源代码吧。

1.

class CC_DLL CCTouchDelegate
{
public:
    
    CCTouchDelegate() {}
    
    virtual ~CCTouchDelegate()
    {
    }
    
    //单点触摸响应方法
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
    
    //多点触摸响应方法
    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
    
};


如果需要使用这些触摸方法的,只需要在类里面重写这些方法,有一点要注意的地方是单点触摸和多点触摸有些继承方面的区别。

单点触摸的话,不用在继承里面写上 CCTouchDelegate ,只要在init()里面添加代理就OK。

好的,下面看下单点触摸的实现:

在类里面实现这些方法,一般cancelled只在电话等事务调用。

    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);

好的,然后在.cpp文件里面实现这些方法。

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    static int flag ;
    CCLOG("ccTouchBegan,%d",++flag);
    return true;
}

void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    static int flag ;
    CCLOG("ccTouchEnded,%d",++flag);
    
}
void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    static int flag ;
    CCLOG("ccTouchMoved,%d",++flag);
}

void HelloWorld::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    static int flag ;
    CCLOG("ccTouchCancelled,%d",++flag);
}

最重要的是在init()方法里面,添加下面的一句代码,将代理和目标绑定:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);

这样就不需要this->settouchEnabled();方法

这样就可以实现单点触摸事件的响应了。


2.

当然,这里还有一个要注意的地方是触摸点的坐标转化,分屏幕坐标,open gl坐标,手机坐标,通用open gl坐标。

下面有这几个方法获取触摸点。

    CCPoint click = pTouch->getLocationInView();
    CCLog("%f %f",click.x,click.y);
    
    CCPoint click2 = pTouch->getLocation();
    CCLog("%f %f",click2.x,click2.y);
    
    CCPoint click3 = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
    CCLog("%f %f",click3.x,click3.y);

看下输出结果,你会发现第二和第三个坐标是相同的,原因是第二个方法再次封装了一次,把第三个方法封装了进去,方便大家使用。

// returns the current touch location in OpenGL coordinates
CCPoint CCTouch::getLocation() const
{ 
    return CCDirector::sharedDirector()->convertToGL(m_point); 
}

3.

好的,现在我们来看下多点触摸响应的事件处理。

首先需要在要实现的类里面重写多点触摸的方法:

    virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
    virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
    virtual void ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event);

现在在.cpp文件里面重写这些方法:


//下面是三个触摸函数,开始,移动,和结束。从各个函数中可获取不同点的位置
void  HelloWorld::ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
    static int flag;
    CCLOG("ccTouchesBegan,第%d次",++flag);
    
    CCTouch *pTouch = (CCTouch*)touches->anyObject();
    CCPoint click2 = pTouch->getLocation();
    CCLog("%f %f",click2.x,click2.y);

}

void HelloWorld::ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
    static int flag;
    CCLOG("ccTouchesMoved,第%d次",++flag);
}

void HelloWorld::ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
    static int flag;
    CCLOG("ccTouchesEnded,第%d次",++flag);
    
}

获取触摸点击的坐标呢,多了一条代码:

CCTouch *pTouch = (CCTouch*)touches->anyObject();

多点触摸的代理设置必须在类的继承里面写上

public cocos2d::CCTargetedTouchDelegate


而且在init()方法里面需要将触摸有效设置为true;

this->setTouchEnabled(true);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值