cocos2d-x-3.0 alpha1与C++11练习七:飞镖忍者,添加新的Scene,做一些锦上添花的修饰


一款简单的游戏基本上已经完成了,但是我们可以在其中加入一些修饰,让它显得更专业一些。这一次,我们将会添加新的场景。当你干掉一定数量的怪物时,在屏幕上显示“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系字符串有两种:

  1. 一是字符数组,如chat message[] = "You win"
  2. 一是字符指针,如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,内存分配在栈区,函数退出后便会自动释放。

 

参考:

  1. http://blog.csdn.net/wangtie_123/article/details/9629111
  2. C字符串和C++字符串:http://lukas06.blog.sohu.com/83102890.html
  3. 原教程:http://cocos2d.cocoachina.com/resource/show?nid=76
  4. http://blog.itpub.net/16856446/viewspace-612834

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值