转载自【黑米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
//
// SpriteClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#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
//
// SpriteClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "SpriteClassModel.h"
using
namespace
cocos2d
;
SpriteClassModel*
SpriteClassModel
::
spriteModelWithFile
(
const
char
*
spName
)
{
SpriteClassModel *
pobSprite
=
new
SpriteClassModel
(
)
;
if
(
pobSprite
&
amp
;
&
amp
;
pobSprite
-
&
gt
;
initWithFile
(
spName
)
)
//备注1
{
pobSprite
-
&
gt
;
myInit
(
)
;
pobSprite
-
&
gt
;
autorelease
(
)
;
return
pobSprite
;
}
CC_SAFE_DELETE
(
pobSprite
)
;
return
NULL
;
}
void
SpriteClassModel
::
myInit
(
)
{
CCLOG
(
"----测试init函数"
)
;
}
//---SpriteClassModel 按键-----------------
// 别忘记加入 TouchDispatcher ,TouchDispatcher一般放在onenter 绑定,onexit 删除
bool
SpriteClassModel
::
ccTouchBegan
(
CCTouch*
touch
,
CCEvent*
event
)
{
CCLog
(
"%s"
,
"精灵111~ccTouchBegan"
)
;
return
true
;
}
void
SpriteClassModel
::
ccTouchMoved
(
CCTouch*
touch
,
CCEvent*
event
)
{
//获取当前用户触屏点坐标并将3d坐标映射2d坐标系
CCPoint
touchPoint
=
touch
-
&
gt
;
locationInView
(
touch
-
&
gt
;
view
(
)
)
;
touchPoint
=
CCDirector
::
sharedDirector
(
)
-
&
gt
;
convertToGL
(
touchPoint
)
;
//touchPoint.x, getPosition().y
if
(
touchPoint
.
x
&
gt
;
CCDirector
::
sharedDirector
(
)
-
&
gt
;
getWinSize
(
)
.
width
/
2
)
{
CCLog
(
"%s"
,
"精灵22~~ccTouchMoved"
)
;
}
}
void
SpriteClassModel
::
ccTouchEnded
(
CCTouch*
touch
,
CCEvent*
event
)
{
CCLog
(
"%s"
,
"精灵33~~~ccTouchEnded"
)
;
}
//---SpriteClassModel 起始结束的生命周期函数----
void
SpriteClassModel
::
onEnter
(
)
{
//注册监听 1.dele类,2.优先级,3.YES为阻碍其他类的move 和 end
CCTouchDispatcher
::
sharedDispatcher
(
)
-
&
gt
;
addTargetedDelegate
(
this
,
0
,
true
)
;
CCSprite
::
onEnter
(
)
;
}
void
SpriteClassModel
::
onExit
(
)
{
//移除监听
CCTouchDispatcher
::
sharedDispatcher
(
)
-
&
gt
;
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
//
// NodeClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#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
//
// NodeClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "NodeClassModel.h"
using
namespace
cocos2d
;
NodeClassModel*
NodeClassModel
::
NodeModelWithInit
(
)
{
NodeClassModel *
mynode
=
new
NodeClassModel
(
)
;
if
(
mynode
)
{
mynode
-
&
gt
;
myInit
(
)
;
mynode
-
&
gt
;
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
//
// LayerClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#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
)
;
//用于允许CCScene::node();
}
;
#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
|
//
// LayerClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-7.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "LayerClassModel.h"
using
namespace
cocos2d
;
static
LayerClassModel*
shredStatic
;
//备注1
static
bool
s_bFirstRun
=
true
;
//备注2
LayerClassModel*
LayerClassModel
::
sharedLayerClassModel
(
void
)
{
if
(
s_bFirstRun
)
//备注3
{
s_bFirstRun
=
false
;
}
return
shredStatic
;
}
CCScene*
LayerClassModel
::
scene
(
)
{
// 'scene'自动释放内存
CCScene *
scene
=
CCScene
::
node
(
)
;
// 'layer' 自动释放内存
LayerClassModel *
layer
=
LayerClassModel
::
node
(
)
;
scene
-
&
gt
;
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一个不需要继承任何父类,模版如下:
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
|
StaticClassModel
.
h
//
// StaticClassModel.h
// Oh!MonsterMR
//
// Created by Himi on 12-3-8.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#ifndef Oh_MonsterMR_StaticClassModel_h
#define Oh_MonsterMR_StaticClassModel_h
#include "cocos2d.h"
class
StaticClassModel
{
public
:
static
StaticClassModel*
sharedStaticClassModel
(
void
)
;
void
myInit
(
)
;
virtual
~
StaticClassModel
(
)
;
//
void
testFun
(
)
;
}
;
#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
|
StaticClassModel
.
cpp
//
// StaticClassModel.cpp
// Oh!MonsterMR
//
// Created by Himi on 12-3-8.
// Copyright (c) 2012年 Augustimpression. All rights reserved.
//
#include "StaticClassModel.h"
using
namespace
cocos2d
;
static
StaticClassModel
shredStatic
;
static
bool
s_bFirstRun
=
true
;
StaticClassModel*
StaticClassModel
::
sharedStaticClassModel
(
void
)
{
if
(
s_bFirstRun
)
{
shredStatic
.
myInit
(
)
;
s_bFirstRun
=
false
;
}
return
&
amp
;
shredStatic
;
}
void
StaticClassModel
::
myInit
(
)
{
|
1
|
shredStatic
=
this
;
|
1
2
3
4
5
6
7
8
9
10
|
CCLOG
(
"----测试Static init函数"
)
;
}
void
StaticClassModel
::
testFun
(
)
{
CCLOG
(
"-测试fstatic fun-"
)
;
}
StaticClassModel
::
~
StaticClassModel
(
)
{
CCLOG
(
"---析构函数"
)
;
}
|
基本代码都该有的注释都已经写仂,很容易理解,本篇供Cocos2dx的新童鞋一个参考吧 :ty: