Cocos2d-x 3.2 大富翁遊戲項目開發-第十部分實現人物輪流行走

現在只能讓我方角色行走,對手並沒有行動,如何實現輪流行走呢?

有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


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




發佈了77 篇原創文章 · 獲贊 48 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章