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

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

政府鼓励投资,返还税金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. [CareerCup] 15.5 Denormalization 逆规范化
  2. Linux test 命令
  3. AB1601烧程序时注意事项
  4. dcmtk程序包综述(1)
  5. java 最小堆_Java最小堆实现
  6. HDFS的Java客户端操作代码(HDFS删除文件或目录)
  7. Linux运维实战之DNS的高级配置(转发器、视图等)
  8. python输入print跳到documentation-习题 48: 更复杂的用户输入
  9. 7天拿到阿里Android岗位offer,都是精髓!
  10. 王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP
  11. 联想杨元庆:未来五年研发总投入将会超过1000亿人民币
  12. margin系列之负值
  13. 使用Dockerfile制作jre环境基础镜像
  14. DMX协议和RDM协议
  15. 上海驾照科目三练习笔记
  16. 计算机网络安全 填空题,计算机网络安全技术选择填空复习题
  17. Poisson 分布
  18. 基于OpenGL ES 的深度学习框架编写
  19. 学渣的刷题之旅 leetcode刷题 67.二进制求和
  20. msvcr110.dll php,windows,_msvcr110.dll丢失,vcredist_x64.exe设置失败,windows - phpStudy

热门文章

  1. linux中非法内存,Debian GNU/Linux Telnetd非法内存处理漏洞
  2. cpld xilinx 定义全局时钟_FPGA/CPLD设计工具:Xilinx ISE使用详解
  3. ros下创建节点后运行总是出现[rospack] Error: package '***' not found
  4. CVPR2022论文速览--Vehicle trajectory prediction works, but not everywhere
  5. qt之QCustomPlot动态时间轴更新曲线
  6. 7 foundation plates(葫芦娃7兄弟)
  7. 亲爱的百度,您带着bug翩翩走来……呃
  8. webService详细
  9. 使用Eclipse搭建SpringBoot项目
  10. 我kao,110给我打电话了!