#黄金矿工
好久没有写点东西了,最近工作有一点忙,生活上事情也比较繁琐,趁着最近有点时间,写个小游戏供大家娱乐下!随便恭喜木木同学被挖去了新公司,祝工作顺利~
##关于项目(代码下载地址在文章最下面点击GitHub链接)
项目说明:采用cocos2d-X3.12游戏引擎,基于C++开发,支持Android,iOS以及wp系统
开发工具:支持Xcode,eclipse,visual studio都可以,提前在机器上创建一个cocos2d-x的空工程,将Class文件删除,把下载好的代码Class文件拖入到工程,把res文件放入到项目的Resoures目录下运行就OK了~
辅助工具:`Cocostudio`
项目比较简单,适合有一定编程经验对游戏有兴趣想入门的同学.
![游戏截图](http://ww4.sinaimg.cn/mw690/0068uRu1jw1fakp2ilr4og306o04g1ky.gif)
![游戏截图](http://ww2.sinaimg.cn/mw690/0068uRu1jw1fakp2l0lzfg306o04g4qr.gif)
![游戏截图](http://ww1.sinaimg.cn/mw690/0068uRu1jw1fakp2hy574j30df09075z.jpg)
![粒子效果](http://ww2.sinaimg.cn/mw690/0068uRu1jw1fakp2hig76g306o04g1kz.gif)
###首页场景
本游戏的布局基本都是cocostudio布局的,放一张在cocostudio中布局的样式图
![cocostudio布局样式](http://ww2.sinaimg.cn/mw690/0068uRu1gw1famxlucyp7j311g142akx.jpg)
通过CSLoder加载csb文件添加到对应的场景中展示,具体代码如下
```cpp
auto mainCsb = CSLoader::createNode("csb文件名");
this->addChild(mainCsb);
```
Logo放大出现动画也在cocostudio中创建,通过CSLoader获取Timeline对象,播放指定的帧动画
```cpp
animation = CSLoader::createTimeline("Layer.csb");
mainCsb->runAction(animation);
// 播放指定的动画
animation->gotoFrameAndPlay(0, 25, false);
```
云飘动动画以及人物吹口哨抖腿的动画都是通过代码实现的,当然也可以在cocostudio中制作骨骼动画,通过在工程中加载导出的js文件播放动画也可以,这里的动画比较简单,就直接通过代码实现了,如果项目中用到比较复杂的动画推荐采用加载js动画的方式.这里由于没有用到骨骼动画,就不做相应的介绍了,有兴趣的同学可以自己研究下~
由于游戏需要用到存储的数据比较小,这里对用户游戏数据持久化存储是采用`UserDefault`来进行.如果项目中需要存储的数据量比较庞大,建议使用数据库建表来进行存储,这样更方便数据的查询与管理.
在工程中通过一个单例`UserDataManager`来管理用户的数据,提供背景音乐是否静音,音效是否静音,用户账户金币以及当前游戏的关数四个成员变量.
```c++
UserDataManager *UserDataManager::getInstance()
{
if (s_SharedUserDataManager == nullptr) {
s_SharedUserDataManager = new UserDataManager();
s_SharedUserDataManager->_musicMute = UserDefault::getInstance()->getBoolForKey(musicMuteKey, false);
s_SharedUserDataManager->_soundMute = UserDefault::getInstance()->getBoolForKey(soundMuteKey, false);
s_SharedUserDataManager->_allMoney = UserDefault::getInstance()->getIntegerForKey(userAllMoneyKey, 0);
s_SharedUserDataManager->_stageNum = UserDefault::getInstance()->getIntegerForKey(userStageNumKey, 1);
}
return s_SharedUserDataManager;
}
```
监听按钮的点击事件,可以在cocostudio中对节点进行命名,然后在代码中通过下面方法获取对应name的节点
```c++
// 获取startButton节点
auto startBtn = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Widget *>(mainCsb), "startButton"));
```
需要注意的是,按钮点击回调函数需要在.h文件提前声明,或者可以采用lambda表达式也可
- 采用函数的回调写法
// 添加按钮的事件
```c++
tartBtn->addTouchEventListener(CC_CALLBACK_2(MainLayer::startButtonTouch, this));
```
- 采用lambda表达式写法
```c++
startBtn->addTouchEventListener([=](Ref *sender, Widget::TouchEventType touchType){
// button click callBack
});
```
StartButton点击后会有两个逻辑:通过`UserDataManager`获取用户游戏关数
- 用户没有游戏记录或者当前记录是游戏是第一关,直接进入游戏场景,开始游戏.
- 用户有游戏记录并且关数大于1,直接进入商店场景.
###商店场景
同样也是通过采用cocostudio来进行布局的,效果如下
![商店场景cocostudio效果](http://ww1.sinaimg.cn/mw690/0068uRu1gw1famyje8uddj318s0z6k14.jpg)
商店场景也比较简单,账户余额通过上文中的`UserDataManager`可以获取用户的金币数.
```
UserDataManager::getInstance()->getUserAllMoney();
```
商品采用Button来展示,这样可以获取玩家选择的当前商品,每一个商品只能购买一次,如果购买了商品后,对应商品上显示1的图标.商品描述通过点击商品,展示对应的商品作用描述.
```c++
auto csb = CSLoader::createNode("ShopScene.csb");
this->addChild(csb);
// 添加商品描述容器
goodsDesVec.push_back(Value("炸药.购买以后,当抓到较重且金额不多的物品时,按下上方炸药即可炸毁物品,以便节省时间.功效为下一关"));
goodsDesVec.push_back(Value("力量药水.购买以后,在下一关力量会增加,抓到物品后拉回速度会增加20%.功效为下一关"));
goodsDesVec.push_back(Value("优质矿石.购买后在下一关中收购钻石的价格将变成原价格的3倍,但不保证下一关一定会有钻石~其效果为下一关"));
goodsDesVec.push_back(Value("矿石收藏书.购买后下一关的矿石的价格将会是原有价格的3倍,其功效为下一关"));
// 初始化商品描述Text
goodsDesText = static_cast<Text *>(Helper::seekWidgetByName(static_cast<Widget *>(csb), "shopDetail"));
Text *userMoney = static_cast<Text *>(Helper::seekWidgetByName(static_cast<Widget *>(csb), "userMoney"));
userMoney->setString("$" + to_string(UserDataManager::getInstance()->getAllMoney()));
// 获取购买按钮.并且添加按钮的点击事件
Button *buyButton = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Widget *>(csb), "buyButton"));
buyButton->addTouchEventListener([=](Ref *sender, Widget::TouchEventType type){
if (type == Widget::TouchEventType::ENDED) {
int index = lastSelected->getTag() - 1;
auto oneIV = buyOnes.at(index);
if (oneIV->isVisible()) {
return;
}
// 获取商品价格
int price = 0;
switch (index) {
case 0:
price = kBombPrice;
break;
case 1:
price = kPotionPrice;
break;
case 2:
price = kDiamondsPrice;
break;
case 3:
price = kStoneBookPrice;
break;
}
if (UserDataManager::getInstance()->getAllMoney() - payMoneyCount - price >= 0) {
payMoneyCount += price;
userMoney->setString("$" + to_string(UserDataManager::getInstance()->getAllMoney() - payMoneyCount));
oneIV->setVisible(true);
}
}
});
```
点击下一关,切换到游戏场景.
###游戏场景
一样也是在cocostudio中布局,这里需要注意的是并不是采用一个csb文件就全部将节点添加完毕,这里分三块布局,如下图所示三块
![顶部](http://ww4.sinaimg.cn/mw690/0068uRu1gw1famz3276kvj30u00k4401.jpg)
![level](http://ww4.sinaimg.cn/mw690/0068uRu1gw1famz31cvksj30tq0jwmzy.jpg)
![钩子](http://ww4.sinaimg.cn/mw690/0068uRu1gw1famz31q41tj308o06ua9y.jpg)
游戏Layer提供一个快速创建场景的方法
```c++
// 参数分别为 是否购买了炸弹.力量药水.砖石升值书.石头收藏书.在商店的花销
static Scene *createScene(bool isBuyBomb, bool isBuyPotion, bool isBuyDiamonds, bool isStoneBook, int payMoney);
```
在上
生瓜蛋子
- 粉丝: 3927
- 资源: 7441
最新资源
- (175923204)JAVAWEB校园订餐系统项目源码.rar
- (170624028)ffmpeg+SDL2的简易流媒体播放器,仅供大家参考学习 缺少dll库,在我资源里面下载ffmpeg+SDL2较新发布那个有
- 基于java+ssm+mysql+微信小程序的付费自习室系统 源码+数据库(高分毕业设计).zip
- (14638450)最简单的基于FFMPEG+SDL的音频播放器(2014.5.6)
- 基于java+springboot+mysql+微信小程序的校园点餐系统 源码+数据库+论文(高分毕业设计).zip
- (174871244)自适应动态规划(近似动态规划)-ADP MATLAB-MATLAB编程
- (175426820)ChatGPT接入项目实例【 AI问答小程序源码-内置3.5接口】.rar
- (21614630)STM32F10xUSB开发工具包-cn 20181126
- 简单的登录系统-MySQL+Node.JS服务端+HTML+JS
- 全自动焊锡机sw18可编辑全套技术资料100%好用.zip
- 平台所需服务器、数据库、操作系统安全技术要点梳理
- 使用py异步编程实现接口并发测试
- 批量QSO生成ADIF工具是一款方便快捷的工具,用于生成ADIF格式的QSO日志文件 通过输入一串QSO信息,用户可以轻松生成符合规范的ADIF文件,以便快速上传lotw日志
- IMG_1134.JPG
- qt/C++ 学习笔记 MD5文件重复搜索工具
- html+css 圣诞树html网页代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