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

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

概述本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力  等级共5级,每提高一个等级,需要耗费的体力值减10 暴风骤雨:初始耗费体力值70 随心步:  初始耗费体力值50 巧取豪夺:初始耗费体力值100 1、添加技能SkillCard 类,包含了技能基本信息以及如何 本节主要是添加人物技能,技能包括

暴风骤雨:此技能可以把地块变成空白地块,
随心步: 选择想走的步数,想走几步走几步
巧取豪夺:把对手的土地变成自己的


技能包含的信息:等级 和 耗费体力
等级共5级,每提高一个等级,需要耗费的体力值减10


暴风骤雨:初始耗费体力值70
随心步: 初始耗费体力值50

巧取豪夺:初始耗费体力值100





1、添加技能SkillCard 类,包含了技能基本信息以及如何显示技能
其实现和前面讲解的股票 彩票 card类相似,不再累述

2、修改RicherPlayer类,添加技能相关属性及方法

RicherPlayer.h	//添加技能播放的动画	voID addSkillAnimation(); 	CC_SYNTHESIZE(Vector<SpriteFrame*>,skill_rain_vector,Skill_rain_vector);	CC_SYNTHESIZE(Vector<SpriteFrame*>,skill_transfer_vector,Skill_transfer_vector);	CC_SYNTHESIZE(Animate*,rain_skill,RainSkill);	CC_SYNTHESIZE(Animate*,transfer_skill,Transfer_skill);	//存放技能等级信息	std::vector<int> skill_vector;	//存放角色停止走动后的位置	float stop_x;	float stop_y;

