Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径
获得所述路径之后。我们将能够使根据的步行路径的作用,当您点击gobutton什么时候。我们呼吁player的startGo()办法。传入的参数是保存路径2一维数组
void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender)
{
RouteNavigation::getInstance()->getPath(player1,3,canPassGrid,tiledRowsCount,tiledColsCount);
std::vector<int> colVector = RouteNavigation::getInstance()->getPathCols_vector();
std::vector<int> rowVector = RouteNavigation::getInstance()->getPathRow_vector();
for(int i=0;i<rowVector.size();i++)
{
log(" rowVector row is %d --- colVector col is %d",rowVector[i],colVector[i]);
}
//调用RicherPlayer类的startGo方法
player1->startGo(rowVector,colVector);
}
给类RicherPlayer加入对应的startGo方法
void RicherPlayer::startGo(std::vector<int> rowVector,std::vector<int> colVector)
{
//获取游戏控制器RicherGameController。调用当中的startRealGo()方法。開始真正的角色行走
RicherGameController* rgController = RicherGameController::create();
addChild(rgController);
rgController->startRealGo(rowVector,colVector,this);
}
void RicherGameController::startRealGo(std::vector<int> rowVector,std::vector<int> colVector,RicherPlayer* richerPlayer)
{
currentRow = rowVector[0]; currentCol = colVector[0]; //获取第一个位置的行列值
nextRow =0; nextCol =0; //下一步的行列值
//创建上下左右的动作,并放入缓存
if(!AnimationCache::getInstance()->animationByName("left_animation"))
{
AnimationCache::getInstance()->addAnimation(Animation::createWithSpriteFrames(richerPlayer->getAnim_left_vector(),playerGoPerFrameTime),"left_animation");
}
if(!AnimationCache::getInstance()->animationByName("right_animation"))
{
AnimationCache::getInstance()->addAnimation(Animation::createWithSpriteFrames(richerPlayer->getAnim_right_vector(),playerGoPerFrameTime),"right_animation");
}
if(!AnimationCache::getInstance()->animationByName("down_animation"))
{
AnimationCache::getInstance()->addAnimation(Animation::createWithSpriteFrames(richerPlayer->getAnim_down_vector(),playerGoPerFrameTime),"down_animation");
}
if(!AnimationCache::getInstance()->animationByName("up_animation"))
{
AnimationCache::getInstance()->addAnimation(Animation::createWithSpriteFrames(richerPlayer->getAnim_up_vector(),playerGoPerFrameTime),"up_animation");
}
//从缓存中取得上下左右的动作。创建对应的动画
left = Animate::create(AnimationCache::getInstance()->animationByName("left_animation"));
right =Animate::create( AnimationCache::getInstance()->animationByName("right_animation"));
down =Animate::create(AnimationCache::getInstance()->animationByName("down_animation"));
up = Animate::create(AnimationCache::getInstance()->animationByName("up_animation"));
//retain 一下,引用计数加一,防止动画被清除
left->retain();
right ->retain();
down->retain();
up->retain();
//依据參数给对应变量赋值
_rowVector=rowVector;
_colVector=colVector;
_richerPlayer =richerPlayer;
stepHasGone = 0;//角色已经走了几步
stepsCount = _rowVector.size()-1;//取得路径须要走的步数,由于第一个是当前位置的行列。所以不计入步数
moveOneStep();//開始行走。先走一步,走完一步后,再走下一步
}
void RicherGameController::moveOneStep()
{
//获取下一步行列,计算同当前行列的差值
nextRow = _rowVector[stepHasGone+1];
nextCol = _colVector[stepHasGone+1];
int distanceRow = nextRow - currentRow;
int distanceCol = nextCol - currentCol; MoveBy* moveBy; Repeat* repeate; Action* spawnAction;
//依据行列的差值,创建上下左右对应的动作,包含移动和行走的动画 if(distanceRow >0)//up
{
moveBy = MoveBy::create(playerGoTotalTime,ccp(0,tiledHeight));
repeate = Repeat::create(up,1);
}
if(distanceRow <0)//down
{
moveBy = MoveBy::create(playerGoTotalTime,ccp(0,-tiledHeight));
repeate = Repeat::create(down,1);
}
if(distanceCol >0)//right
{
moveBy = MoveBy::create(playerGoTotalTime,ccp(tiledWidth,0));
repeate = Repeat::create(right,1);
}
if(distanceCol <0)//left
{
moveBy = MoveBy::create(playerGoTotalTime,ccp(-tiledWidth,0));
repeate = Repeat::create(left,1);
}
//创建同步动画,当移动完成,运行callEndGoFunc方法,进而调用endGo()方法
spawnAction = Sequence::create(Spawn::create(moveBy,repeate,NULL),callEndGoFunc,NULL);
_richerPlayer->runAction(spawnAction);
}
void RicherGameController::endGo()
{
stepHasGone++;//走完一步后,已走步数加1
if(stepHasGone >= stepsCount) //假设已走步数大于等于总步数,返回
{
return;
}
currentRow = nextRow;
currentCol = nextCol;//当前行列赋值为下一行列
moveOneStep();//開始下一步的移动
log("go end");
}
经过測试发现,角色会来回走动。走过去了还走回来。所以我们须要给角色类Player加入 表示角色从哪个位置过来的属性
改动RouteNavigation类的getPath()方法
void RouteNavigation::getPath(RicherPlayer* player,int stepsCount,bool** canPassGrid,int gridRowsCount,int gridColsCount)
{…………………………..
int rowtemp = player->getComeFromeRow();
int coltemp = player->getComeFromCol();
if(rowtemp <=-1 || coltemp <= -1)
{
player->setComeFromCol(currentCol);
player->setComeFromeRow(currentRow);
}
//设置角色从哪里来的位置为false ,以表示不可通过
canPassGrid_copy[player->getComeFromeRow()][player->getComeFromCol()] = false;
………………………..
//获取完路径后,设置角色的来自的位置
player->setComeFromCol(pathCols_vector[pathCols_vector.size()-2]);
player->setComeFromeRow(pathRow_vector[pathRow_vector.size()-2]);
}
測试发现角色最终能够正常走动了
流程图例如以下
眼下为止,代码写的相对较多了,有必要又一次整理一下,下部分。我们进行一下代码优化。便于后期的继续开发。
点击下载代码 http://download.csdn.net/detail/lideguo1979/8292407
未完待续........................
版权声明:本文博主原创文章,博客,未经同意不得转载。
Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径的更多相关文章
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3
点击下载代码 http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取 ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1
以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
于MenuScene.cpp 点击单机游戏后会调用 Director::getInstance()->pushScene(MapChooseScene::createScene()); 进入到关 ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2
在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式. player1_anim.png.plist player1_anim.pn ...
- iOS开发UI篇—Quartz2D使用(绘图路径)
iOS开发UI篇—Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径 cgmutablepat ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之三 角色管理源码分享 在上两篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- 网站开发进阶(四十三)html中,路径前加“/” 与不加“/”的区别
网站开发进阶(四十三)html中,路径前加"/" 与不加"/"的区别 前言 <script src="js/downloadify.js&quo ...
- Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染
Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染 上一篇文章讲到了利用C++这个桥梁,我们实现了QML和Java的交互.Qt 5大力推崇的QML/JS开发,让轻量.高速开发的QML/J ...
- Solon 开发,八、注入依赖与初始化
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
随机推荐
- 辛星分析html中间name和id
差额
朋友们可以新手也能很容易区分id和class,但不一定很容易区分id和name,以下说一下二者的差别和联系. 首先是联系,它们都能够用来标记一个元素,并且能够用JavaScript来操作,可是操作方法 ...
- Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)
阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 ...
- 可兼容IE的jquery.cookie函数方法
前言 在开发过程中,因为之前有接触过Discuz,就直接拿其common.js里面的getcookie和setcookie方法来使用,做到后面在使用IE来测试的时候,发现这两个方法子啊IE下不起作用, ...
- 普通的年轻状态机,纯C语言
我们第一次接触到了状态机.在数字电路课程.计数器.串行奇偶校验.考了1连续报错电路 等待,两者都需要一个状态机模型.电路实现这些功能,与状态机的状态转移图.状态转移表是等价. 后.然后,我们联系了状态 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面
说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- 谷歌宣布Android auto目前的汽车系统汽车市场的影响
由于2007年.汽车导航产品已经得到长足的发展.其产品主要用于WinCE制.除了导航功能,通常有收音机,播放光盘.广播SD卡/U音频和视频盘,蓝牙手机,倒车后视功能.由于WinCE微软放弃系统,And ...
- 【原创】poj ----- 2376 Cleaning Shifts 解题报告
题目地址: http://poj.org/problem?id=2376 题目内容: Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K ...
- NETSH WINSOCK RESET这个命令的意义和效果?
简要地netsh winsock reset命令含义复位 Winsock 文件夹.一机多用的假设Winsock协议配置问题,那么问题会导致网络连接,我们需要使用netsh winsock reset命 ...
- [Windwos Phone 8]多个按钮的共用事件
原文:[Windwos Phone 8]多个按钮的共用事件 前言 ------------------------------------------------------------------- ...
- c++堆栈实现
A Stack is a data-structure that You can only add an element to the top of the Stack, andYou can onl ...