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

每隔N个回合,彩票开奖一次,每期开奖奖金固定5万,暂不累积。摇奖效果一般,以后考虑用物理引擎实现

1、定义彩票开奖类

bool LotteryPublish::init()
{
	addItemSpriteFrameCache();
	SpriteFrame* spf;
	spf = itemSpriteFrameCache->getSpriteFrameByName("publish_ly01.png");

	Sprite::initWithSpriteFrame(spf);
	setItemAnimate();
	return true;
}

void LotteryPublish::addItemSpriteFrameCache()
{
	itemSpriteFrameCache = SpriteFrameCache::getInstance();
	itemSpriteFrameCache->addSpriteFramesWithFile("images/publish_ly.plist","images/publish_ly.png");

	memset(name, 0, 20);

	for (int i=1; i<=21; i++)
	{
		sprintf(name, "publish_ly%02d.png",i);
		item_anim_vector.pushBack(itemSpriteFrameCache->getSpriteFrameByName(name));
	}

}
//开奖动画
void LotteryPublish::setItemAnimate()
{
	if(!AnimationCache::getInstance()->getAnimation("publish_ly_animation"))
	{
		AnimationCache::getInstance()->addAnimation(Animation::createWithSpriteFrames(item_anim_vector,0.1f),"publish_ly_animation");
	}
	 normal_anmi = Animate::create(AnimationCache::getInstance()->getAnimation("publish_ly_animation"));
	 normal_anmi->retain();
}

2、创建开奖画面的对话框。

void GameBaseScene::initPopPublishLottery()
{
	popDialogLottery = PopupLayer::create(DIALOG_BG);
	popDialogLottery->setContentSize(CCSizeMake(Dialog_Size_Width, Dialog_Size_Height+180));
	popDialogLottery->setTitle(LanguageString::getInstance()->getLanguageString(PUBLISH_LOTTERY)->getCString());
	popDialogLottery->setContentText("", 20, 60, 250);
	popDialogLottery->setPopType(LOTTERY_PUBLISH);//开奖类型的对话框
	popDialogLottery->setPlayerVector(players_vector);//传入角色容器,开奖画面会根据这个显示角色购买的彩票号码
	popDialogLottery->setTag(100);
	this->addChild(popDialogLottery);
	popDialogLottery->setVisible(false);

}

在显示Go按钮之前,根据回合数显示开奖界面
void GameBaseScene::receivedNotificationOMsg(Object* data)
{
.............
	case MSG_GO_SHOW_TAG:
		{
			//便于测试,每一回合结束都显示开奖画面
			if(gameRoundCount !=0 && gameRoundCount%1 == 0)
			{
				//前面角色买地等,会播放动画,所以这里延迟一下,显示开奖画面
				scheduleOnce(schedule_selector( GameBaseScene::popPublishLottery),2.0f);

			}else
			{
				showGoButton();
			}
			break;
		}
............
}

//把开奖画面显示出来,并播放摇奖动画
void GameBaseScene::popPublishLottery(float dt)
{
	popDialogLottery->setVisible(true);
	//开奖画面中添加角色购买的彩票号码
	popDialogLottery->addPlayersLottery();
	//播放摇奖动画
	popDialogLottery->runPublishAnmi();
}

3、在PopupLayer.h中添加开奖对话框枚举LOTTERY_PUBLISH

enum POP_TYPE
{
	NORMAL,
	LOTTERY,
	LOTTERY_PUBLISH,
	STOCK,
};

//当对话框进入后调用setPublishLotteryContext,在对话框中添加开奖画面
void PopupLayer::onEnter()
{
......
	case LOTTERY_PUBLISH:
		{
			setPublishLotteryContext(contentSize);
			break;
		}

.....
}

//在对话框中添加开奖画面
void PopupLayer::setPublishLotteryContext(Size size)
{
	Size winSize = Director::getInstance()->getWinSize();
	lp = LotteryPublish::create();
	addChild(lp);
	lp->setPosition((winSize)/2);

	addPlayersInfo(size);

}

//添加角色图标

void PopupLayer::addPlayersInfo(Size size)
{
	Size winSize = Director::getInstance()->getWinSize();
	Size center =(winSize-size)/2;
	int j=0;
	for(auto it=players_vector.begin();it!=players_vector.end();it++)
	{
		RicherPlayer* player = dynamic_cast<RicherPlayer*>(*it);

		SpriteFrame* spf;
		int tag = player->getTag();
		switch(tag)
		{
		case PLAYER_1_TAG:
			{
				spf = player->player_spriteFrameCache->getSpriteFrameByName("player1_anim_01.png");
				break;
			}
		case PLAYER_2_TAG:
			{
				spf = player->player_spriteFrameCache->getSpriteFrameByName("player2_anim_02.png");
				break;
			}
		}

		Sprite* playerSprite = Sprite::createWithSpriteFrame(spf);
		playerSprite->setPosition( center.width+20, (winSize.height/2+50)+j*50);
		addChild(playerSprite);
		j++;
	}

}

//添加角色购买的彩票

void PopupLayer::addPlayersLottery()
{
	for(int i=1;i<=30;i++)
	{
		if(this->getChildByTag(1000+i) != NULL)
		{
			this->removeChildByTag(1000+i);
		}

	}

	Size winSize = Director::getInstance()->getWinSize();
	Size size = this->getContentSize();
	Size center =(winSize-size)/2;
	int j=0;
	for(auto it=players_vector.begin();it!=players_vector.end();it++)
	{
		RicherPlayer* player = dynamic_cast<RicherPlayer*>(*it);

		playerLotteryVector.clear();
		for(int i=0;i < player->lottery_vector.size();i++)
		{

			LabelTTF* labelLotteryNumber = LabelTTF::create(String::createWithFormat("%i",player->lottery_vector.at(i))->getCString(),"",15);
			labelLotteryNumber->setPosition(ccp( center.width+20+(i+1)*20, (winSize.height/2+30)+j*50));
			labelLotteryNumber->setColor(Color3B(255,100,100));
			labelLotteryNumber->setTag(1000+player->lottery_vector.at(i));
			playerLotteryVector.pushBack(labelLotteryNumber);
		}

		for(int i=0;i < playerLotteryVector.size();i++)
		{
			addChild(playerLotteryVector.at(i));
		}
		j++;

	}
}

//开始摇奖动画

void PopupLayer::runPublishAnmi()
{
	scheduleOnce(schedule_selector( PopupLayer::realRunPublishAnmi),3.0f);
}

//开始真正摇奖

void PopupLayer::realRunPublishAnmi(float dt)
{
lp->runAction(Sequence::create(lp->getNormal_anmi(),
		CallFunc::create([this]()
		{
			int lott = rand()%(30)+1;
			//四秒后 让开奖画面消失
			scheduleOnce(schedule_selector( PopupLayer::dismissFromParent),4.0f);

			Sprite* ball = Sprite::create("images/orange_ball.png");
			ball->setPosition(lp->getPosition()-lp->getContentSize()/2 + ccp(0,13));
			ball->setAnchorPoint(ccp(0,0));
			addChild(ball);
			LabelTTF* ltf = LabelTTF::create(String::createWithFormat("%02d",lott)->getCString(), "", 20);
			ltf->setPosition(ball->getPosition()+ccp(5,6));
			ltf->setAnchorPoint(ccp(0,0));
			addChild(ltf);
			Size winSize = Director::getInstance()->getWinSize();
			Size center =(winSize)/2;
			int j=0;
			//判断角色是否中奖
			for(auto it=players_vector.begin();it!=players_vector.end();it++)
			{
				RicherPlayer* player = dynamic_cast<RicherPlayer*>(*it);
				//player->lottery_vector.push_back(8);

				for(int i=0;i < player->lottery_vector.size();i++)
				{
					if(player->lottery_vector.at(i) == lott)
					{
						player->setMoney(player->getMoney()+LOTTERY_WIN_MONEY);

						ParticleSystem* lotteryWinParticle = ParticleSystemQuad::create("images/lottery_win.plist");
						lotteryWinParticle->retain();
						ParticleBatchNode *batch = ParticleBatchNode::createWithTexture(lotteryWinParticle->getTexture());
						batch->addChild(lotteryWinParticle);
						addChild(batch);

						lotteryWinParticle->setPosition( center.width+20, (winSize.height/2+50)+j*50 );
						lotteryWinParticle->release();
						lotteryWinParticle->setAutoRemoveOnFinish(true); 

					}
				}
				player->lottery_vector.clear();
				j++;
			}
		}
	),NULL));
}

//发送对话框消失消息,并设置为不可见

void PopupLayer::dismissFromParent(float dt)
{
	NotificationCenter::getInstance()->postNotification(MSG_DIMISS_DIALOG,String::createWithFormat("%d",MSG_DIMISS_DIALOG_PUBLISH_LOTTERY_TAG));
	this->setVisible(false);
}

4、GameBaseScene收到该消息后,更新资金,并显示Go按钮

	case MSG_DIMISS_DIALOG_PUBLISH_LOTTERY_TAG:
		{
			//this->removeChildByTag(100);
			for(auto it=players_vector.begin();it!=players_vector.end();it++)
			{
				RicherPlayer* player = dynamic_cast<RicherPlayer*>(*it);
				refreshMoneyLabel(player,0);
			}
			showGoButton();
			break;
		}

点击下载

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

时间: 2024-10-25 10:26:14

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

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

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

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

当角色路过彩票的标志或者停留位置有彩票标志时,弹出购买彩票的对话框,提示购买彩票,已经买过的号码,不显示.当机器对手路过时则直接购买彩票. 1. 在RicherPlayer.h中增加std::vector<int> lottery_vector;用来存储购买的彩票号码 2. RicherGameController 修改endGo方法,每走完一步就会进入该方法,判断是否有彩票标示图标,有的话发送MSG_LOTTERY彩票消息,MOVEPASS标示走完一步的标志 void RicherGameC

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 大富翁游戏项目开发-第十四部分 购买空地动画

在购买空地时,我们增加动画效果: 该动画包含2部分,第一部分是让脚印由小变大,再由大变小,第二部分是脚印变小后,播放一个粒子效果. 首先下载粒子编辑工具:Cocos2d-x-ParticleEditor这是一个开源免费的工具,下载地址为: https://github.com/chaseli/Cocos2d-x-ParticleEditor-for-Windows 打开bin目录下的ParticleEditor.exe 开启工具,里面包含了粒子实例,我们可以从中选取部分粒子效果为我所用,也可以自

Cocos2d-x 3.2 大富翁游戏项目开发-第二部分片头动画

第二部分片头动画 首先在visula studio 下创建新工程 工具类ConstUtil.h,该文件主要定义了一些图片资源.字符串.字体等 #ifndef __CONSTUTIL_H__ #define __CONSTUTIL_H__ //定义了诚迈科技四张图片资源,由于在诚迈科技,就用公司名称做动画吧 #define CHENG_IMAGE "cheng.png" #define MAI_IMAGE "mai.png" #define KE_IMAGE &quo

Cocos2d-x 3.2 大富翁游戏项目开发-第二十七部分 技能提升和游戏结束判断

本节主要是增加技能提升事件 和 游戏结束判断,游戏判断简单处理了一下,只要有一个角色资金小于0 ,就认为游戏结束. 如果人物在3个以上,则需要做进一步处理,比如失败方的房屋如何处理,这些在处理到多个角色的时候再做处理. 1.添加提升技能随机事件 oid GameBaseScene::initRandomAskEvent() { ................. randomAskEventMap.insert(STORM_UP_TAG,LanguageString::getInstance()