首页 > 编程语言 >cocos2d-x 是男人就下100层 附源码

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

时间:2022-11-28 23:31:57浏览次数:81  
标签:音效 游戏 int SimpleAudioEngine 板子 源码 cocos2d 100


1.效果图:


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

  

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


玩法:

一个不断下降的小人,点击屏幕的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



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


标签:音效,游戏,int,SimpleAudioEngine,板子,源码,cocos2d,100
From: https://blog.51cto.com/u_7920880/5893813

相关文章