您的位置:首页 > 移动开发 > Cocos引擎

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

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

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: