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来控制人物移动。
之前大量的玩了doodle jump,发现还是向上比较好玩,向下其实蛮无趣的。
《cocos2d jsb 打包 Android APK》(Android打包可以参考这篇文章类似的,只是项目不一样)
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