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

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

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

政府鼓励投资,返还税金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

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

时间: 2024-12-21 02:01:53

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

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

当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点击一个股票时,显示相关股票的价格走势,共显示最新14条的价格走势. 每次点击购买,买入100股 .点击卖出,则卖出所持有的该股的所有股票.成交价格 等信息动态更新 点击返回,返回到游戏主界面,并更新角色资金值 1.首先添加股票类 包括代码,名称,买入价格,涨跌百分比,持仓数量等定义以及相关的get

Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走

现在只能让我方角色行走,对手并没有行动,如何实现轮流行走呢? 有2种方法,一种是采用刷帧控制器在update进行,另一种采用消息机制的形式实现,我们尽量避免使用刷帧控制器.就采用第二种消息机制吧 我们在GameBaseScene中定义变量players_vector [Player*] 来存放所有的角色: 在添加新对象时,给该对象设置属性_isMyTurn为true 这样所有对象添加完毕后players_vector [Player*]所有的isMyTurn都为true,表示可以调用go方法,进

Cocos2d-x 3.2 大富翁游戏项目开发-第二十九部分 游戏配音

我从大富翁里提取出来里面的wav音效文件,放到我们的游戏中以增加趣味性,仅供学习研究之用 1.修改AppDelegate.cpp文件 // This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stop

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

本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力 等级共5级,每提高一个等级,需要耗费的体力值减10 暴风骤雨:初始耗费体力值70 随心步:  初始耗费体力值50 巧取豪夺:初始耗费体力值100 1.添加技能SkillCard 类,包含了技能基本信息以及如何显示技能 其实现和前面讲解的股票 彩票 card类相似,不再累述 2.修改RicherPlayer类,

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

该部分我们添加螃蟹伤人事件,道路位置随机添加螃蟹精灵,当角色行走完毕如果停留位置碰到了螃蟹,首先播放伤人动画,然后是播放救护车把角色带走动画. 如果轮流到该角色行走时,吐司提示住院还有几天,当住院天数到期,该角色才可以继续行走 新建了几个精灵类 Item_crab.cpp 螃蟹 Item_emergency.cpp 救护车 Item_fog.cpp 烟雾 Item_stretcher.cpp 担架 //该方法在场景中添加这几个精灵 void GameBaseScene::initItemSpri

Cocos2d-x 3.2 大富翁游戏项目开发-第二十二部分 拾到珍珠

该部分同前面处理逻辑基本一样,道路上随机出现闪烁的珍珠,在捡到珍珠后,toast显示捡到珍珠资金增加. 1.编写Item_ball类,该类存储了珍珠相关动画 bool Item_ball::init() { addItemSpriteFrameCache(); SpriteFrame* spf; spf = itemSpriteFrameCache->getSpriteFrameByName("ball_01.png"); Sprite::initWithSpriteFrame(

Cocos2d-x 3.2 大富翁游戏项目开发-第十五部分 升级地块

当路过的地块属于自己的时,如果是第一角色则弹出对话框,提示升级地块,其他角色直接升级地块. 当路过的地块不是自己的时,需要缴纳与地块等级相应的过路费. 修改RicherGameController.cpp文件的handlePropEvent()方法 针对不同的地块,发送不同的消息 void RicherGameController::handlePropEvent() { ---------- for (int i = 0; i < 4; i++) //遍历角色上下左右相邻位置的地块 { Poi

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

每隔N个回合,彩票开奖一次,每期开奖奖金固定5万,暂不累积.摇奖效果一般,以后考虑用物理引擎实现 1.定义彩票开奖类 bool LotteryPublish::init() { addItemSpriteFrameCache(); SpriteFrame* spf; spf = itemSpriteFrameCache->getSpriteFrameByName("publish_ly01.png"); Sprite::initWithSpriteFrame(spf); setI

Cocos2d-x 3.2 大富翁游戏项目开发-第十九部分 国际化-解决中文乱码

先解决一下中文乱码问题吧,网友cheyiliu 提供了比较简单的解决办法,具体如下,如有更好方法,欢迎提供 1. 编写plist文件string_zh.plist把需要中文显示字符,放入到该文件中: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://ww