角色走完要求的步数后,先查看停留位置是否有问号,如果有,先处理问号事件,处理完毕后,再处理相邻周边上下左右地块问题,购买、升级或缴纳过路费。

问号随机事件主要是如下事件:

政府鼓励投资,返还税金10000

政府严查账务,补交税金20000

喝到假酒,上吐下泻,体力耗光

吃了大补丸,体力恢复

投资获利,分红20000

投资失败,亏损30000

由于还没有进行国际化处理,在用中文的时候,会出现乱码,我们暂时先都用英文处理一下,后期统一做国际化处理

1、与之对应的变量定义在ConstUtil.h文件中:

const int TAX_REBATES_TAG = 1; //政府鼓励投资,返还税金10000
const int PAY_TAXES_TAG = 2; //政府严查账务,补交税金20000
const int LOSS_STRENGTH_TAG =3;//喝到假酒,上吐下泻,体力耗光
const int PHYSICAL_RECOVERY_TAG =4;//吃了大补丸,体力恢复
const int INVESTMENT_DIVIDENDS_TAG = 5 ;//投资获利,分红20000
const int INVESTMENT_LOSS_TAG = 6; //投资失败,亏损30000#define  TAX_REBATES  "The government encourages investment, tax rebates 10000"
#define  PAY_TAXES "Government scrutiny of accounts, pay taxes 20000"
#define  LOSS_STRENGTH "To drink alcohol, diarrhea, loss of light strength"
#define  PHYSICAL_RECOVERY "Eat cake, physical recovery"
#define  INVESTMENT_DIVIDENDS "Investment profits, dividends 20000"
#define  INVESTMENT_LOSS "Investment failure, loss 30000"

2、在GameBaseScene.cpp初始化随机事件Map容器

void GameBaseScene::initRandomAskEvent()
{randomAskEventMap.insert(TAX_REBATES_TAG,__String::create(TAX_REBATES));randomAskEventMap.insert(PAY_TAXES_TAG,__String::create(PAY_TAXES));randomAskEventMap.insert(LOSS_STRENGTH_TAG,__String::create(LOSS_STRENGTH));randomAskEventMap.insert(PHYSICAL_RECOVERY_TAG,__String::create(PHYSICAL_RECOVERY));randomAskEventMap.insert(INVESTMENT_DIVIDENDS_TAG,__String::create(INVESTMENT_DIVIDENDS));randomAskEventMap.insert(INVESTMENT_LOSS_TAG,__String::create(INVESTMENT_LOSS));
}

3、当角色走完步数后,会调用到RicherGameController的handlePropEvent方法。

在该方法中我们判断角色停留的位置是否有问号,如果有,就发送一个问号信息MSG_RANDOM_ASK_EVENT,同时方法返回。如果没有问号,就调用aroundLandEvent()方法,这个方法是处理角色周边相邻上下左右地块信息的方法,我们把以前的代码抽取成了该方法,便于后期重复使用

void RicherGameController::handlePropEvent()
{oneRoundDone =false;float playerEnd_X = _colVector[stepsCount]*32;float playerEnd_Y = _rowVector[stepsCount]*32 + 32;Point pointInMap = Util::GL2map(Vec2(playerEnd_X,playerEnd_Y), GameBaseScene::_map);int endId = GameBaseScene::wayLayer->getTileGIDAt(pointInMap);if(endId == GameBaseScene::randomEvent_tiledID){String * str = String::createWithFormat("%d-%f-%f-%d",MSG_RANDOM_ASK_EVENT_TAG,pointInMap.x,pointInMap.y,_richerPlayer->getTag());NotificationCenter::getInstance()->postNotification(MSG_RANDOM_ASK_EVENT,str);return;}aroundLandEvent();
}

4、GameBaseScene.cpp中注册了对问号信息MSG_RANDOM_ASK_EVENT的处理

void GameBaseScene::registerNotificationObserver()
{………………………..
NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(GameBaseScene::receivedNotificationOMsg),MSG_RANDOM_ASK_EVENT,NULL);
…………………….
}

处理方法在receivedNotificationOMsg()方法中,当接收到问号信息,根据角色调用doRandomAskEvent()方法,处理问号信息,

处理完毕后调用sendMSGDealAroundLand()方法发送MSG_AROUND_LAND消息,处理角色相邻上下左右地块的消息,缴纳过路费或购买升级地块。

void GameBaseScene::receivedNotificationOMsg(Object* data)
{
……………..case MSG_RANDOM_ASK_EVENT_TAG:{int playerTag = messageVector.at(3)->intValue();switch(playerTag){case PLAYER_1_TAG:{doRandomAskEvent(player1);scheduleOnce(schedule_selector( GameBaseScene::sendMSGDealAroundLand),TOAST_SHOW_TIME);break;}case PLAYER_2_TAG:{doRandomAskEvent(player2);scheduleOnce(schedule_selector( GameBaseScene::sendMSGDealAroundLand),TOAST_SHOW_TIME);break;}              }break;}
…………….
}

