Cocos2d-x 3.2 大富翁遊戲項目開發-第七部分 獲取角色路徑_1

下面的設計稍微繁瑣一些,有必要把思路說清楚。

下一步的主要實現當我們點擊Go按鈕後,得到骰子隨機數,就是行走的步數,根據步數獲取行走的路徑,然後角色根據路徑移動位置。大體流程如圖所示:



這其中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 按鈕
};


修改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");
}


//這個就是簡單 的添加Go按鈕
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


獲取路徑稍微複雜一些,我們分多章介紹


未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章