在cocos2d-x游戏开发过程中.经常会遇到处理单个精灵被用户点击的问题。 一般情况下我们都是抓取单个场景中的点击事件根据坐标判断,遍历所有精灵,看是否存在点击的坐标和精灵的区域有碰撞。这种方法在精灵多了之后很费时,在学习testcpp的例子代码后发现一个很好的方法解决。就是继承 "CCTargetedTouchDelegate" 类,使精灵也有接收点击事件的功能,并且在精灵销毁时移除注册的点击功能。
//
// TempTouchSprite.h
// TouchSprite
//
// Created by LangYi on 13-8-22.
//
//
#ifndef __TouchSprite__TempTouchSprite__
#define __TouchSprite__TempTouchSprite__
#include "cocos2d.h"
enum CLickType{
CLICK_DOWN,//按下状态
CLICK_NORMAL//正常状态
};
class CTempTouchSprite:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate
{
public:
CTempTouchSprite();
~CTempTouchSprite();
virtual void onEnter();
virtual void onExit();
cocos2d::CCRect rect();
bool containsTouchLocation(cocos2d::CCTouch* touch);
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
// optional
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
static CTempTouchSprite* touchSpriteCreateWithTexture(const char* pFilePath);
private:
bool initSprite(const char* pFilePath);//初始化sprite相关的功能
CLickType m_clickType;
};
#endif /* defined(__TouchSprite__TempTouchSprite__) *///
// TempTouchSprite.cpp
// TouchSprite
//
// Created by LangYi on 13-8-22.
//
//
#include "TempTouchSprite.h"
USING_NS_CC;
CTempTouchSprite::CTempTouchSprite()
{
}
CTempTouchSprite::~CTempTouchSprite()
{
}
void CTempTouchSprite::CTempTouchSprite::onEnter()
{
m_clickType = CLICK_NORMAL;
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //注册单击事件
CCSprite::onEnter();
}
void CTempTouchSprite::CTempTouchSprite::onExit()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->removeDelegate(this); //注销单击事件
CCSprite::onExit();
}
bool CTempTouchSprite::initSprite(const char* pFilePath) //初始化sprite相关的功能
{
//可以设置sprite相关特性之类的
if( !CCSprite::initWithFile(pFilePath) )
{
return false;
}
return true;
}
CTempTouchSprite* CTempTouchSprite::touchSpriteCreateWithTexture(const char* pFilePath)
{
CTempTouchSprite* pTouchSprite = new CTempTouchSprite;
pTouchSprite->initSprite(pFilePath);
pTouchSprite->autorelease();
return pTouchSprite;
}
CCRect CTempTouchSprite::rect()
{
CCSize s = getTexture()->getContentSize();
return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
bool CTempTouchSprite::containsTouchLocation(CCTouch* touch)
{
return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
}
bool CTempTouchSprite::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if(m_clickType != CLICK_NORMAL)
{
return false;
}
if(!containsTouchLocation(pTouch))
{
return false;
}
CCLog("精灵被按下,点击开始!");
m_clickType = CLICK_DOWN;
return true;
}
// optional
void CTempTouchSprite::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
CCAssert(m_clickType == CLICK_DOWN, L"Paddle - Unexpected state!");
static bool bMoveIn = true;
if(!containsTouchLocation(pTouch))
{
//鼠标按下后已经移出精灵
bMoveIn = false;
CCLog("按下状态移动离开精灵!!!!");
return;
}
if(!bMoveIn)
{
bMoveIn = true;
CCLog("按下状态移动进入精灵!!!!");
}
CCLog("精灵按下点移动中!");
}
void CTempTouchSprite::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
CCAssert(m_clickType == CLICK_DOWN, L"Paddle - Unexpected state!");
m_clickType = CLICK_NORMAL;
if(!containsTouchLocation(pTouch))
{
CCLog("精灵点击结束单击位置不在精灵中!!!!");
return;
}
CCLog("精灵点击结束!!!!");
}
工程代码在这里:http://download.csdn.net/detail/lkysz0000/5993617