尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17325239
<捕鱼达人>回顾
【cocos2d-x IOS游戏开发-捕鱼达人1】内容介绍
上节回顾
【cocos2d-x IOS游戏开发-城市跑酷13】游戏玩法:友情提示:how to play?
先了解cocos2d-x是怎么实现对触屏操作的处理:
1.首先来了解一下相关的几个类、处理触屏事件时操作和执行的流程
CCTouch:它封装了触摸点,可以通过locationInView函数返回一个CCPoint。
CCTouchDelegate:它是触摸事件委托,就是系统捕捉到触摸事件后交由它或者它的子类处理,所以我们在处理触屏事件时,必须得继承它。
它封装了下面这些处理触屏事件的函数:
[cpp]
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);
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);
ccTouchesCancelled和ccTouchCancelled函数很少用,在接到系统中断通知,需要取消触摸事件的时候才会调用此方法。如:应用长时间无响应、当前view从window上移除、触摸的时候来电话了等。
CCTargetedTouchDelegate和CCStandardTouchDelegate是CCTouchDelegate的子类,类结构图如下:
CCStandardTouchDelegate用于处理多点触摸;CCTargetedTouchDelegate用于处理单点触摸。
CCTouchDispatcher:实现触摸事件分发,它封装了下面这两个函数,可以把CCStandardTouchDelegate和CCTargetedTouchDelegate添加到分发列表中。
2、实现触屏事件处理
知道了原理之后,实现起来就很简单了:定义一个CCTouchDelegate(或者其子类CCTargetedTouchDelegate/CCStandardTouchDelegate),然后重写那几个处理函数(began、move、end),并把定义好的CCTouchDelegate添加到分发列表中,在onExit函数中实现从分发列表中删除。
在平常的开发中,一般有两种方式:(1)继承CCLayer,在层中处理触屏函数。(2)继承CCSprite和CCTouchDelegate(或者其子类)。
上面两种方式,从原理上来说是一样的。
本文采用继承CCLayer的方式处理触屏事件。
添加CCStandardTouchDelegate是非常简单的,只需要重写触屏处理函数和调用setIsTouchEnabled(true)。
下面看具体的实现:
声明触屏事件相应:
virtual void ccTouchesBegan(CCSet* pTouches, CCEvent* event); virtual void ccTouchesEnded(CCSet* pTouches, CCEvent* event);重写事件处理:
void GameLayer::ccTouchesBegan(CCSet* pTouches, CCEvent* event) { CCTouch *touch = (CCTouch *)pTouches->anyObject(); if (touch) { CCPoint tap = touch->getLocation(); switch (_state) { case kGameIntro: break; case kGameOver: if (_tryAgain->boundingBox().containsPoint(tap)) { _hat->setVisible(false); _hat->stopAllActions(); _tryAgain->setVisible(false); _terrain->reset(); _player->reset(); resetGame(); } break; case kGamePlay: if (_player->getState() == kPlayerFalling) { _player->setFloating ( _player->getFloating() ? false : true ); } else { if (_player->getState() != kPlayerDying) { //SimpleAudioEngine::sharedEngine()->playEffect("jump.wav"); _player->setJumping(true); } } _terrain->activateChimneysAt(_player); break; case kGameTutorial: _tutorialLabel->setString(""); _tutorialLabel->setVisible(false); _terrain->setStartTerrain ( true ); _state = kGamePlay; break; case kGameTutorialJump: if (_player->getState() == kPlayerMoving) { // SimpleAudioEngine::sharedEngine()->playEffect("jump.wav"); _player->setJumping(true); } break; case kGameTutorialFloat: if (!_player->getFloating()) { _player->setFloating (true); _running = true; } break; case kGameTutorialDrop: _player->setFloating (false); _running = true; break; } } } void GameLayer::ccTouchesEnded(CCSet* pTouches, CCEvent* event) { if (_state == kGamePlay) { _player->setJumping(false); } }