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

在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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值