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;
}
}
void
SpriteClassModel::onExit()
{
//移除监听
CCTouchDispatcher::sharedDispatcher()->removeDelegate(
this
);
CCSprite::onExit();
}
void SpriteClassModel::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
}