Cocos2d-x 3.2 大富翁遊戲項目開發-第十六部分 相連地塊繳納過路費,cocos2d-x項目開發

來源:互聯網
上載者:User

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


未完待續..................

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.