RicherPlayer.cppRicherPlayer::RicherPlayer(){	......	//初始停留位置	stop_x = -100;	stop_y =0;}

bool RicherPlayer::init(char* name,int tag,bool enemy,int money,int strength){	...................	//初始技能默认等级为1	skill_vector.push_back(1);	skill_vector.push_back(1);	skill_vector.push_back(1);	//添加技能动画相关	addSkillAnimation();}

voID RicherPlayer::addSkillAnimation(){	..............	//包括暴风骤雨 、巧取豪夺 2个技能的动画	 rain_skill =Animate::create(AnimationCache::getInstance()->getAnimation("rain_animation"));	 transfer_skill = Animate::create(AnimationCache::getInstance()->getAnimation("transfer_animation"));	 	 rain_skill->retain();	 transfer_skill->retain();}

3、添加技能菜单键
//在添加go按钮的时候同时添加技能按钮voID  GameBaseScene::addGobutton(){................	//技能按钮,在go按钮下发    skillMenuItembutton = MenuItemImage::create("images/skill_button_normal.png","images/skill_button_pressed.png",this,menu_selector(GameBaseScene::gobuttonCallback));    skillMenuItembutton->setposition(ccp(tableStartposition_x+2*tableWIDth+20,tableStartposition_y-tableHeight*6-80));	skillMenuItembutton->setTag(skillbuttonTag);	menu->addChild(skillMenuItembutton);	//添加步数按钮,用于随心步技能    step1button = MenuItemImage::create("images/step1_normal.png","images/step1_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	..........    step2button = MenuItemImage::create("images/step2_normal.png","images/step2_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	............    step3button = MenuItemImage::create("images/step3_normal.png","images/step3_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	..........    step4button = MenuItemImage::create("images/step4_normal.png","images/step4_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	.........    step5button = MenuItemImage::create("images/step5_normal.png","images/step5_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	.......    step6button = MenuItemImage::create("images/step6_normal.png","images/step6_pressed.png",menu_selector(GameBaseScene::gobuttonCallback));	//暴风骤雨技能显示界面	skillStorm = SkillCard::createCardSprite(LanguageString::getInstance()->getLanguageString(RAIN),LanguageString::getInstance()->getLanguageString(GRADE),LanguageString::getInstance()->getLanguageString(LOST_STRENGTH),LanguageString::getInstance()->getLanguageString(DOWN_GRADE),skillSpriteCarDWIDth,skillSpriteCardHeight,100,-130,skillStormTag,"images/thunderstorm.png");	addChild(skillStorm,50);	//随心步技能显示界面	skillStep = SkillCard::createCardSprite(LanguageString::getInstance()->getLanguageString(GOBY_HEART),LanguageString::getInstance()->getLanguageString(GOBY_HEART_INFO),280,skillStepTag,"images/skill_step.png");	addChild(skillStep,50);	//巧取豪夺显示界面	skillTransfer = SkillCard::createCardSprite(LanguageString::getInstance()->getLanguageString(YOURS_IS_mine),LanguageString::getInstance()->getLanguageString(YOURS_IS_mine_INFO),460,skillTransferTag,"images/skill_transfer.png");	addChild(skillTransfer,50);	//添加各个界面点击回调方法	skillStorm->setSkillbuttonCallback(this,callfuncN_selector(GameBaseScene::skillClick));	skillStep->setSkillbuttonCallback(this,callfuncN_selector(GameBaseScene::skillClick));	skillTransfer->setSkillbuttonCallback(this,callfuncN_selector(GameBaseScene::skillClick));	//技能界面是否在显示	isSkillLayerShow = false;	//随心步步数按钮界面是否显示	isstepLayerShow = false;}

4、显示或隐藏随心步步数按钮界面,显示或隐藏时播放旋转动画
voID  GameBaseScene::showStepbutton(bool show){	if(show)	{		//显示时变为可见		step1button->setVisible(true);		step2button->setVisible(true);		step3button->setVisible(true);		step4button->setVisible(true);		step5button->setVisible(true);		step6button->setVisible(true);		//顺时针依次播放动画		step2button->runAction(RotateBy::create(stepSkillAnimaTime,60));		step3button->runAction(RotateBy::create(2*stepSkillAnimaTime,120));		step4button->runAction(RotateBy::create(3*stepSkillAnimaTime,180));		step5button->runAction(RotateBy::create(4*stepSkillAnimaTime,240));		step6button->runAction(RotateBy::create(5*stepSkillAnimaTime,300));	}else	{		//隐藏时相反		step2button->runAction(RotateBy::create(stepSkillAnimaTime,-60));		step3button->runAction(RotateBy::create(2*stepSkillAnimaTime,-120));		step4button->runAction(RotateBy::create(3*stepSkillAnimaTime,-180));		step5button->runAction(RotateBy::create(4*stepSkillAnimaTime,-240));		step6button->runAction(RotateBy::create(5*stepSkillAnimaTime,-300));		step6button->runAction(Sequence::create(RotateBy::create(5*stepSkillAnimaTime,-300),CallFunc::create([this](){			step1button->setVisible(false);			step2button->setVisible(false);			step3button->setVisible(false);			step4button->setVisible(false);			step5button->setVisible(false);			step6button->setVisible(false);		}		),NulL));	}}

//技能界面点击相应函数voID GameBaseScene::skillClick(Node *pNode){	int tag = pNode->getTag();	if(tag == skillStormTag)	{		if(player1->stop_x  < 0)		{			return;		}		//当点击暴风骤雨时,判断角色体力值是否满足技能耗费的体力值,如果满足 就播放暴风骤雨动画,动画结束后角色所在地块变为空地块		int needLostStrength = 80-player1->skill_vector.at(0)*10;		if(player1->getStrength() >= needLostStrength)		{			showSkillSprites();			player1->setStrength(player1->getStrength()-needLostStrength);			refreshStrengthLabel(player1,0);			Point pointOfGL = Util::map2GL(ccp(player1->stop_x,player1->stop_y),_map);			rainsprite = Sprite::createWithSpriteFrame(player1->getRainSkill()->getAnimation()->getFrames().at(0)->getSpriteFrame());			addChild(rainsprite);						rainsprite->setAnchorPoint(ccp(0,0));			rainsprite->setposition(pointOfGL+ccp(-tileDWIDth/2,tiledHeight/2));			rainsprite->runAction(Sequence::create(player1->getRainSkill(),CallFunc::create([this]()			{				landLayer->setTileGID(blank_land_tiledID,ccp(player1->stop_x,player1->stop_y));					rainsprite->removeFromParent();			}),NulL));		}else //如果体力不足,Toast显示提示信息		{			CocosToast::createtoast(this,LanguageString::getInstance()->getLanguageString(YOUR_STRENGTH_IS_LOW)->getCString(),TOAST_SHOW_TIME,winSize/2);		}	}	if(tag == skillStepTag)	{//如果点击了随心步 则显示随心步步数按钮界面		showStepbutton(!isstepLayerShow);		isstepLayerShow = !isstepLayerShow;	}	if(tag == skillTransferTag)	{//如果点击巧取豪夺		if(player1->stop_x  < 0)		{			return;		}		//判断角色体力值和技能所需的体力值是否满足技能需求		int needLostStrength = 110-player1->skill_vector.at(0)*10;		if(player1->getStrength() >= needLostStrength)		{			//记录夺取地块的等级			int transferLand = 0;			if(transferLandTag== MSG_PAY_TolLS_1_TAG)			{				transferLand = player1_building_1_tiledID;			}			if(transferLandTag== MSG_PAY_TolLS_2_TAG)			{				transferLand = player1_building_2_tiledID;			}			if(transferLandTag== MSG_PAY_TolLS_3_TAG)			{				transferLand = player1_building_3_tiledID;			}			transferLandTag = 0;			if(transferLand != 0)			{				showSkillSprites();				player1->setStrength(player1->getStrength()-needLostStrength);				refreshStrengthLabel(player1,0);				Point pointOfGL = Util::map2GL(ccp(player1->stop_x,_map);				transferSprite = Sprite::createWithSpriteFrame(player1->getTransfer_skill()->getAnimation()->getFrames().at(0)->getSpriteFrame());				addChild(transferSprite);							transferSprite->setAnchorPoint(ccp(0,0));				transferSprite->setposition(pointOfGL);				//播放巧取豪夺技能动画,并把地块变为自己相应等级的地块				transferSprite->runAction(Sequence::create(player1->getTransfer_skill(),CallFunc::create([this,transferLand]()				{					landLayer->setTileGID(transferLand,player1->stop_y));						transferSprite->removeFromParent();				}),NulL));			}					}else		{			CocosToast::createtoast(this,winSize/2);		}	}}

//修改gobuttonCallback方法,添加技能按钮和随心步步数按钮相应voID GameBaseScene::gobuttonCallback(cocos2d::CCObject *pSender){		int tag = ((Node*)pSender)->getTag();	....................	//当点击技能按钮时,显示或隐藏技能界面	if(tag == skillbuttonTag)	{		skillStorm->setSkillGrade(player1->skill_vector.at(0));		skillStep->setSkillGrade(player1->skill_vector.at(1));		skillTransfer->setSkillGrade(player1->skill_vector.at(2));		skillStorm->setStength(80-player1->skill_vector.at(0)*10);		skillStep->setStength(60-player1->skill_vector.at(1)*10);		skillTransfer->setStength(110-player1->skill_vector.at(2)*10);		showSkillSprites();	}	//当点击步数按钮时	if(tag == step1_tag || tag == step2_tag || tag == step3_tag || tag == step4_tag || tag == step5_tag || tag == step6_tag)	{		int needLostStrength = 60-player1->skill_vector.at(1)*10;		//当体力值足够时,角色减少相应体力值,同时隐藏技能界面,人物进行相应步数的行走		if(player1->getStrength() >= needLostStrength)		{			player1->setStrength(player1->getStrength()-needLostStrength);			refreshStrengthLabel(player1,0);			showSkillSprites();			int steps = tag - stepBaseTag;			RouteNavigation::getInstance()->getPath(player1,steps,canPassGrID,tiledRowsCount,tiledColsCount);			std::vector<int> colVector = RouteNavigation::getInstance()->getPathCols_vector();			std::vector<int> rowVector = RouteNavigation::getInstance()->getPathRow_vector();			NotificationCenter::getInstance()->postNotification(MSG_GO,String::createWithFormat("%d",MSG_GO_HIDE_TAG));					player1->startGo(rowVector,colVector);		}else //当体力值不足时,显示提示信息		{			CocosToast::createtoast(this,winSize/2);		}	}}

//该方法进行技能界面显示,当显示时,向上移动,隐藏时,向下移动voID GameBaseScene::showSkillSprites(){		if(!isSkillLayerShow)		{			skillStorm->runAction(MoveBy::create(0.3,ccp(0,130)));			skillStep->runAction(MoveBy::create(0.3,130)));			skillTransfer->runAction(MoveBy::create(0.3,130)));			isSkillLayerShow = true;		}else		{			skillStorm->runAction(MoveBy::create(0.3,-130)));			skillStep->runAction(MoveBy::create(0.3,-130)));			skillTransfer->runAction(MoveBy::create(0.3,-130)));			isSkillLayerShow = false;			if(isstepLayerShow)			{				showStepbutton(!isstepLayerShow);				isstepLayerShow = !isstepLayerShow;			}		}}

5、添加对手机器人技能
voID RicherGameController::pickOnePlayerToGo(){	...............		if(richerPlayer->getTag() == PLAYER_1_TAG )			{				NotificationCenter::getInstance()->postNotification(MSG_GO,MSG_GO_SHOW_TAG));				return;			}		//当不是第一角色时		if(richerPlayer->stop_x > 0)		{			//获取角色所在地块ID值			int gID = GameBaseScene::landLayer->getTileGIDAt(ccp(richerPlayer->stop_x,richerPlayer->stop_y));			//如果地块不是自己的,则随机使用技能			if(gID != GameBaseScene::blank_land_tiledID && gID != GameBaseScene::player2_building_1_tiledID && gID != GameBaseScene::player2_building_2_tiledID && gID != GameBaseScene::player2_building_3_tiledID)			{	//获取角色体力				int playerStrength = richerPlayer->getStrength();				//随机取得要使用的技能				int randomSkill_index = rand()%3;				int needLostStrength = 0;				int landLevel = 0;				//记录地块的等级				if(gID == GameBaseScene::player1_building_1_tiledID)				{					landLevel =  GameBaseScene::player2_building_1_tiledID;				}				if(gID == GameBaseScene::player1_building_2_tiledID)				{					landLevel =  GameBaseScene::player2_building_2_tiledID;				}				if(gID == GameBaseScene::player1_building_3_tiledID)				{					landLevel =  GameBaseScene::player2_building_3_tiledID;				}				//获取使用技能需要耗费的体力				switch(randomSkill_index)				{				case 0:					{						needLostStrength = 80-richerPlayer->skill_vector.at(0)*10;						break;					}				case 1:					{										}				case 2:					{						needLostStrength = 110-richerPlayer->skill_vector.at(2)*10;						break;					}				}				//如果角色体力值满足要求,发送使用技能的消息,然后方法返回				if(playerStrength >= needLostStrength)				{					String * str = String::createWithFormat("%d-%f-%f-%d-%d-%d-%d",MSG_USE_SKILL_TAG,richerPlayer->stop_x,richerPlayer->stop_y,richerPlayer->getTag(),randomSkill_index,needLostStrength,landLevel);					NotificationCenter::getInstance()->postNotification(MSG_USE_SKILL,str);					return;				}			}		}		如果地块是自己的时候,角色则行走		int randNumber = rand()%6 + 1; 		RouteNavigation::getInstance()->getPath(richerPlayer,randNumber,GameBaseScene::canPassGrID,GameBaseScene::tiledRowsCount,GameBaseScene::tiledColsCount);		richerPlayer->startGo(RouteNavigation::getInstance()->getPathRow_vector(),RouteNavigation::getInstance()->getPathCols_vector());		return;	}}

//当角色收到消息时voID GameBaseScene::receivednotificationOMsg(Object* data){	...............	case MSG_USE_SKILL_TAG:		{			//获取角色的tag 			int playerTag = messageVector.at(3)->intValue();			//角色要使用的技能			int kill_index =  messageVector.at(4)->intValue();			//使用技能需要耗费的体力			int needLostStrength = messageVector.at(5)->intValue();			//当前地块的等级			int landLevel = messageVector.at(6)->intValue();						if(playerTag == PLAYER_2_TAG)			{				//让角色减少相应的体力				player2->setStrength(player2->getStrength()-needLostStrength);				refreshStrengthLabel(player2,0);				Point pointOfGL = Util::map2GL(ccp(player2->stop_x,player2->stop_y),_map);				//播放技能相应动画				switch(kill_index)				{					case 0://暴风骤雨					{						rainsprite = Sprite::createWithSpriteFrame(player2->getRainSkill()->getAnimation()->getFrames().at(0)->getSpriteFrame());						addChild(rainsprite);						rainsprite->setAnchorPoint(ccp(0,0));						rainsprite->setposition(pointOfGL+ccp(-tileDWIDth/2,tiledHeight/2));						//动画播放完毕后,设置地块为空地块。并发送角色继续行走的消息						rainsprite->runAction(Sequence::create(player2->getRainSkill(),CallFunc::create([this]()						{							landLayer->setTileGID(blank_land_tiledID,ccp(player2->stop_x,player2->stop_y));								rainsprite->removeFromParent();							NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,MSG_PICKONE_TOGO_TAG));						}),NulL));						break;					}					case 1://随心步,这个方法暂时不写,后期大家可以自己添加						{													}					case 2://巧取豪夺						{							transferSprite = Sprite::createWithSpriteFrame(player2->getTransfer_skill()->getAnimation()->getFrames().at(0)->getSpriteFrame());							addChild(transferSprite);										transferSprite->setAnchorPoint(ccp(0,0));							transferSprite->setposition(pointOfGL);							//动画播放完毕后,设置地块为自己相应等级地块。并发送角色继续行走的消息							transferSprite->runAction(Sequence::create(player2->getTransfer_skill(),landLevel]()							{								landLayer->setTileGID(landLevel,player2->stop_y));									transferSprite->removeFromParent();								NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,MSG_PICKONE_TOGO_TAG));							}),NulL));													break;						}				}			}			break;		}			...............}

至此人物技能基本流程结束


代码中其他修改部分:


骰子动画效果感觉有些多余,代码中注释掉了
添加了机器人角色购买股票的代码


点击下载代码


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

总结

以上是内存溢出为你收集整理的Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能全部内容,希望文章能够帮你解决Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1038814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存