一款简单的游戏基本上已经完成了,但是我们可以在其中加入一些修饰,让它显得更专业一些。这一次,我们将会添加新的场景。当你干掉一定数量的怪物时,在屏幕上显示“You Win”,而当有怪物逃出屏幕左侧时,显示“You Lose”。
1,接口定义
在xcode项目上添加一个GameOverScene.cpp文件,这将自动添加一个GameOverScene.h,初始的h文件,并未引用cocos2d.h,需将其修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#ifndef __cocos2dx3sample__GameOverScene__
#define __cocos2dx3sample__GameOverScene__
#include "cocos2d.h"
USING_NS_CC;
class
GameOverScene:
public
cocos2d::LayerColor
{
public
:
bool
initWithWon(
int
won);
static
cocos2d::Scene* sceneWithWon(
bool
won);
CREATE_FUNC(GameOverScene);
};
#endif /* defined(__cocos2dx3sample__GameOverScene__) */
|
宏CREATE_FUNC用于创建一个自动释放当前对象,其中调用了init方法,源码见下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#define CREATE_FUNC(__TYPE__) \
static
__TYPE__* create() \
{ \
__TYPE__ *pRet =
new
__TYPE__(); \
if
(pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return
pRet; \
} \
else
\
{ \
delete
pRet; \
pRet = NULL; \
return
NULL; \
} \
}
|
CREATE_FUNC可以作为标配,在每一个Scene中添加了。create方法,将会在sceneWithWon中用到。
2,实现
实现GameOverScene.cpp,代码如下:
原教程中定义了一个gameOverDone的函数,这里以lambda表达式代替,意在练习。 向Director::getInstance()->replaceScene传递的,均是scene*系静态方法,这类方法创建的均是自动释放对象。
编译&运行,效果:
至此,飞镖忍者以cocos2d-x 3.0改写已经完成。
3,关于chat *变量警告
上述代码,会有一个警告:
1
|
Conversion from string literal to
'char *'
is
deprecated
|
这警告着落在message的赋值上。因在c++中,字符串字面值是常量,修改chat *类型为const chat *便可:
1
2
3
4
5
6
7
8
|
...
const
char
*message;
if
(won) {
message =
"You win"
;
}
else
{
message =
"You lose"
;
}
...
|
在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾的字符数组才是C字符串,否则只是一般的C字符数组。
C字符串定义时可以利用"="号进行初始化,但是以后不能利用"="对C字符串进行赋值。对C字符串的操作需要通过"string"文件中定义的字符串处理函数。例如:
1
2
3
4
5
6
7
|
//字符串的初始化
char
a[11] =
"huanying"
;
//字符串的赋值
strcpy
(a,
"nihao"
)
//获取字符串的长度,不包括'\0'在内
strlen
(a);
printf
(
"%s"
,a);
|
在C中也可以使用字符指针来访问一个字符串,通过字符指针指向存放字符串数组的首元素地址来进行访问.
1
2
|
char
*a =
"nihao"
;
printf
(
"%s"
,a);
|
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作。以下是C字符串和C++中string的区别:
C字符串 | string对象 | |
所需的头文件名称 | <string>或<string.h> | <string>或<string.h> |
为什么需要头文件 | 为了使用字符串函数 | 为了使用string类 |
如何声明 | char name[20]; | string name; |
如何初始化 | char name[20]="nihao"; | string name = "nihao"; |
必须声明字符串长度么? | 是 | 否 |
使用一个null字符么? | 是 | 否 |
怎样实现字符串赋值 | strcpy(name,"John"); | name = "John"; |
其他优点 | 更快 | 更易于使用,优选 |
可以赋一个比现有字符更长的字符串么? | 不能 | 可以 |
4,如何释放c系字符串
c系字符串有两种:
- 一是字符数组,如chat message[] = "You win"
- 一是字符指针,如chat *message = "You lose"
对于字符指针,使用以下方法释放:
1
2
|
delete
[]message;
//是delete []message,并不是delete message
message = NULL;
|
对于字符数组,并不能使用delete释放,作为函数局部变量,它在函数退出时会自动释放。
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
上文中的字符指针*message,内存分配在栈区,函数退出后便会自动释放。
参考:
- http://blog.csdn.net/wangtie_123/article/details/9629111
- C字符串和C++字符串:http://lukas06.blog.sohu.com/83102890.html
- 原教程:http://cocos2d.cocoachina.com/resource/show?nid=76
- http://blog.itpub.net/16856446/viewspace-612834