多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Cocos2d-x 3.2 大富翁游戲項目開發-第二十部分 螃蟹擋路(code)

Cocos2d-x 3.2 大富翁游戲項目開發-第二十部分 螃蟹擋路(code)

來源:程序員人生   發布時間:2015-01-19 08:29:08 閱讀次數:2535次
該部份我們添加螃蟹傷人事件,道路位置隨機添加螃蟹精靈,當角色行走終了如果停留位置碰到了螃蟹,首先播放傷人動畫,然后是播放救護車把角色帶走動畫。
如果輪番到該角色行走時,吐司提示住院還有幾天,當住院天數到期,該角色才可以繼續行走

新建了幾個精靈類

Item_crab.cpp 螃蟹
Item_emergency.cpp 救護車
Item_fog.cpp 煙霧

Item_stretcher.cpp 擔架


//該方法在場景中添加這幾個精靈 void GameBaseScene::initItemSprite() { item_crab = (Item_crab*)Item::create(ITEM_CRAB); addChild(item_crab); item_crab->runAction(RepeatForever::create(item_crab->getNormal_anmi())); item_crab->setVisible(false); emerg = Item_emergency::create(); addChild(emerg); emerg->setVisible(false); fog = Item_fog::create(); addChild(fog); fog->setVisible(false); strentcher = Item_stretcher::create(); addChild(strentcher); strentcher->setVisible(false); strentcher->setAnchorPoint(ccp(0,0.9)); } 定義了定時器,每隔100秒調用該方法,更新螃蟹位置 void GameBaseScene::registerBlockWaySchedule() { schedule(schedule_selector(GameBaseScene::updateBlockWaySprites),100.0f); } void GameBaseScene::updateBlockWaySprites(float dt) { int _rand1 = rand()%(wayLayerPass_vector.size()); Vec2 position = wayLayerPass_vector.at(_rand1); position.x -= 5; position.y +=tiledHeight; item_crab->setVisible(true); item_crab->setPosition(position); item_crab->setAnchorPoint(ccp(0,0.6)); }

1、首先在RicherPlayer.cpp中,添加 restTimes 屬性,記錄受傷后,角色需要住院停留的回合數
2、修改void RicherGameController::endGo()方法
當角色行走終了,發送MSG_BLOCK_WAY_EVENT消息,該消息用來處理行走終了后,檢查道路上是不是存在螃蟹等

void RicherGameController::endGo() { ........... if(stepHasGone >= stepsCount) { String * str = String::createWithFormat("%d-%f-%f-%d",MSG_BLOCK_WAY_EVENT_TAG,0.0f,0.0f,_richerPlayer->getTag()); NotificationCenter::getInstance()->postNotification(MSG_BLOCK_WAY_EVENT,str); return; } ............. }

3、GameBaseScene.cpp注冊MSG_BLOCK_WAY_EVENT消息視察者

void GameBaseScene::registerNotificationObserver() { ........... NotificationCenter::getInstance()->addObserver( this, callfuncO_selector(GameBaseScene::receivedNotificationOMsg), MSG_BLOCK_WAY_EVENT, NULL); ............ }

4、receivedNotificationOMsg 具體處理該消息,根據角色調用doBlockWayEvent 方法

void GameBaseScene::receivedNotificationOMsg(Object* data) { ........... case MSG_BLOCK_WAY_EVENT_TAG: { int playerTag = messageVector.at(3)->intValue(); switch(playerTag) { case PLAYER_1_TAG: { doBlockWayEvent(player1); break; } case PLAYER_2_TAG: { doBlockWayEvent(player2); break; } } break; } ............. }

5、doBlockWayEvent方法,就是根據角色判斷是不是碰到了螃蟹,如果碰到了,播放受傷等1系列動畫,動畫播放終了后,設置角色不可見,并發送MSG_PICKONE_TOGO消息,讓控制器取出下1個角色繼續行走。

