Cocos2d-x 3.2 大富翁游戏项目开发-第十一部分 提升角色行走体验

角色在获取随机步数走之前需要友好的提示玩家是哪个角色开始行走,要走几步。

这样我们在行走之前让角色闪一下,并把角色要走的路径用特殊颜色标注一下。效果如下

首先实现角色闪动:闪动是角色相关的,所以我们在RicherPlayer类的startGo方法中修改最合适

voidRicherPlayer::startGo(std::vector<int>rowVector,std::vector<int>colVector)
{
	//创建淡入淡出的动作,让角色运行,动作结束后,调用startRealGo开始行走。此处用了闭包函数简化代码
	FadeOut* fadeout = FadeOut::create(0.2);
	FadeIn* fadein = FadeIn::create(0.2);
	this->runAction(Sequence::create(fadeout,fadein,CallFunc::create([rowVector,colVector,this](){
			RicherGameController* instance =RicherGameController::getInstance();
			instance->startRealGo(rowVector,colVector,this);
		}
		),NULL));

}
</span>

下一步开始给路径标注颜色,我们用6个sprite来做,把这6个sprite 放入Vector中,每次根据行走步数,从vector取出sprite,放置在路径位置,每次走完这个路径位置,把该sprite的visible属性设置为false 不可见。逻辑清楚了代码写起来也很简单

GameBaseScene.h 头文件如下:

class GameBaseScene: public Layer
{
public:

            ………………..
	static Vector<Sprite*> pathMarkVector;//定义Vector 用来存放6个路径遮挡精灵
	static void drawPathColor(std::vector<int> rowVector,std::vector<int> colVector);//绘制路径遮挡方法
private:
       void addPathMark();//定义添加遮挡精灵的方法
       …………………….
}

cpp文件

bool GameBaseScene::init()
{
………………..
	//添加遮挡的方法一定要在添加角色方法之前,防止角色也被遮挡住
	addPathMark();
	addPlayer();
……………………..

	return true;
}

在GameBaseScene.cpp中实现这个addPathMark方法

void GameBaseScene::addPathMark()
{
	//这个方法就是创建6个路径遮挡Sprite,并添加到当前场景中
	Sprite* mark1 = Sprite::create(PATH_MARK_1);
	Sprite* mark2 = Sprite::create(PATH_MARK_2);
	Sprite* mark3 = Sprite::create(PATH_MARK_3);
	Sprite* mark4 = Sprite::create(PATH_MARK_4);
	Sprite* mark5 = Sprite::create(PATH_MARK_5);
	Sprite* mark6 = Sprite::create(PATH_MARK_6);

	mark1->setAnchorPoint(ccp(0,0));
	mark2->setAnchorPoint(ccp(0,0));
	mark3->setAnchorPoint(ccp(0,0));
	mark4->setAnchorPoint(ccp(0,0));
	mark5->setAnchorPoint(ccp(0,0));
	mark6->setAnchorPoint(ccp(0,0));
	//都为不可见
	mark1->setVisible(false);
	mark2->setVisible(false);
	mark3->setVisible(false);
	mark4->setVisible(false);
	mark5->setVisible(false);
	mark6->setVisible(false);

	addChild(mark1);
	addChild(mark2);
	addChild(mark3);
	addChild(mark4);
	addChild(mark5);
	addChild(mark6);

	pathMarkVector.pushBack(mark1);
	pathMarkVector.pushBack(mark2);
	pathMarkVector.pushBack(mark3);
	pathMarkVector.pushBack(mark4);
	pathMarkVector.pushBack(mark5);
	pathMarkVector.pushBack(mark6);
}
//绘制路径遮挡方法
void GameBaseScene::drawPathColor(std::vector<int> rowVector,std::vector<int> colVector)
{
//取得要绘制遮挡数量,因为路径数组0的位置是角色当前位置,不应绘制遮挡
	int stepsCount = rowVector.size()-1;
//从遮挡容器中取出遮挡Sprite,放置到对应位置,并设为可见
	for(int i=1;i<rowVector.size();i++)
	{
		pathMarkVector.at(i-1)->setPosition(ccp(colVector[i]*32,rowVector[i]*32));
		pathMarkVector.at(i-1)->setVisible(true);
	}
}
在RicherPlayer::startGo方法中在真正开始行走之前,画出路径遮挡效果

void RicherPlayer::startGo(std::vector<int> rowVector,std::vector<int> colVector)
{
	//Blink* blink = Blink::create(0.5,1);
	FadeOut* fadeout = FadeOut::create(0.2);
	FadeIn* fadein = FadeIn::create(0.2);

	//画出路径遮挡效果
	GameBaseScene::drawPathColor(rowVector,colVector);

	this->runAction(Sequence::create(fadeout,fadein,CallFunc::create([rowVector,colVector,this](){
			RicherGameController* instance =RicherGameController::getInstance();
			instance->startRealGo(rowVector,colVector,this);
		}
		),NULL));

}
void RicherGameController::endGo()

{
	//在每次移动结束后,把当前路径遮挡效果设为不可见,这样就出现了每走完一步,当前路径遮挡消失的效果
	GameBaseScene::pathMarkVector.at(stepHasGone)->setVisible(false);
	stepHasGone++;

	………………

	log("go end");

}

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

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

时间: 2024-10-07 09:28:50

Cocos2d-x 3.2 大富翁游戏项目开发-第十一部分 提升角色行走体验的相关文章

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取角色路径,我们採用单例模式设计该类,先看该类的定义 RouteNavigation.h class RouteNavigation{ public: static RouteNavigation* routeNav_Instance; //该类静态对象 static RouteNavigation*

Cocos2d-x 3.2 大富翁游戏项目开发-第二十一部分 捡到积分卡 恢复体力

跟前面第18部分处理,问号事件一样,角色行走完毕后,还要检查停留问题是否有积分卡,如果有则增加相应的体力值 1.新建Item_strength_up类,该类用来显示角色体力回升的动画. void Item_strength_up::addItemSpriteFrameCache() { itemSpriteFrameCache = SpriteFrameCache::getInstance(); itemSpriteFrameCache->addSpriteFramesWithFile("

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2

在编写获取路径方法前,我们先把角色需要的动画文件加载进来,角色的文件为png 和 plist格式. player1_anim.png.plist             player1_anim.png player2_anim.png.plist             player2_anim.png plist分别记录了每张图在整张png图中的位置 大小,我们只要知道每张小图名称即可从整张png图中截取出想要的小图. player1_anim.png图片为 player2_anim.png

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

下面的设计稍微繁琐一些,有必要把思路说清楚. 下一步的主要实现当我们点击Go按钮后,得到骰子随机数,就是行走的步数,根据步数获取行走的路径,然后角色根据路径移动位置.大体流程如图所示: 这其中getPath()获取路径的方法有必要说清楚,还是看流程图吧 思路大体是这样的,代码实现上可能存在一些差别,但是不影响我们的整体设计思想. 我们开始修改GameBaseScene代码 GameBaseScene.h //新添加变量 表示地图块中每块的宽高 const int tiledWidth = 32;

Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走

路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender) { RouteNavigation::getInstance()->getPath(player1,3,canPassGrid,tiledRowsCount,tiledColsCount); std::vector<

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

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

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

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

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

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

Cocos2d-x 3.2 大富翁游戏项目开发-第四部分 退出对话框

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这部分代码从网上查阅了一下,基本都是以前版本编写的,需要稍微改动一下即可,效果如图</span> 首先看看在MenuScene.cpp如是如何调用起对话框的 void MenuScene::popupLayer(){ // 定义一个弹出层,传入一张背景图 PopupLayer