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

(转)【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&自定义类细节说明&Cocos2dx触屏事件讲解

2012-12-25 14:06 816 查看


本站文章均为李华明Himi原创,转载务必在明显处注明:

转载自【黑米GameDev街区】原文链接:http://www.himigame.com/iphone-cocos2dx/699.html


          ☞点击订阅☜
本博客最新动态!及时将最新博文通知您!

这里Himi又来了一篇基础篇…..不是因为充博文数量,而是Cocos2dX一个超级群里不少童鞋都有问过很基础的问题,Himi估计这些童鞋要么之前对C++不熟悉,要么就是之前没有接触过Cocos2d,而直接转入了Cocos2dx的开发行列中仂,这里首先给这些童鞋三个建议:

1.Cocos2dx的教程确实不多,但是因为Cocos2dx是Cocos2d一个繁衍的引擎,基本API没有大的变化,你只要将Cocos2d熟悉仂,那么X对你来说不会难的….

2.还是再次提醒大家多看看引擎自带的例子,对于很多基础问题,源码完全能照顾到的,不管是cocos2d的,还是cocos2dX的,但是如果你还不知道Cocos2d/X的引擎示例在哪….无语下…(在引擎包下哦)

3.还有不少童鞋抱着“赶快做完这个功能”的态度来工作来求助。。。这样不好的说,学开发跟学习一样,不思考就来答案的东西真的是浮云。。。建议大家遇到瓶颈的时候考虑下吧,禁忌饭来张口的童鞋;

入正题,开头就说仂本篇主要为了照顾下基础的童鞋,但是本篇也会介绍些在cocos2dx引擎中一些自定义类的模版的创建和使用;介绍过程中顺便把基础也说下,这样一举两得;

首先我们先看一个自定义精灵类如何来做:(先上代码,然后细说)

自定义精灵模版:

SpriteClassModel.h

//

//SpriteClassModel.h

//Oh!MonsterMR

//

//CreatedbyHimion12-3-7.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#ifndefOh_MonsterMR_SpriteClassModel_h

#defineOh_MonsterMR_SpriteClassModel_h

#include"cocos2d.h"

usingnamespacecocos2d;

classSpriteClassModel:publiccocos2d::CCSprite,publicCCTouchDelegate

{

public:

staticSpriteClassModel*spriteModelWithFile(constchar*spName);//静态创建(内存自动释放)

voidmyInit();//自定义初始化函数

virtual~SpriteClassModel();

//重写触屏相关函数----

virtualvoidonEnter();

virtualvoidonExit();

virtualboolccTouchBegan(CCTouch*touch,CCEvent*event);

virtualvoidccTouchMoved(CCTouch*touch,CCEvent*event);

virtualvoidccTouchEnded(CCTouch*touch,CCEvent*event);

};

#endif


SpriteClassModel.cpp

//

//SpriteClassModel.cpp

//Oh!MonsterMR

//

//CreatedbyHimion12-3-7.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#include"SpriteClassModel.h"

usingnamespacecocos2d;

SpriteClassModel*SpriteClassModel::spriteModelWithFile(constchar*spName)

{

SpriteClassModel*pobSprite=newSpriteClassModel();

if(pobSprite&&pobSprite->initWithFile(spName))//备注1

{

pobSprite->myInit();

pobSprite->autorelease();

returnpobSprite;

}

CC_SAFE_DELETE(pobSprite);

returnNULL;

}

voidSpriteClassModel::myInit(){

CCLOG("----测试init函数");

}

//---SpriteClassModel按键-----------------

//别忘记加入TouchDispatcher,TouchDispatcher一般放在onenter绑定,onexit删除

boolSpriteClassModel::ccTouchBegan(CCTouch*touch,CCEvent*event)

{

CCLog("%s","精灵111~ccTouchBegan");

returntrue;

}

voidSpriteClassModel::ccTouchMoved(CCTouch*touch,CCEvent*event)

{

//获取当前用户触屏点坐标并将3d坐标映射2d坐标系

CCPointtouchPoint=touch->locationInView(touch->view());

touchPoint=CCDirector::sharedDirector()->convertToGL(touchPoint);

//touchPoint.x,getPosition().y

if(touchPoint.x>CCDirector::sharedDirector()->getWinSize().width/2){

CCLog("%s","精灵22~~ccTouchMoved");

}

}

voidSpriteClassModel::ccTouchEnded(CCTouch*touch,CCEvent*event)

{

CCLog("%s","精灵33~~~ccTouchEnded");

}

//---SpriteClassModel起始结束的生命周期函数----

voidSpriteClassModel::onEnter()

{

//注册监听1.dele类,2.优先级,3.YES为阻碍其他类的move和end

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true);

CCSprite::onEnter();

}

voidSpriteClassModel::onExit()

{

//移除监听

CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);

CCSprite::onExit();

}

SpriteClassModel::~SpriteClassModel(){

CCLOG("---析构函数");

}


这个自定义精灵类的模版重点介绍3个点:

1.构造函数;

staticSpriteClassModel*spriteModelWithFile(constchar*spName);


此构造函数的实现机制,Himi仿制Cocos2dX引擎来做的,一方面使用方便,另外一方面内存自动释放;

2.在构造函数中,有个备注1,还没有看到的童鞋请回头看下,这里我使用的父类CCSprite的索引文件名的创建方式,如下:

