Cocos2d-x 3.2 大富翁遊戲項目開發-第十六部分 相連地塊繳納過路費,cocos2d-x項目開發
當走到其他角色的地塊時,根據當前地塊是否連片,連片的話統一計算需要繳納的過路費,連片的計算方式,是各個地塊過路費總和。
首先擷取當前行走角色路過的地塊的x y座標(Land layer層的座標),然後擷取角色的座標(GL的座標,需要轉換成map中的座標),
然後對這2個座標值進行橫向和縱向比較。
A位置:以尋找左邊地塊的方法為例分析
1、 把角色A座標轉換成map中的座標
2、 把當前0號地塊的sprite對象放入容器中,以便後面播放淡入淡出的動畫
3、 0號地塊x座標同角色A的map座標的x值是否相等,如果相等表示當前角色的上邊或下邊有對方的地塊。
4、 取得0號地塊左邊相鄰1號的座標
5、 取得1號地塊的GID值
6、 判斷1號地塊的GID值
7、 根據1號地塊的GID等級,把過路費相加
8、 把1號地塊sprite放入容器中
9、 繼續尋找左邊相鄰2號地塊,處理方法同1號地塊
10、如果左邊沒有地塊了,退出尋找左邊地塊的迴圈,繼續尋找右邊地塊
void GameBaseScene::payTolls(int payTag,float x,float y ,int playerTag)調用到displayArea方法先說明一下參數float x:表示在land Layer層中地塊的橫座標值float y:表示在land Layer層中地塊的縱座標值RicherPlayer* player:當前行走的角色int building_1_tiledID:路過的地塊1等級int building_2_tiledID:路過的地塊2等級int building_3_tiledID:路過的地塊3等級傳回值表示除了當前地塊的其他連片地塊的過路費總和int GameBaseScene::displayArea(float x,float y,RicherPlayer* player,int building_1_tiledID,int building_2_tiledID,int building_3_tiledID){int sumMoney =0;//過路費總和初始值float retX = Util::GL2map(player->getPosition(),_map).x; //把角色座標轉換成map中的座標if(x == retX) //比較map座標的x值是否相等,如果相等表示當前角色的上邊或下邊有對方的地塊。{float leftX = x - 1; //當前地塊相鄰左邊的座標float rightX = x + 1; //當前地塊相鄰右邊的座標int leftGID = landLayer->getTileGIDAt(ccp(leftX,y));//取得相鄰左邊地塊的GID值int rightGID = landLayer->getTileGIDAt(ccp(rightX,y));//取得相鄰右邊地塊的GID值displayVector.pushBack(landLayer->getTileAt(ccp(x,y))); //把當前地塊的sprite對象放入容器中,以便後面播放淡入淡出的動畫while(leftGID != 0 && (leftGID == building_1_tiledID || leftGID == building_2_tiledID || leftGID == building_3_tiledID))//判斷相鄰左邊地塊的GID{if(leftGID == building_1_tiledID)//如果相鄰左邊地塊的GID是等級1的地塊,把過路費相加{sumMoney += LAND_BLANK_MONEY;}if(leftGID == building_2_tiledID)//如果相鄰左邊地塊的GID是等級2的地塊,把過路費相加{sumMoney += LAND_LEVEL_1_MONEY;}if(leftGID == building_3_tiledID)//如果相鄰左邊地塊的GID是等級3的地塊,把過路費相加{sumMoney += LAND_LEVEL_2_MONEY;}displayVector.pushBack(landLayer->getTileAt(ccp(leftX,y))); //把相鄰左邊的地塊sprite放入容器中leftX -= 1;//繼續尋找相鄰左邊地塊leftGID = landLayer->getTileGIDAt(ccp(leftX,y));//取得地塊GID值if(leftGID == 0)//如果左邊沒有地塊了,退出尋找左邊地塊的迴圈{break;}log("leftGID: %d" ,leftGID);}while(rightGID != 0 && (rightGID == building_1_tiledID || rightGID == building_2_tiledID || rightGID == building_3_tiledID))//判斷相鄰右邊地塊的GID{if(rightGID == building_1_tiledID)//如果相鄰右邊地塊的GID是等級1的地塊,把過路費相加{sumMoney += LAND_BLANK_MONEY;}if(rightGID == building_2_tiledID)//如果相鄰右邊地塊的GID是等級2的地塊,把過路費相加{sumMoney += LAND_LEVEL_1_MONEY;}if(rightGID == building_3_tiledID)//如果相鄰右邊地塊的GID是等級3的地塊,把過路費相加{sumMoney += LAND_LEVEL_2_MONEY;}displayVector.pushBack(landLayer->getTileAt(ccp(rightX,y)));//把相鄰右邊的地塊sprite放入容器中rightX += 1;//繼續尋找相鄰右邊地塊rightGID = landLayer->getTileGIDAt(ccp(rightX,y));//取得地塊GID值if(rightGID == 0)//如果右邊沒有地塊了,退出尋找右邊地塊的迴圈{break;}log("rightGID: %d" ,rightGID);}}//上下尋找地塊的方法同左右邏輯一樣,不再累述。........................//播放容器中sprite的動畫,效果就是相鄰的地塊淡入淡出for(auto it=displayVector.begin();it!=displayVector.end();it++ ){(Sprite*)(*it)->runAction(Sequence::create(landFadeOut->clone(),landFadeIn->clone(),NULL));}return sumMoney;}void GameBaseScene::payTolls(int payTag,float x,float y ,int playerTag){int money =0; if(payTag == MSG_PAY_TOLLS_1_TAG){money = LAND_BLANK_MONEY;} if(payTag == MSG_PAY_TOLLS_2_TAG){money = LAND_LEVEL_1_MONEY;}if(payTag == MSG_PAY_TOLLS_3_TAG){money = LAND_LEVEL_2_MONEY;}//先把容器清空一下displayVector.clear();RicherPlayer* landOwner = getPlayerByTiled(buy_land_x,buy_land_y);switch(playerTag){case PLAYER_1_TAG:{//取得地塊過路費總和int retMoney = displayArea(x,y,player1,player2_building_1_tiledID,player2_building_2_tiledID,player2_building_3_tiledID);//更新角色相應的資金refreshMoneyLabel(landOwner,money + retMoney);refreshMoneyLabel(player1,-(money + retMoney));NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,String::createWithFormat("%d",MSG_PICKONE_TOGO_TAG));break;}case PLAYER_2_TAG:{int retMoney = displayArea(x,y,player2,player1_building_1_tiledID,player1_building_2_tiledID,player1_building_3_tiledID);refreshMoneyLabel(landOwner,money + retMoney);refreshMoneyLabel(player2,-(money + retMoney));NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,String::createWithFormat("%d",MSG_PICKONE_TOGO_TAG));break;}}}
點擊下載代碼
http://download.csdn.net/detail/lideguo1979/8330609
未完待續..................