cocos2d-x 精灵监听点击事件

1、cocos2d-x的基本运行环境搭建就不介绍了,自己去网上搜索

2、本贴发表精灵监听点击事件的示例

创建精灵后,要响应自定义点击事件,最好是把监听事件加在精灵上,在层上监听也可以满足要求,不过得遍历当前层上的所有精灵,根据精灵的位置判断是不是点击的精灵。下面看代码

A  接口说明

#include "cocos2d.h"

#include "PicLayer.h"

#include <iostream>

 

usingnamespacecocos2d;

class SpriteClassModel : publiccocos2d::CCSprite ,publicCCTouchDelegate

{

    public :static SpriteClassModel*  create(const char *pszFileName);

    CCRect getRect();

    private :int spriteState =0;

    private : PicLayer* piclayer;

    private : int randomNum =0;

    public : virtual void setRandomNum(int randomNum);

    public : virtual void setCurrentLayer(PicLayer *layer);

    

    virtual void  playLeafAnim(CCSprite *spriteLeaf);

    

    //virtual void create();

    //添加触屏委托,重新此方法

    virtual void onEnter();

    //移除监听事件,防止内存溢出

    virtual void   onExit()

    virtual void endRotate();

    

    //触屏响应重写这三个方法

    virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);//按下

    virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);//拖动

    virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);//松开

};

 

这是我自定义的精灵类,需要参看几个方法:

第一,加载精灵时,会自动调用此方法,需要注册监听,在实现方法里注册

    //添加触屏委托,重新此方法

    virtual void onEnter();

第二,响应事件,重写以下方法,一般在began中根据点击位置判断是否是当前的精灵

//触屏响应重写这三个方法

    virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);//按下

    virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);//拖动

    virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);//松开

注意,此接口继承了CCSprite,用来声明自己的精灵类,继承了CCTouchDelegate用来注册实现监听委托,同时,自定义精灵还需要声明自己的create方法 public :static SpriteClassModel*  create(const char *pszFileName);这样才能实例化自己的精灵类,接口说明到这里

B实现类

 

 实现类中主要是实现了接口中定义的方法,重点看create方法和监听实现方法

using namespace cocos2d;

using namespace std;

 

//创建精灵的类,用来声明自己的精灵对象,加入层中显示

 SpriteClassModel* SpriteClassModel::create(const char *pszFileName)

{

    SpriteClassModel *pobSprite = new SpriteClassModel();

    if (pobSprite && pobSprite->initWithFile(pszFileName))

    {

        pobSprite->autorelease();

        return pobSprite;

    }

    CC_SAFE_DELETE(pobSprite);

    return NULL;

}

 //系统自动调用,注册监听委托

void SpriteClassModel::onEnter()

{

    CCDirector* pDirector = CCDirector::sharedDirector();

    //添加一个触摸委托给dispatcher的列表,委托对象this,

    pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);

    CCSprite::onEnter();

}

//获取精灵的位置

CCRect  SpriteClassModel::getRect()

{

return CCRectMake(getPositionX() - getContentSize().width * getAnchorPoint().x,

                      getPositionY() - getContentSize().height * getAnchorPoint().y,

                      getContentSize().width, getContentSize().height);

// 为了能够自定义自己的位置大小采用了低效的函数而不是直接用成员变量

}

 

void SpriteClassModel::ccTouchEnded(CCTouch* pTouch, CCEvent* event)

{

   }

 

//点击事件,开始点击,判断点击坐标是在精灵的区域内

bool SpriteClassModel::ccTouchBegan(CCTouch* touch, CCEvent* event)

{

 

    CCPoint touchLocation = touch->getLocation(); // 返回GL坐标

    CCPoint localPos = convertToNodeSpace(touchLocation);

    CCRect rc = getRect();

    rc.origin = CCPointZero;

    bool isTouched = rc.containsPoint(localPos);

    if(isTouched)

    {

        printf("我被点中了!\n");

         

            return true;

 

        }else{

            return false;

        }

    }else{

        printf("没有点中");

        return false;

    }

 

}

 voidSpriteClassModel::onExit()

{
     //移除监听
     CCTouchDispatcher::sharedDispatcher()->removeDelegate( this );
     CCSprite::onExit();
}

void SpriteClassModel::ccTouchMoved(CCTouch* touch, CCEvent* event)

{

    

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值