cocos2d-x 游戏开发新手细节问题

这都是我自己在刚接cocos2d-x时有时会犯的错误,特写下来记录一笔。

 

一、音乐音效的播放


  1. //添加SimpleaudioEngine.h  
  2. #include "SimpleAudioEngine/SimpleAudioEngine.h"  
  3.   
  4. //播放背景音乐的代码  
  5. SimpleAudioEngine::getSharedEngine()->playBackgroundMusic("background-music-aac.mp3");  
  6.   
  7. //播放音效的代码  
  8. SimpleAudioEngine::getSharedEngine()->playEffect("pew-pew-lei.wav");  


 

苹果自己音乐文件的格式caf。cocos2d-x下的SimpleAudioEngine对mp3和wav这两种大众格式都支持。


二、场景类的初始化工作

       在objc的头文件中,可以不声明类成员函数,而直接在.m文件里实现。但是cpp不允许这样做。所以coco2d-x里面有一个init的方法。提供了累世的功能,所有继承自CCNODE的都有init方法。

 

       我马上想到了,既然父类都有了,我就可以直接从父类继承下来,使用self强制转化为指向自己的对象,这样子类就不用自己实现了。

 

       实际上是不行的,cpp没有self关键字。不能像OC那样直接从父类继承下来靠self关键字变成指向自己的对象。所以我们看到所有类都有一个node()方法,它集合了new,init,autorelease等方法,可以减少调用者的代码量。但是几乎每次都是一样的,所以我们可以使用cocos2d-x提供的一个宏来实现。

 

       LAYER_NODE_FUNC和SCENE_NODE_FUNC。但是如果想使用这两个宏,就必须在派生类里实现bool init()方法。 

 

三、为什么一定要在构造函数结束后调用init()

       主要是因为C++构造函数有个缺陷,就是没有返回值。所以我们在C++构造函数异常时只能采取try-catch捕捉。而一般不推荐使用try-catch,主要是开启try-catch支持会使编译后的二进制程序增加不少体积,(我发现android NDK好像也不支持try-catch)。

 

       cocos2d-x采取了现在比较流行的“二阶段构造”的方法,即使用时先调构造函数,再调用init处理初始化逻辑。这种思路不论是在苹果iOS的接口设计(比如[[NSString alloc] init],即二阶段构造)、还是在samsung bada操作系统使用C++类时都是如此。

 
四、set/get方法

在cocos2dx\include\CCPlatformMacros.h中实现了一系列的宏定义,可以自己看看。

比如有一个CCX_SYNTHESIZE_READONLY宏,可以用来实现了只读的类成员变量,也就是只有get方法。

 

五、对象释放


建议在CPP的类构造函数里,对所有成员变量初始化,并在构造函数把释放的对象指针初始化为NULL。
retain了一定记得release。对于xxxwithxxx初始化出来的对象,一般会autorelease。不需要自己release。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值