本站文章均为李华明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引擎中一些自定义类的模版的创建和使用;介绍过程中顺便把基础也说下,这样一举两得;
首先我们先看一个自定义精灵类如何来做:(先上代码,然后细说)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
自定义精灵模版:
SpriteClassModel.h
#ifndef Oh_MonsterMR_SpriteClassModel_h
#define Oh_MonsterMR_SpriteClassModel_h
#include "cocos2d.h"
using namespace cocos2d;
class SpriteClassModel : public cocos2d::CCSprite , public CCTouchDelegate
{
public :
static SpriteClassModel* spriteModelWithFile( const char *spName);
void myInit();
virtual ~SpriteClassModel();
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
};
#endif
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
SpriteClassModel.cpp
#include "SpriteClassModel.h"
using namespace cocos2d;
SpriteClassModel* SpriteClassModel::spriteModelWithFile( const char *spName)
{
SpriteClassModel *pobSprite = new SpriteClassModel();
if (pobSprite && pobSprite->initWithFile(spName))
{
pobSprite->myInit();
pobSprite->autorelease();
return pobSprite;
}
CC_SAFE_DELETE(pobSprite);
return NULL;
}
void SpriteClassModel::myInit(){
CCLOG( "----测试init函数" );
}
bool SpriteClassModel::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CCLog( "%s" , "精灵111~ccTouchBegan" );
return true ;
}
void SpriteClassModel::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
CCPoint touchPoint = touch->locationInView( touch->view() );
touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint );
if (touchPoint.x> CCDirector::sharedDirector()->getWinSize().width/2){
CCLog( "%s" , "精灵22~~ccTouchMoved" );
}
}
void SpriteClassModel::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
CCLog( "%s" , "精灵33~~~ccTouchEnded" );
}
void SpriteClassModel::onEnter()
{
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate( this , 0, true );
CCSprite::onEnter();
}
void SpriteClassModel::onExit()
{
CCTouchDispatcher::sharedDispatcher()->removeDelegate( this );
CCSprite::onExit();
}
SpriteClassModel::~SpriteClassModel(){
CCLOG( "---析构函数" );
}
|
这个自定义精灵类的模版重点介绍3个点:
1. 构造函数;
static SpriteClassModel* spriteModelWithFile(const char *spName);
此构造函数的实现机制,Himi仿制Cocos2dX引擎来做的,一方面使用方便,另外一方面内存自动释放;
2. 在构造函数中,有个备注1,还没有看到的童鞋请回头看下,这里我使用的父类CCSprite的索引文件名的创建方式,如下:
initWithFile(<#const char *pszFilename#>);
那么这里可以根据需要继续自定义使用父类的索引帧缓存文件名的方式,如下:
initWithSpriteFrameName(<#const char *pszSpriteFrameName#>);
当然仂为了方便大家可以在自定义中多写几种构造,留好接口使用即可,那么这里Himi还自定义仂一个myInit()的函数,这个函数主要用途两点:1.用以清晰化操作,代码易读 2.当此类多种构造函数并在的时候可以将此自定义精灵类的独有属性设置等都放入此函数中,代码复用;
3. 关于触屏方面的,代码都有注释,不多说,唯一要提醒大家的就是当前Himi的这个精灵是采用触屏事件分发的机制进行处理的,而不是直接开启触屏开关(此方法太过于局限),那么如果对于这两种不太熟悉的童鞋请移步到如下文章:(cocos2d与cocos2dx类似)
【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)
关于CCNode的自定义这个不多说仂,类似自定义精灵只是继承父类有所变化,模版如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
NodeClassModel.h
#ifndef Oh_MonsterMR_NodeClassModel_h
#define Oh_MonsterMR_NodeClassModel_h
#include "cocos2d.h"
class NodeClassModel : public cocos2d::CCNode
{
public :
static NodeClassModel* NodeModelWithInit();
void myInit();
virtual ~NodeClassModel();
};
#endif
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
NodeClassModel.cpp
#include "NodeClassModel.h"
using namespace cocos2d;
NodeClassModel* NodeClassModel::NodeModelWithInit()
{
NodeClassModel *mynode = new NodeClassModel();
if (mynode)
{
mynode->myInit();
mynode->autorelease();
return mynode;
}
CC_SAFE_DELETE(mynode);
return NULL;
}
void NodeClassModel::myInit(){
CCLOG( "----测试init函数" );
}
NodeClassModel::~NodeClassModel(){
CCLOG( "---析构函数" );
|
下面介绍下自定义CCLayer的模版:(先上代码,后剖析)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
LayerClassModel.h
#ifndef Oh_MonsterMR_LayerClassModel_h
#define Oh_MonsterMR_LayerClassModel_h
#include "cocos2d.h"
using namespace cocos2d;
class LayerClassModel : public cocos2d::CCLayer
{
public :
static LayerClassModel*sharedLayerClassModel( void );
virtual bool init();
static cocos2d::CCScene* scene();
virtual ~LayerClassModel();
LAYER_NODE_FUNC(LayerClassModel);
};
#endif
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include "LayerClassModel.h"
using namespace cocos2d;
static LayerClassModel* shredStatic;
static bool s_bFirstRun = true ;
LayerClassModel* LayerClassModel::sharedLayerClassModel( void )
{
if (s_bFirstRun)
{
s_bFirstRun= false ;
}
return shredStatic;
}
CCScene* LayerClassModel::scene()
{
CCScene *scene = CCScene::node();
LayerClassModel *layer = LayerClassModel::node();
scene->addChild(layer);
return scene;
}
bool LayerClassModel::init(){
if ( !CCLayer::init() )
{
return false ;
}
shredStatic= this ;
return true ;
}
LayerClassModel::~LayerClassModel(){
CCLOG( "---析构函数" );
}
|
关于自定义CCLayer模版中,我这里将触屏相关代码删除了,与自定义精灵的触屏实现一样没区别;
重点介绍3点:
1. CCLayer和CCScene 两个类都是自动释放内存,这个提示在创建cocos2dx引擎模版默认HelloWorldScene类中已经有提示,可能大家没有注意到,所以这里强调下;
2. CCLayer 经常会用于整个大的UI设计或者游戏中,他都作为主要的父类来使用,将游戏元素CCSprite,CCMenu,粒子等都添加到Layer中,所以此类在游戏中的交互性应该最强,所以在LayerClassModel模版中我添加了一个静态函数用于方便访问和其他类进行数据交互用(备注1),如下函数:
static LayerClassModel*sharedLayerClassModel(void);
好处不用多说,如CCDirector一样使用,如:CCDirector::sharedDirector()->getWinSize();
3.备注2和备注3的作用防止当前类被重复创建,这个提醒下,不多介绍仂;
自定义的静态类与将CCLayer静态出来的方式类似,只是一个继承CCLayer一个不需要继承任何父类,模版如下:
基本代码都该有的注释都已经写仂,很容易理解,本篇供Cocos2dx的新童鞋一个参考吧
分享到:
相关推荐
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-扩展动作 http://blog.csdn.net/tt5267621/article/details/7626450
Cocos2d-x 3.x游戏开发之旅教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 使用...
quick-cocos2d-x v3 是在 cocos2dx 3.x 的最新版本基础之上,移植了原来 quick-cocos2d-x 的核心框架、强大的 player 、丰富的示例等,并增加更多新的功能。 GitHub: https://github.com/dualface/v3quick
cocos2d-x手机游戏开发(跨android/ios/wp7/wp8/windows 8平台) 游戏课程特点: ---------------------------------------------------------- 1、国内首创跨平台游戏开发 2、深度讲解Cocos2D-X并运用于实战 3、...
Mac-OS-X-配置-Cocos2d-x-开发环境(iOS-和-Android).doc
Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。
4、【cocos2d-x IOS游戏开发-捕鱼达人4】基本游戏框架 资源引用页: 5、【cocos2d-x IOS游戏开发-捕鱼达人5】C++中函数代理与信号插槽机制 资源引用页: 6、【cocos2d-x IOS游戏开发-捕鱼达人6】实现开始菜单 资源...
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-瞬时动作 http://blog.csdn.net/tt5267621/article/details/7624781
iOS实例开发源码——iliu-ios-cocos2d-viking-cba07f8.zip
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
iOS游戏应用源代码——iliu-ios-cocos2d-viking-cba07f8.zip
9、【cocos2d-x IOS游戏开发-捕鱼达人9】鱼与动画 资源引用页: 10、【cocos2d-x IOS游戏开发-捕鱼达人10】鱼的产生和移动 资源引用页: 11、【cocos2d-x IOS游戏开发-捕鱼达人11】鱼的产生和移动:完善 资源引用页...
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发
cn.cocos2d-x.org上quick-cocos2d-x初学者教程的代码与资源。原始资源100多M,这个仅保留资源与代码,不包含quick 3.3 Final的框架代码。下载后可以用quick 3.3 player直接玩。
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-延时动作 http://blog.csdn.net/tt5267621/article/details/7625309
Cocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdfCocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdfCocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdf
【iOS-Cocos2d游戏开发】Cocos2d-iPhone动作Action-组合动作 http://blog.csdn.net/tt5267621/article/details/7626137
Cocos2d-x项目实战-射击类游戏-迷失航线,版本是Cocos2d-x-3.2