展会信息港展会大全

Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走,cocos2d-x项目开发
来源:互联网   发布日期:2015-09-28 14:48:29   浏览:1772次  

导读: Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走,cocos2d-x项目开发 现在只能让我方角色行走,对手并没有行动,如何实现轮流行走呢? 有2种方法,一种是采用刷帧控...

Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走,cocos2d-x项目开发

现在只能让我方角色行走,对手并没有行动,如何实现轮流行走呢?

有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

未完待续.....................

http://www.bkjia.com/Androidjc/933422.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/933422.htmlTechArticleCocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走,cocos2d-x项目开发 现在只能让我方角色行走,对手并没有行动,如何实现轮流行...

赞助本站

人工智能实验室

相关热词: android开发 应用开发

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港