initWithFile(<#constchar*pszFilename#>);


那么这里可以根据需要继续自定义使用父类的索引帧缓存文件名的方式,如下:

initWithSpriteFrameName(<#constchar*pszSpriteFrameName#>);


当然仂为了方便大家可以在自定义中多写几种构造,留好接口使用即可,那么这里Himi还自定义仂一个myInit()的函数,这个函数主要用途两点:1.用以清晰化操作,代码易读2.当此类多种构造函数并在的时候可以将此自定义精灵类的独有属性设置等都放入此函数中,代码复用;

3.关于触屏方面的,代码都有注释,不多说,唯一要提醒大家的就是当前Himi的这个精灵是采用触屏事件分发的机制进行处理的,而不是直接开启触屏开关(此方法太过于局限),那么如果对于这两种不太熟悉的童鞋请移步到如下文章:(cocos2d与cocos2dx类似)

【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)

关于CCNode的自定义这个不多说仂,类似自定义精灵只是继承父类有所变化,模版如下:

NodeClassModel.h

//

//NodeClassModel.h

//Oh!MonsterMR

//

//CreatedbyHimion12-3-7.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#ifndefOh_MonsterMR_NodeClassModel_h

#defineOh_MonsterMR_NodeClassModel_h

#include"cocos2d.h"

classNodeClassModel:publiccocos2d::CCNode

{

public:

staticNodeClassModel*NodeModelWithInit();

voidmyInit();

virtual~NodeClassModel();

};

#endif

下面介绍下自定义CCLayer的模版:(先上代码,后剖析)

LayerClassModel.h

//

//LayerClassModel.h

//Oh!MonsterMR

//

//CreatedbyHimion12-3-7.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#ifndefOh_MonsterMR_LayerClassModel_h

#defineOh_MonsterMR_LayerClassModel_h

#include"cocos2d.h"

usingnamespacecocos2d;

classLayerClassModel:publiccocos2d::CCLayer

{

public:

staticLayerClassModel*sharedLayerClassModel(void);

virtualboolinit();

staticcocos2d::CCScene*scene();

virtual~LayerClassModel();

LAYER_NODE_FUNC(LayerClassModel);//用于允许CCScene::node();

};

#endif


//

//LayerClassModel.cpp

//Oh!MonsterMR

//

//CreatedbyHimion12-3-7.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#include"LayerClassModel.h"

usingnamespacecocos2d;

staticLayerClassModel*shredStatic;//备注1

staticbools_bFirstRun=true;//备注2

LayerClassModel*LayerClassModel::sharedLayerClassModel(void)

{

if(s_bFirstRun)//备注3

{

s_bFirstRun=false;

}

returnshredStatic;

}

CCScene*LayerClassModel::scene()

{

//'scene'自动释放内存

CCScene*scene=CCScene::node();

//'layer'自动释放内存

LayerClassModel*layer=LayerClassModel::node();

scene->addChild(layer);

returnscene;

}

boolLayerClassModel::init(){

if(!CCLayer::init())

{

returnfalse;

}

shredStatic=this;

//初始化数据

returntrue;

}

LayerClassModel::~LayerClassModel(){

CCLOG("---析构函数");

}




关于自定义CCLayer模版中,我这里将触屏相关代码删除了,与自定义精灵的触屏实现一样没区别;

重点介绍3点:

1.CCLayer和CCScene两个类都是自动释放内存,这个提示在创建cocos2dx引擎模版默认HelloWorldScene类中已经有提示,可能大家没有注意到,所以这里强调下;

2.CCLayer经常会用于整个大的UI设计或者游戏中,他都作为主要的父类来使用,将游戏元素CCSprite,CCMenu,粒子等都添加到Layer中,所以此类在游戏中的交互性应该最强,所以在LayerClassModel模版中我添加了一个静态函数用于方便访问和其他类进行数据交互用(备注1),如下函数:

staticLayerClassModel*sharedLayerClassModel(void);


好处不用多说,如CCDirector一样使用,如:CCDirector::sharedDirector()->getWinSize();

3.备注2和备注3的作用防止当前类被重复创建,这个提醒下,不多介绍仂;

自定义的静态类与将CCLayer静态出来的方式类似,只是一个继承CCLayer一个不需要继承任何父类,模版如下:

StaticClassModel.h

//

//StaticClassModel.h

//Oh!MonsterMR

//

//CreatedbyHimion12-3-8.

//Copyright(c)2012年Augustimpression.Allrightsreserved.

//

#ifndefOh_MonsterMR_StaticClassModel_h

#defineOh_MonsterMR_StaticClassModel_h

#include"cocos2d.h"

classStaticClassModel

{

public:

staticStaticClassModel*sharedStaticClassModel(void);

voidmyInit();

virtual~StaticClassModel();

//

voidtestFun();

};

#endif
StaticClassModel.cpp

//
//StaticClassModel.cpp
//Oh!MonsterMR
//
//CreatedbyHimion12-3-8.
//Copyright(c)2012年Augustimpression.Allrightsreserved.
//

#include"StaticClassModel.h"

usingnamespacecocos2d;

staticStaticClassModelshredStatic;
staticbools_bFirstRun=true;

StaticClassModel*StaticClassModel::sharedStaticClassModel(void)
{
if(s_bFirstRun)
{
shredStatic.myInit();
s_bFirstRun=false;
}
return&shredStatic;
}

voidStaticClassModel::myInit(){
shredStatic=this;

CCLOG("----测试Staticinit函数");
}

voidStaticClassModel::testFun()
{
CCLOG("-测试fstaticfun-");}
StaticClassModel::~StaticClassModel()
{
CCLOG("---析构函数");
}




基本代码都该有的注释都已经写仂,很容易理解,本篇供Cocos2dx的新童鞋一个参考吧



Himi猜您感兴趣的文章:

【iOS-cocos2d-X游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
【iOS-cocos2d-X游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;
【iOS-cocos2d-X游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码加密!
【iOS-cocos2d-X游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可!
【iOS-cocos2d-X游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