您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 游戏开发----给单个精灵绑定点击事件

2013-08-22 15:57 531 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