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

对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...
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值