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
未完待续........................
版权声明:本文博主原创文章,博客,未经同意不得转载。