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


    以下是一些设计略显繁琐,有必要清除思维。

    下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径。

    流程如图普遍认为:



    这当中getPath()获取路径的方法有必要说清楚,还是看流程图吧




    思路大体是这种,代码实现上可能存在一些区别。可是不影响我们的总体设计思想。


    我们開始改动GameBaseScene代码


    GameBaseScene.h 
    //新加入变量 表示地图块中每块的宽高
    const int tiledWidth = 32; 
    const int tiledHeight = 32;
    
    class GameBaseScene: public Layer
    {
    public:
    	int tiledColsCount; //关卡地图总的列数
    	int tiledRowsCount;//关卡地图总的行数
    
    	bool** canPassGrid;//依据地图总的行列数创建的二维数组
    
    	virtual void initTiledGrid();//用来初始化canPassGrid数组
    	void setWayPassToGrid();//依据地图图层way,设置canPassGrid对应的值为true
    	void onExit();//退出时须要释放某些变量空间
    	
    	void addGoButton();//加入GO button
    };
    


    改动GameBaseScene.cpp文件


    在init方法中加入新增函数的调用
    bool GameBaseScene::init()
    {
     …………………..
    	addGoButton();
    	initTiledGrid();
    	setWayPassToGrid();
    …………….
    }
    void  GameBaseScene::setWayPassToGrid()
    {
    	TMXLayer* wayLayer = _map->layerNamed("way");//获取地图way图层
    
    	Size _mapSize = wayLayer->getLayerSize(); //获取way图层大小
                  //依据way图层。获取道路的坐标并转换成地图的行列值,设置canPassGrid对应的行列值为true,表示人物能够从这里通过
                   for (int j = 0;  j < _mapSize.width; j++) {  
    		for (int i = 0;  i < _mapSize.height; i++) {  
                                        Sprite* _sp = wayLayer->tileAt(Point(j, i));  
                                         if (_sp) 
    			{  
                                                                float x = _sp->getPositionX();
    				float y = _sp->getPositionY();
    				int col = x/tiledWidth;
    				int row = y/tiledHeight;
    				canPassGrid[row][col] = true;
    				log("canPassGrid row=  %d ,col =%d ,canpass = %d" ,row,col,canPassGrid[row][col]);
                }  
    			
            }  
        }  
    	log("setWayPassToGrid finished");
    }
    


    //这个就是简单 的加入Gobutton
    void  GameBaseScene::addGoButton()
    {
    	Sprite* goButton = Sprite::create(GO_BUTTON);
    	goButton->setPosition(ccp(tableStartPosition_x+2*tableWidth,tableStartPosition_y-tableHeight*5));
    	addChild(goButton);
    }
    //当退出是调用该函数。释放canPassGrid占用的空间
    void GameBaseScene::onExit()
    {
    	
    	CC_SAFE_DELETE(canPassGrid);
    	Layer::onExit();
    
    }
    


    以下看一下initTiledGrid()方法的实现。因为每一个关卡地图大小不一样,所以这种方法的实现放到了子类中

    SeaScene.cpp实现例如以下

    SeaScene实现父类GameBaseScene的initTiledGrid方法
    
    void GameBaseScene::initTiledGrid()
    {
    	tiledColsCount = 20;//地图总的列数
    	tiledRowsCount = 15;//地图总的行数
    
    	//依据行列数创建二维数组canPassGrid
    	canPassGrid = new  bool*[tiledRowsCount];  
    	 for(int i=0;i<tiledRowsCount;i++)
                   canPassGrid[i]=new bool [tiledColsCount];	
    
    	 
    	//给canPassGrid设置默认值为false 表示不能通过
    	for(int row = 0;row<tiledRowsCount;row++)
    	{
    		for(int col = 0;col<tiledColsCount;col++)
    		{
    			canPassGrid[row][col] = false;
    		}
    	}
    	log("");
    	 
    }
    


    Ok 至此我们已经能够调试一下代码,从log中能够看到已经打印出了canPassGrid数组中能够通过的行列值了

    对照一下sea.tmx文件里的way图层 。看看行列值是不是一致了



    点击下载代码

    http://download.csdn.net/detail/lideguo1979/8276135


    稍微更复杂的路径,我们分多章


    待续

  • 相关阅读:
    win10没有新建文件夹
    js暂停的函数
    Mini ORM——PetaPoco笔记
    阻止网页内部滚动条mousewheel事件冒泡
    setTimeout调用带参数的函数的方法
    spring入门--Spring框架底层原理
    spring入门——applicationContext与BeanFactory的区别
    mybatis的Sql语句打印
    Sql语句中IN和exists的区别及应用
    Jenkins学习
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5031096.html
Copyright © 2020-2023  润新知