• 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

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


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    python中类(class)和实例(instance)
    python面向对象
    python中初始化实例属性
    python之使用__future__(解决版本不同,不兼容问题)
    python中动态导入模块
    python之导入模块
    python中偏函数
    python中完善decorator
    python中编写带参数decorator
    python中编写无参数decorator
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4839341.html
Copyright © 2020-2023  润新知