現在只能讓我方角色行走,對手並沒有行動,如何實現輪流行走呢?
有2種方法,一種是採用刷幀控制器在update進行,另一種採用消息機制的形式實現,我們儘量避免使用刷幀控制器。就採用第二種消息機制吧
我們在GameBaseScene中定義變量players_vector [Player*] 來存放所有的角色;
在添加新對象時,給該對象設置屬性_isMyTurn爲true
這樣所有對象添加完畢後players_vector [Player*]所有的isMyTurn都爲true,表示可以調用go方法,進行行走。
思路如下:
在go按鈕點擊之後,我方角色先走,這時就不應該再響應點擊事件了,我們可以採取讓go 按鈕點擊後消失,走完後設置isMyTurn = false,表示我方讓出行走權。
然後調用在RicherGameController定義的方法pickOnePlayerToGo(),遍歷players_vector,取出一個isMyTurn == true的運行go方法
運行完後,isMyTurn設置爲false;
然後繼續調用pickOnePlayerToGo(),運行完畢後isMyTurn=false;
假如共有3個角色,運行3次後,所有對象的isMyTurn==false;
這時我們要把isMyTurn再次都設置爲true,並讓go按鈕顯示出來,進行下一次輪換行走。
大體流程如下:
1、當點擊go按鈕之後,發送一個消息,代表按鈕要消失,當其他角色都執行完行走之後,再發送一個消息,讓go按鈕顯示
2、在GameBaseScene中定製消息接收,根據收到的消息,來讓go按鈕消失或顯示
boolGameBaseScene::init()
{
…………..
//添加消息接收器
addNotificationObserver();
returntrue;
}
//該方法定義接收一個MSG_GO的消息,該消息處理函數爲receivedMsgForGo()
voidGameBaseScene::addNotificationObserver()
{
NotificationCenter::getInstance()->addObserver(
this,
callfuncO_selector(GameBaseScene::receivedMsgForGo),
MSG_GO,
NULL);
}
voidGameBaseScene::receivedMsgForGo(Object* data)
{
//把go 菜單放到了menu容器中,以後可以從中取出所有子菜單進行單獨處理利於後期擴展
intretMsgType =((String*)data)->intValue();
Vector<Node*>vecMenuItem = getMenu()->getChildren();
SizewinSize = Director::getInstance()->getWinSize();
//當收到的信息是1時,表示要顯示各個menu項,讓菜單從屏幕外移動到屏幕中來
if(retMsgType ==1)
{
for(auto it=vecMenuItem.begin();it!=vecMenuItem.end();it++)
{
Node* node = dynamic_cast<Node*>(*it);
MoveBy* moveBy = MoveBy::create(0.3,ccp(-(node->getContentSize().width)*2,0));
//RotateBy* rotateBy =RotateBy::create(1,360,10);
//Action* action =Spawn::create(moveBy,rotateBy,NULL);
node->runAction(moveBy);
}
}else//當收到的信息是0時,表示要隱藏各個menu項,讓菜單從屏幕移動到右邊屏幕外面
{
for(auto it=vecMenuItem.begin();it!=vecMenuItem.end();it++)
{
Node* node = dynamic_cast<Node*>(*it);
MoveBy* moveBy = MoveBy::create(0.3,ccp((node->getContentSize().width)*2,0));
//RotateBy* rotateBy =RotateBy::create(1,360,10);
//Action* action =Spawn::create(moveBy,rotateBy,NULL);
node->runAction(moveBy);
}
}
log("received go message is: %d",retMsgType);
}
voidGameBaseScene::goButtonCallback(cocos2d::CCObject *pSender)
{
……………………………….
//在go點擊後,發送go按鈕消失信息
NotificationCenter::getInstance()->postNotification(MSG_GO,String::create("0"));
player1->startGo(rowVector,colVector);
log("go button clicked over");
}
voidRicherGameController::pickOnePlayerToGo()
{
for(auto it=GameBaseScene::players_vector.begin();it!=GameBaseScene::players_vector.end();it++)
{
RicherPlayer* richerPlayer = dynamic_cast<RicherPlayer*>(*it);
if(richerPlayer->getIsMyTurn())
{
RouteNavigation::getInstance()->getPath(richerPlayer,3,GameBaseScene::canPassGrid,GameBaseScene::tiledRowsCount,GameBaseScene::tiledColsCount);
richerPlayer->startGo(RouteNavigation::getInstance()->getPathRow_vector(),RouteNavigation::getInstance()->getPathCols_vector());
return;
}
}
for(auto it=GameBaseScene::players_vector.begin();it!=GameBaseScene::players_vector.end();it++)
{
RicherPlayer* richerPlayer = dynamic_cast<RicherPlayer*>(*it);
richerPlayer->setIsMyTurn(true);
}
//代碼運行到這裏,代表都走完了,發送一個顯示go按鈕的信息
NotificationCenter::getInstance()->postNotification(MSG_GO,String::create("1"));
}
做完這些之後,還做了一下掃尾工作,把人物的資金和體力顯示出來,並讓人物獲取隨機步數,然後行走。簡單就不解釋了。
點擊下載代碼 http://download.csdn.net/detail/lideguo1979/8301181
未完待續.....................