void GameBaseScene::sendMSGDealAroundLand(float dt)
{NotificationCenter::getInstance()->postNotification(MSG_AROUND_LAND,String::createWithFormat("%d",MSG_AROUND_LAND_TAG));
}

5、处理问号信息的方法doRandomAskEvent(),就是从问号容器中随机取出一个,根据事件进行资金或体力的增减,并Toast提示事件信息

void GameBaseScene::doRandomAskEvent(RicherPlayer* player)
{int randomNumber = rand()%(randomAskEventMap.size()) + 1; __String * str = randomAskEventMap.at(randomNumber);switch(randomNumber){case TAX_REBATES_TAG:{refreshMoneyLabel(player,10000);                   break;}case PAY_TAXES_TAG:{refreshMoneyLabel(player,-20000);break;}case LOSS_STRENGTH_TAG:{refreshStrengthLabel(player,-100);break;}case PHYSICAL_RECOVERY_TAG:{refreshStrengthLabel(player,100);break;}case INVESTMENT_DIVIDENDS_TAG:{refreshMoneyLabel(player,20000);break;}case INVESTMENT_LOSS_TAG:{refreshMoneyLabel(player,-30000);break;}}CocosToast::createToast(this, str->getCString(), TOAST_SHOW_TIME,player->getPosition());
}

6、RicherGameController.cpp中注册了MSG_AROUND_LAND消息观察者,收到该消息后调用aroundLandEvent() ,处理过路费或购买地块等问题

void RicherGameController::registerNotificationObserver()
{…………………….NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(RicherGameController::receivedMsg),MSG_AROUND_LAND,NULL);
}void RicherGameController::receivedMsg(Object* data)
{……………………if(retMsgType == MSG_AROUND_LAND_TAG){   aroundLandEvent();}}

点击下载代码   http://download.csdn.net/detail/lideguo1979/8339065

未完待续...............

Cocos2d-x 3.2 大富翁游戏项目开发-第十八部分 问号随机事件相关推荐

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第二十八部分 游戏保存和载入存档游戏

    1.游戏保存 如图,在右下角增加保存图标,点击后进行游戏的保存. 游戏保存采用json格式,具体如下: {"map_level":2, // 游戏关卡"gameRound ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能

    本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力  等级共5 ...

  3. Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市

    当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点 ...

  4. Cocos2d-x 3.2 大富翁游戏项目开发-第二十部分 螃蟹挡路(code)

    该部分我们添加螃蟹伤人事件,道路位置随机添加螃蟹精灵,当角色行走完毕如果停留位置碰到了螃蟹,首先播放伤人动画,然后是播放救护车把角色带走动画. 如果轮流到该角色行走时,吐司提示住院还有几天,当住院天数 ...

  5. Cocos2d-x 3.2 大富翁游戏项目开发-第二十四部分 彩票开奖

    每隔N个回合,彩票开奖一次,每期开奖奖金固定5万,暂不累积.摇奖效果一般,以后考虑用物理引擎实现 1.定义彩票开奖类 bool LotteryPublish::init() {addItemSprit ...

  6. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  7. 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. Linux驱动开发(十八)---网络(网卡)驱动学习

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  9. 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8685546 作者:毛星云(浅墨) ...

最新文章

  1. SQLite入门与分析(二)---设计与概念
  2. 如何正确配置Nginx+PHP
  3. Vue组件之全局组件与局部组件
  4. ELK7.8.1的Docker搭建过程
  5. Springboot 多线程的使用
  6. 各大厂商CTR广告预估模型的优缺点对比
  7. matlab手眼标定,机器人手眼标定(eye to hand和eye in hand)
  8. Manjaro/Arch 软件配置安装
  9. VMware 10激活码
  10. 暗影精灵4如何调节风扇转速_关于解决暗影精灵4散热问题。
  11. python 泰森多边形边界_geotools中泰森多边形的生成
  12. php视频边下边播,PHP + NGINX 控制视频文件播放,并防止文件下载
  13. 设计32信道的多相滤波结构数字接收机
  14. win 7 安装 VMware 14的bug
  15. Android Studio中打电话权限报错with revoked permission android.permission.CALL_PHONE
  16. SpringMVC实现i18n和主题切换
  17. FFmpeg自学入门笔记
  18. pc模式 华为mate30_华为Mate30系列10个隐藏黑科技
  19. 有哪些能支持epub、txt格式的电子书阅读器?能在MAC上用的?
  20. 图片损坏修复软件,分享好用靠谱的软件

热门文章

  1. 爱学习的程序员都关注了这些
  2. 身体是本钱哪_悟sphenic_新浪博客
  3. 《构建之法》阅读以及工具调研
  4. 区块链宠物开发_区块链宠物开发的原理是什么?
  5. 抓包神器Wireshark
  6. 反沙箱CobaltStrike木马加载器分析
  7. Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用
  8. 思乡的味道,从巴黎到中国
  9. JAVA企业面试题精选 Java SE 91-100
  10. 阿里云基于Flink的流计算平台