展会信息港展会大全

Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走
来源:互联网   发布日期:2015-09-27 15:03:28   浏览:2300次  

导读: 路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScen...

路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组

void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender)

{

RouteNavigation::getInstance()->getPath(player1,3,canPassGrid,tiledRowsCount,tiledColsCount);

std::vector colVector = RouteNavigation::getInstance()->getPathCols_vector();

std::vector rowVector = RouteNavigation::getInstance()->getPathRow_vector();

for(int i=0;istartGo(rowVector,colVector);

}

.size();i++)>

给类RicherPlayer添加相应的startGo方法

void RicherPlayer::startGo(std::vector rowVector,std::vector colVector)

{

//获取游戏控制器RicherGameController,调用其中的startRealGo()方法,开始真正的角色行走

RicherGameController* rgController = RicherGameController::create();

addChild(rgController);

rgController->startRealGo(rowVector,colVector,this);

}

void RicherGameController::startRealGo(std::vector rowVector,std::vector 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]);

}

测试发现角色终于可以正常走动了

\

流程图如下

\

目前为止,代码写的相对较多了,有必要重新整理一下,下部分,我们进行一下代码优化。便于后期的继续开发。

赞助本站

人工智能实验室
相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港