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人物下降,左右移动

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

因为没有用物理引擎,所以照旧用了一个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来控制人物移动。

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


6.游戏源码下载


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

http://www.waitingfy.com/?attachment_id=871(本地下载)

https://github.com/waitingfy/FallMan


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


7.游戏动态gif




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值