cocos2d-x Touch触屏事件

本文介绍了cocos2d-x中处理单点和多点触控的步骤。对于单点触控,包括在OnEnter或init中设置touchEnabled,注册触屏调度器,以及重写touchBegan、touchMoved和touchEnded等响应函数。通过示例展示了如何实现触屏交互。而对于多点触控,虽然未详述,但暗示了cocos2d-x同样支持该功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单点触控

1. OnEnter或init中添加开启触屏接收属性:

setTouchEnabled(true);

2. 重载

virtual void registerWithTouchDispatcher(void);

并添加:

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0, true)

3. 重载需要的响应函数

ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  

ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

 

下面看一个例子:

新建HelloWorld, AppDelegate.cpp的applicationDidFinishLaunching注释掉原有HelloWorld的,添加CCScene *pScene = GameScene::scene();

为工程添加新类GameScene.定义如下:

#pragma once
#include "cocos2d.h"

using namespace cocos2d;

class GameScene :
	public CCLayerColor
{
public:
	static cocos2d::CCScene* scene();
public:
	virtual bool init();

 	virtual bool ccTouchBegan(CCTouch *pTouches, CCEvent *pEvent);
 	virtual void ccTouchMoved(CCTouch *pTouches, CCEvent *pEvent);
	virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
	virtual void registerWithTouchDispatcher();

	void menuCloseCallback(CCObject* pSender);
	CREATE_FUNC(GameScene);

	void updateSize(CCPoint p);
};

 

#include "GameScene.h"
#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* GameScene::scene()
{
	CCScene* scene = CCScene::create();
	GameScene *gameScene = GameScene::create();
	scene->addChild(gameScene);
	return scene;
}

bool GameScene::init()
{
	CCLayerColor::init();

	CCSize size = CCDirector::sharedDirector()->getWinSize();

	setTouchEnabled(true);

	CCLayerColor *colorRect = CCLayerColor::create(ccc4(255, 255, 0, 255), 200.0, 200.0);

	colorRect->setPosition(ccp(size.width/2, size.height/2));
	colorRect->ignoreAnchorPointForPosition(false);
	addChild(colorRect, 0, 1);

	CCActionInterval *colorAction = CCRepeatForever::create((CCActionInterval *)CCSequence::create(
		CCTintTo::create(0.2f, 255, 0, 0),
		CCTintTo::create(0.2f, 0, 255, 0),
		CCTintTo::create(0.2f, 0, 0, 255),
		CCTintTo::create(0.2f, 0, 255, 255),
		CCTintTo::create(0.2f, 255, 255, 0),
		CCTintTo::create(0.2f, 255, 0, 255),
		CCTintTo::create(0.2f, 255, 255, 255),
		NULL));

	colorRect->runAction(colorAction);

	return true;
}

bool GameScene::ccTouchBegan(CCTouch *pTouches, CCEvent *pEvent)
{
	CCPoint point = pTouches->getLocation();
	updateSize(point);
	return true;
}


void GameScene::ccTouchMoved(CCTouch *pTouches, CCEvent *pEvent)
{
	CCPoint point = pTouches->getLocation();
	updateSize(point);
}

void GameScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCPoint point = pTouch->getLocation();
	updateSize(point);
}

void GameScene::updateSize(CCPoint p)
{
	CCSize size = CCDirector::sharedDirector()->getWinSize();
	CCSize newSize = CCSizeMake( fabs(p.x-size.width/2)*2, fabs(p.y-size.height/2)*2 );
	CCLayerColor *layer = (CCLayerColor*)getChildByTag(1);
	layer->setContentSize(newSize);
}

void GameScene::registerWithTouchDispatcher()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority + 1, true);
}

运行点击屏幕,拖动屏幕可看到效果。

 

CCDirector的addTargetedDelegate的作用是在Dispatcher的列表中注册一个触屏事件的委托,用来监听用户的触屏事件。

参数分别为:触屏世家你委托CCTouchDelegate目标,优先级(值越高越早被响应),是否拦截触屏事件(true表示拦截触屏事件,即响应响应本次事件委托后,不再继续分发触屏事件到Dispatcher列表的中其他委托)。


多点触控

多点触控与单点触控类似,只不过是在触控的一串输入中,遍历这一串经行处理,在TestCpp的例子中有一个专门的例子MutiTouchTest

所用到的函数有:

ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)

void MutiTouchTestLayer::registerWithTouchDispatcher(void)
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0);
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值