cocos2d-x 是男人就下100层 附源码

1.效果图:

 

  

 

玩法:

一个不断下降的小人,点击屏幕的left或者right控制小人的移动方向,尽可能生存久些. 为什么要搞这个游戏呢?因为在2012年的8月份,我完成它的android版本,见《自己写的第一个android 游戏“是男人就下100层”》。没有从事游戏开发工作,编程进步真是慢,不过还是有点进步。这次在学习cocos2d-x,就改编了下。文章篇幅有限,不能什么都讲,讲下之前几篇文章没提到的东西。

 

2.cocos2d-x 中的音效播放

 

看过前几篇文章的读者知道,我似乎都没提到音效这个问题,这次我们来看下这个问题。cocos2d-x使用了SimpleAudioEngine作为跨平台的播放音效解决方案。从名字中就可以发现非常的simple。

 

 

2.1用之前先preload下,据说会占用内存。

 

SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(“background.mp3”); 
SimpleAudioEngine::sharedEngine()->preloadEffect(“buffle.wav”);

不同平台支持的音乐格式不一样,比较麻烦,像android支持ogg,win 32就不支持了。这里我用了windows下的强大的”格式工厂”软件,各种音乐格式转换都有。

 

 

2.2 播放背景音乐或音效

 

SimpleAudioEngine::sharedEngine()->playBackgroundMusic(“background.mp3”,true);// true means loop
SimpleAudioEngine::sharedEngine()->playEffect(“buffle.wav”);

 

2.3 销毁音乐

 

SimpleAudioEngine::end();

其他关于音效的具体地可以看下官方例子 “CocosDenshionTest”

 

3.游戏存储 CCUserDefault的使用

 

我们知道游戏一般会记录最高分啊,游戏进度,还有用户配置啊等信息。一般可以以XML或者数据库的形式来保存,更高级点的要保存在服务器端,方便跨平台同步进度。我们这个游戏太简单了,我只有保存了最高分和用户是否开启音效这两个东西。用XML的形式保存的。用到了CCUserDefault。

可以参考官方的“UserDefaultTest”例子。

下面是本游戏中的使用,先得到最高分,如果当前分数比之前最高分要高就保存下来。非常的简单。

 

int highScore = CCUserDefault::sharedUserDefault()->getIntegerForKey(HighScoreKey);

if(getFloorCount() > highScore){

CCUserDefault::sharedUserDefault()->setIntegerForKey(HighScoreKey,getFloorCount());

}

 

4.扯扯游戏中的一些实现方式

 

从2,3得知,一些简单的东西,游戏框架都会提供很方便的解决方案,我们主要要关注游戏的具体实现。

 

4.1 人物下降,左右移动

 

 

因为没有用物理引擎,所以照旧用了一个vector(向量)。这样人物就会下降了。点击左右方向会改变vector的x值。

 

4.2 板子向上移动

 

简单地在每一帧中改变板子y的位置。

 

4.3 板子的初始化

 

这可能是本游戏最要关注的地方,因为就6种板子,而且宽度高度都一样,只是贴图不一样,这里就用了一个board类,没有搞继承。用了enum来表示不同类型。

typedef enum{
kNormalBoard,      //0
kRollingBoard,     //1
kRotateLeftBoard,  //2
kRotateRightBoard, //3
kStarBoard,        //4
kSpringBoard       //5
}BoardType;

 

 

主要麻烦的是游戏的难度控制,肯定是要随机出板子的,我这里还是用了给定数组,然后洗牌的方式:

int level1[] = {0,0,0,0,0,0,0,1,1,1,1};
int level2[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3};
int level3[] = {0,0,0,0,0,0,0,0,0,0,0,0,5,5,1,1,1,2,2,3,3};
int level4[] = {0,0,0,0,0,0,0,0,0,0,0,5,5,5,1,1,1,2,2,3,3};
int level5[] = {0,0,0,0,0,0,0,0,0,4,4,5,5,5,1,1,1,2,2,3,3};
int level6[] = {0,0,0,0,0,0,0,0,4,4,4,5,5,5,1,1,1,2,2,3,3};
int level7[] = {0,0,0,0,0,0,0,4,4,4,4,5,5,5,1,1,1,2,2,3,3};
int level8[] = {0,0,0,0,0,0,4,4,4,4,5,5,5,5,1,1,1,2,2,3,3};
int level9[] = {0,0,0,0,0,4,4,4,4,4,5,5,5,1,1,1,1,2,2,3,3};
int level10[] = {0,0,0,0,4,4,4,4,5,5,5,5,1,1,1,1,2,2,3,3};

 

搞了10关,数字就是板子的类型。

 

 

板子的无限生成机制:

开始会生成20个放到数组中CCArray,然后板子升到一定的高度就会remove掉,当板子的数量小于10的时候就会重新根据当前级别生成10个板子。

 

4.4 人物与板子的碰撞检测

 

人物定了几个状态用enum,有些都没用到了。

typedef enum{
kBobJump,
kBobFall,
kBobHitTop,
kBobSuperMan,
kBobOnBoard,
kBobOnStarBoard,
kBobDie,
kBobOnRightRotateBoard,
kBobOnLeftRotateBoard,
kBobOnRollingBoard,
kBobOnSpringBoard,
kBobColliteWithNothing
} BobState;

碰撞还是非常的简单,矩形与矩形的碰撞。碰撞后,改变人物的状态。在每一帧中根据状态做不同的事情。

 

5.未来这个游戏可以改进的地方

 

可以用box2d来改写,普通的还是有问题,弹簧总是现实不好。

还只是win32的实现,看下弄到android中,改用设备的sensor来控制人物移动。

之前大量的玩了doodle jump,发现还是向上比较好玩,向下其实蛮无趣的。

cocos2d jsb 打包 Android APK》(Android打包可以参考这篇文章类似的,只是项目不一样)

6.游戏源码下载

 

 开发工具vs2010,解压工具7z,cocos2d-x版本 2.2.1

 FallMan.7z(本地下载)

https://github.com/waitingfy/FallMan

第一次用了github,在一个差公司待久了真的技术进步很慢,总算用了下非常流行的github,这样就可以持续地升级项目,欢迎关注,而不是一个zip了。当然还是会提供压缩文件的下载。

 

7.游戏动态gif

 

http://www.waitingfy.com/archives/867

Tags: , ,

867

One Response to cocos2d-x 是男人就下100层 附源码

  1. sadikelong说道:

    Good!

Leave a Reply

Name and Email Address are required fields.
Your email will not be published or shared with third parties.