现在的位置: 首页 > 综合 > 正文

cocos2d-x 自定义Touch事件处理类

2018年04月02日 ⁄ 综合 ⁄ 共 2399字 ⁄ 字号 评论关闭

对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类。

 

自定义Touch事件处理类重要的步骤是:

1. 继承CCTargetedTouchDelegate

2. 添加addTargetedDelegate(pDelegate, nPriority, bSwallowsTouches),来获取Touch事件,第二个参数是优先级,越高越优先。

3. 根据自己的需要override Touch事件处理函数:

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);


如下是实例:这里添加一个自定义的Button到场景层。

#include <cocos2d.h>

USING_NS_CC;

class MyButton : public CCNode, public CCTargetedTouchDelegate
{
public:
	MyButton(void);
	~MyButton(void);

	virtual void onEnter();
	virtual void onExit();

	virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
	virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
	virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

	virtual bool init();
	CREATE_FUNC(MyButton);

private:
	CCSprite *m_ShowPic;
};

#include "MyButton.h"

MyButton::MyButton(void):m_ShowPic(NULL)
{
}

MyButton::~MyButton(void)
{
}

bool MyButton::init()
{
    bool bRet = false;
    do
    {
		CCSize winSize = CCDirector::sharedDirector()->getWinSize();

        m_ShowPic = CCSprite::create("share.png");
		m_ShowPic->setPosition(ccp(winSize.width/2, winSize.height/2));
		this->addChild(m_ShowPic);

        bRet = true;
    } while(0);
    return bRet;
}

void MyButton::onEnter()
{
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
	CCNode::onEnter();
}

void MyButton::onExit()
{
	CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
	CCNode::onExit();
}

bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
	CCLog("MyButton Touch Began!");

	return true;
}

void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
	CCLog("MyButton Touch Move!");
}

void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCLog("MyButton Touch Ended!");
}

 

将以下代码其添加到HelloWorldScene::init中,

		////////////////////////////
		// Add MyButton
		MyButton *button = MyButton::create();
		this->addChild(button, 10);
		button->setPosition(CCPointZero);

运行测试:


在屏幕中点击可以看到Output中显示了我们的CCLog提示

可是我们没有点击到图片时也会提示出CCLog,这并不是我们想要的。

那么我们就需要添加自己需要的Touch事件处理代码了:

例如如下:

bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
	CCPoint position = convertTouchToNodeSpaceAR(touch);
	if (!m_ShowPic->boundingBox().containsPoint(position))
		return false;
	CCLog("MyButton Touch Began!");
	// add your code...
	
	return true;
}

void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
	CCLog("MyButton Touch Move!");
	// add your code...
}

void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCLog("MyButton Touch Ended!");
	// add your code...
}

抱歉!评论已关闭.