void GameBaseScene::doBlockWayEvent(RicherPlayer* player) { if(player->getBoundingBox().containsPoint(item_crab->getPosition()+ccp(item_crab->getContentSize().width/2,-item_crab->getContentSize().height/2))) { //碰到了螃蟹,設置螃蟹位置,讓其不可見 item_crab->setPosition(ccp(⑵00,⑵00)); //設置角色隨機停留回合數 player->restTimes = rand()%(5) + 1;; log("doBlockWayEvent intersetcRect"); //救護車變成可見 emerg->setVisible(true); //救護車從右往左移動的距離 int distance = tableStartPosition_x-player->getPosition().x; //救護車的位置 emerg->setPosition(player->getPosition()+ccp(distance,0)); //螃蟹和角色打架的煙霧動畫 fog->setVisible(true); fog->setPosition(player->getPosition()); Repeat* repeate0 = Repeat::create(fog->getNormal_anmi(),2); fog->runAction(repeate0); //救護車的移動動畫 MoveBy* moveBy = MoveBy::create(1.0f,ccp(-distance,0)); MoveBy* moveBy2 = MoveBy::create(0.5f,ccp(⑹0,0)); Repeat* repeate = Repeat::create(emerg->getCar_go_anmi(),5); Repeat* repeate2 = Repeat::create(emerg->getCar_stop_anmi(),1); Sequence* spawnAction = Sequence::create(Spawn::create(moveBy,repeate,NULL),Spawn::create(moveBy2,repeate2,NULL),CallFunc::create(CC_CALLBACK_0(GameBaseScene::endCarGo, this)),NULL); spawnAction->retain(); emerg->runAction(spawnAction); //根據動畫播放的時間設置角色不可見 if(player->getTag() == PLAYER_1_TAG) { scheduleOnce(schedule_selector(GameBaseScene::setPlayer1InVisible),2.5f); }else if(player->getTag() == PLAYER_2_TAG) { scheduleOnce(schedule_selector(GameBaseScene::setPlayer2InVisible),2.5f); } //Toast顯示角色受傷住院天數信息 CocosToast::createToast(this,String::createWithFormat("%s %d %s",LanguageString::getInstance()->getLanguageString(PLAYER_HURT)->getCString(),player->restTimes,LanguageString::getInstance()->getLanguageString(RICH_DAY)->getCString())->getCString(), TOAST_SHOW_TIME,player->getPosition()); } else { //如果沒有碰到螃蟹,角色繼續發送消息用于處理停留位置事件:是不是有問號時間,然后是上下左右相鄰位置房屋是不是需要購買升級繳納過路費等 NotificationCenter::getInstance()->postNotification(MSG_HANDLE_PROP_EVENT,String::createWithFormat("%d",MSG_HANDLE_PROP_EVENT_TAG)); } } //讓角色和打架煙霧動畫不可見 void GameBaseScene::setPlayer1InVisible(float dt) { player1->setVisible(false); fog->setVisible(false); } void GameBaseScene::setPlayer2InVisible(float dt) { player2->setVisible(false); fog->setVisible(false); } //救護車開來動畫結束后調用該函數,播放小黃人抬擔架動畫 void GameBaseScene::endCarGo() { strentcher->setVisible(true); strentcher->setPosition(emerg->getPosition()); MoveBy* moveBy = MoveBy::create(0.5f,ccp(60,0)); ScaleBy* scaleBy = ScaleBy::create(0.5f,0.8); Repeat* repeate = Repeat::create(strentcher->getStretcher_empty_anmi(),1); ScaleBy* scaleBy2 = ScaleBy::create(0.5f,1.25); MoveBy* moveBy2 = MoveBy::create(0.5f,ccp(⑹0,0)); Repeat* repeate2 = Repeat::create(strentcher->getStretcher_full_anmi(),1); Sequence* spawnAction = Sequence::create(Spawn::create(moveBy,scaleBy,repeate,NULL),Spawn::create(moveBy2,scaleBy2,repeate2,NULL),CallFunc::create(CC_CALLBACK_0(GameBaseScene::startCarGoAgain, this)),NULL); spawnAction->retain(); strentcher->runAction(spawnAction); } //小黃人抬擔架動畫播放終了后,播放救護車開走動畫 void GameBaseScene::startCarGoAgain() { strentcher->setVisible(false); int distance = emerg->getPositionX(); MoveBy* moveBy = MoveBy::create(1.0f,ccp(-distance,0)); Repeat* repeate = Repeat::create(emerg->getCar_go_anmi(),5); Sequence* spawnAction = Sequence::create(Spawn::create(moveBy,repeate,NULL),CallFunc::create(CC_CALLBACK_0(GameBaseScene::endCarGoLast, this)),NULL); spawnAction->retain(); emerg->runAction(spawnAction); } //救護車開走后,調用該方法,讓救護車不可見,并發送MSG_PICKONE_TOGO消息,讓其他角色繼續行走 void GameBaseScene::endCarGoLast() { emerg->setVisible(false); NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,String::createWithFormat("%d",MSG_PICKONE_TOGO_TAG)); }

6、查看控制器中pickOnePlayerToGo方法

void RicherGameController::pickOnePlayerToGo() { for(auto it=GameBaseScene::players_vector.begin();it!=GameBaseScene::players_vector.end();it++) { RicherPlayer* richerPlayer = dynamic_cast<RicherPlayer*>(*it); //如果輪番到該角色行走,但是在受傷休息,則發送MSG_REST 休息消息 if(richerPlayer->getIsMyTurn() && richerPlayer->restTimes > 0 ) { String * str = String::createWithFormat("%d-%f-%f-%d",MSG_REST_TAG,0.0f,0.0f,richerPlayer->getTag()); NotificationCenter::getInstance()->postNotification(MSG_REST,str); return; } //如果輪番到角色行走,并且不在休息 if(richerPlayer->getIsMyTurn() && richerPlayer->restTimes == 0) { richerPlayer->setVisible(true); //角色1 發送MSG_GO消息,顯示go按鈕 if(richerPlayer->getTag() == PLAYER_1_TAG ) { NotificationCenter::getInstance()->postNotification(MSG_GO,String::createWithFormat("%d",MSG_GO_SHOW_TAG)); return; } //其他角色 獲得路徑,自動行走 int randNumber = rand()%6 + 1; RouteNavigation::getInstance()->getPath(richerPlayer,randNumber,GameBaseScene::canPassGrid,GameBaseScene::tiledRowsCount,GameBaseScene::tiledColsCount); richerPlayer->startGo(RouteNavigation::getInstance()->getPathRow_vector(),RouteNavigation::getInstance()->getPathCols_vector()); return; } } oneRoundDone = true; //走到這里,說明角色都行走終了,調用resetPlayerGoTurn方法,重新設置角色IsMyTurn為true等 resetPlayerGoTurn(); } //每個回合結束后調用該方法,讓角色的restTimes 減1 void RicherGameController::resetPlayerGoTurn() { for(auto it=GameBaseScene::players_vector.begin();it!=GameBaseScene::players_vector.end();it++) { RicherPlayer* richerPlayer = dynamic_cast<RicherPlayer*>(*it); richerPlayer->setIsMyTurn(true); richerPlayer->restTimes--; if(richerPlayer->restTimes < 0) { richerPlayer->restTimes = 0; } } //發送MSG_ROUND_COUNT 更新回合數 NotificationCenter::getInstance()->postNotification(MSG_ROUND_COUNT,String::createWithFormat("%d",MSG_ROUND_COUNT_TAG)); //設置終了,繼續調用pickOnePlayerToGo ,進行下1輪行走 pickOnePlayerToGo(); }

7、GameBaseScene.cpp注冊MSG_REST消息視察者

void GameBaseScene::registerNotificationObserver() { ........... NotificationCenter::getInstance()->addObserver( this, callfuncO_selector(GameBaseScene::receivedNotificationOMsg), MSG_REST, NULL); ............. }

8、處理MSG_REST消息
當收到休息的消息,首先設置IsMyTurn 為false,并吐司顯示還需要休息幾個回合,顯示結束后調用GameBaseScene::sendMSGPickOneToGO 方法,繼續下1個角色行走

void GameBaseScene::receivedNotificationOMsg(Object* data) { .......... case MSG_REST_TAG: { buy_land_x = messageVector.at(1)->floatValue(); buy_land_y = messageVector.at(2)->floatValue(); int playerTag = messageVector.at(3)->intValue(); switch(playerTag) { case PLAYER_1_TAG: { player1->setIsMyTurn(false); CocosToast::createToast(this, String::createWithFormat("%s %d %s",LanguageString::getInstance()->getLanguageString(IN_HOSPITAL_REMAIN)->getCString(),player1->restTimes,LanguageString::getInstance()->getLanguageString(RICH_DAY)->getCString())->getCString(), TOAST_SHOW_TIME,player1->getPosition(),(SEL_CallFun)&GameBaseScene::sendMSGPickOneToGO); break; } case PLAYER_2_TAG: { player2->setIsMyTurn(false); CocosToast::createToast(this, String::createWithFormat("%s %d %s",LanguageString::getInstance()->getLanguageString(IN_HOSPITAL_REMAIN)->getCString(),player2->restTimes,LanguageString::getInstance()->getLanguageString(RICH_DAY)->getCString())->getCString(), TOAST_SHOW_TIME,player2->getPosition(),(SEL_CallFun)&GameBaseScene::sendMSGPickOneToGO); break; } } break; } .......... }

9、CocosToast.cpp 文件,添加了SEL_CallFun method 函數指針,用來調用傳進來的方法,如 GameBaseScene::sendMSGPickOneToGO 發送行走消息。
typedef void (Layer::*SEL_CallFun)();  
void CocosToast::createToast(cocos2d::Node *node, const std::string &msg, const float &time,Vec2 point,SEL_CallFun method);

10、當角色行走終了 停留位置的房屋所有者如果在住院,則免繳過路費。吐司提示,并調用GameBaseScene::sendMSGPickOneToGO 發送行走消息

void GameBaseScene::payTolls(int payTag,float x,float y ,int playerTag) { ............. if(landOwner->restTimes > 0) { CocosToast::createToast(this, LanguageString::getInstance()->getLanguageString(IN_HOSPITAL)->getCString(), TOAST_SHOW_TIME,player1->getPosition(),(SEL_CallFun)&GameBaseScene::sendMSGPickOneToGO); return; } ............. }

部份效果圖



點擊下載代碼


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


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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 综合免费视频 | 最近最新中文字幕高清中文字幕网 | 欧美另类高清xxxxx | 亚洲v日本v欧美v综合v | 欧美非洲黑人性xxxx | 国产精品中文字幕在线 | 欧美日韩亚洲国内综合网俺 | 美女午夜影院 | 图片区小说区av区 | 国内视频自拍在线视频 | 久久精品亚洲欧美日韩久久 | 毛片免费在线观看网址 | 亚洲成在人线久久综合 | 国产一级一片免费播放i | 在线高清视频18jin观看 | 欧美日韩亚洲国产一区二区三区 | 视频一区二区国产无限在线观看 | 大香伊人久久 | 久久精品这里是免费国产 | 久久精品国产99久久6动漫欧 | 亚洲www在线 | 亚洲毛片在线 | www.日本在线 | 高清国产精品久久久久 | 伊人高清视频 | 国产在线中文字幕 | 国产精品欧美亚洲 | 最新欧美精品一区二区三区 | 午夜视频在线免费 | 国产一区二区三区日韩欧美 | 亚洲精品综合一区二区 | 久久精品视频免费 | 成成人看片在线 | 在线视频亚洲欧美 | 亚洲美女高清aⅴ视频免费 亚洲美女激情视频 | 地址一地址二地址三 | 国产精品久久久久久久 | 亚洲欧美日韩网站 | 精品看片| 国产精品免费_区二区三区观看 | 在线播放亚洲视频 |