先看一下角色各自的土地图片

1、先在场景中创建一个对话框,这个对话框是用来显示购买空地的确认信息的。buyLandCallback回调方法,根据点击的按钮进行分别处理,

如果确认是买地,则修改空地图片,如果取消则返回场景继续其他角色行走。buyLandCallback代码稍后再看

void GameBaseScene::initPopDialog()
{popDialog = PopupLayer::create(DIALOG_BG);popDialog->setContentSize(CCSizeMake(Dialog_Size_Width, Dialog_Size_Height)); popDialog->setTitle(DIALOG_TITLE);popDialog->setContentText("", 20, 60, 250);popDialog->setCallbackFunc(this, callfuncN_selector(GameBaseScene::buyLandCallback));popDialog->addButton(BUTTON_BG1, BUTTON_BG3, OK, Btn_OK_TAG);popDialog->addButton(BUTTON_BG2, BUTTON_BG3, CANCEL, Btn_Cancel_TAG);this->addChild(popDialog);popDialog->setVisible(false);
}

2、 我们把消息注册接收重新整理一下,统一写到一个方法中,这样便于后期扩展处理

void GameBaseScene::receivedNotificationOMsg(Object* data)
{
……………………switch(retMsgType){case MSG_BUY_BLANK_TAG: //处理购买空地{………………………}case MSG_GO_SHOW_TAG://处理go按钮显示{…………………}case  MSG_GO_HIDE_TAG://处理go按钮消失{……………………..}}
}

3、 编写工具类Util,主要包含坐标转换 、 字符串截取相关方法。

struct Util
{//把layer层上的坐标转换成GL坐标 static Point map2GL(const Point& ptMap, TMXTiledMap* map){Point ptUI;ptUI.x = ptMap.x * map->getTileSize().width;ptUI.y = (ptMap.y + 1)* map->getTileSize().height;Point ptGL = ptUI;ptGL.y = map->getContentSize().height - ptUI.y;return ptGL;}//把GL坐标 转换成layer上的坐标,这样layer层根据坐标就可以判断当前位置的title ID 并进行相关操作static Point GL2map(const Point& ptGL, TMXTiledMap* map){Point ptUI = ptGL;ptUI.y = map->getContentSize().height - ptGL.y;int x = ptUI.x / map->getTileSize().width;int y = ptUI.y / map->getTileSize().height;return ccp(x, y);}static Vector<String*> splitString(const char* srcStr, const char* sSep){………………….//截取字符串相关}};

4、角色轮流行走近一步完善:添加变量oneRoundDone,标示一个回合是否结束,false是没有结束

逻辑同前面文章介绍基本一样,只不过是新加了个变量oneRoundDone,进行我方角色对话框的特殊处理。

当我方角色走完要求的步数之后,需要判断停留所在地是否有空地可以购买,有空地就发送消息,弹出对话框提示购买,购买或取消购买完毕后,发送一个MSG_PICKONE_TOGO_TAG ,从角色容器中取出一个角色,进行行走,全部角色行走完毕后,设置oneRoundDone为true,表示一个回合结束,此时在发送消息,显示go按钮,。

开始实现我方角色购买地皮的功能

void RicherGameController::endGo(){GameBaseScene::pathMarkVector.at(stepHasGone)->setVisible(false);stepHasGone++;if(stepHasGone >= stepsCount){//角色停留后,判断如果是我方角色的时候 ,就调用handlePropEvent方法,进行道具事项的处理 //这里的道具暂时是指空地if(_richerPlayer->getTag() == PLAYER_1_TAG){            handlePropEvent();return ;}// oneRoundDone变量是指:一个回合是否结束。False是没有结束if(!oneRoundDone){
//如果一个回合没有结束,就调用pickOnePlayerToGo从角色列表中取出一个行走pickOnePlayerToGo();return;}return;}currentRow = nextRow;currentCol = nextCol;moveOneStep(_richerPlayer);log("go end");}
void RicherGameController::handlePropEvent()
{oneRoundDone =false;//设置回合变量oneRoundDonefloat playerEnd_X = _colVector[stepsCount]*32; //取得角色所在地点的x坐标float playerEnd_Y = _rowVector[stepsCount]*32 + 32; //取得角色所在地点的y坐标float** positionAroundEnd; //定义个二维数组,存放角色当前位置的上下左右四个方向上的坐标positionAroundEnd = new  float*[4];  for(int i=0;i<4;i++)positionAroundEnd[i]=new float [2];   // uppositionAroundEnd[0][0] = playerEnd_X;positionAroundEnd[0][1] = playerEnd_Y + 32;// downpositionAroundEnd[1][0] = playerEnd_X;positionAroundEnd[1][1] = playerEnd_Y - 32;// leftpositionAroundEnd[2][0] = playerEnd_X - 32;positionAroundEnd[2][1] = playerEnd_Y;// rightpositionAroundEnd[3][0] = playerEnd_X + 32;positionAroundEnd[3][1] = playerEnd_Y;log("handlePropEvent() called");//寻找四个相邻位置 是否存在空地,如果有则发送要求买地的消息MSG_BUY,该消息包含了该空地的坐标,这里主要用到了字符串的操作,
//以“-”做为字符串分隔符for (int i = 0; i < 4; i++) {// GL2map是把当前的坐标转换成landLayer层对应的坐标。这部分实现在了Util里面,不再做解释了Point ptMap = Util::GL2map(Vec2(positionAroundEnd[i][0],positionAroundEnd[i][1]), GameBaseScene::_map);int titleId = GameBaseScene::landLayer->getTileGIDAt(ptMap);if(titleId == GameBaseScene::blank_land_tiledID){//send a message to show buy dialogfloat x = ptMap.x;float y = ptMap.y;String * str = String::createWithFormat("%d-%f-%f",MSG_BUY_BLANK_TAG,x,y);NotificationCenter::getInstance()->postNotification(MSG_BUY,str);break;}}}
在GameBaseScene中注册了MSG_BUY买地的消息观察者,当收到该消息后调用receivedNotificationOMsg方法
void GameBaseScene::registerNotificationObserver()
{NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(GameBaseScene::receivedNotificationOMsg),MSG_GO,NULL);NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(GameBaseScene::receivedNotificationOMsg),MSG_BUY,NULL);
}

receivedNotificationOMsg 方法,处理所有接收到的消息,然后分别处理

void GameBaseScene::receivedNotificationOMsg(Object* data)
{
//首先对取出消息分割符“-”前的消息类型,并把消息存入容器中messageVector,对于没有分隔符的则只存放消息类型,//对买地消息,还存放了地块的坐标值String * srcDate = (String*)data;Vector<String*> messageVector = Util::splitString(srcDate->getCString(),"-");int retMsgType = messageVector.at(0)->intValue();Vector<Node*> vecMenuItem = getMenu()->getChildren();log("received go message is: %d",retMsgType);switch(retMsgType){case MSG_BUY_BLANK_TAG:{buy_land_x = messageVector.at(1)->floatValue();buy_land_y = messageVector.at(2)->floatValue();//当收到买地信息后,调用showBuyLandDialog方法,显示对话框showBuyLandDialog(MSG_BUY_BLANK_TAG);break;}case MSG_GO_SHOW_TAG:{…………………}case  MSG_GO_HIDE_TAG:{……………………..}}
}
void  GameBaseScene::showBuyLandDialog(int landTag)
{String showMessage = "";switch(landTag){case MSG_BUY_BLANK_TAG:{//买空地 显示的消息showMessage = "Do you want to buy the land ? need $1000 ";break;}case MSG_BUY_LAND_1_TAG:{//给空地升级,显示的消息showMessage = "Do you want to buy the land ? need $2000 ";break;}}popDialog->setDataTag(landTag);//给对话框设置一个标示,代表消息类型popDialog->getLabelContentText()->setString(showMessage.getCString());//修改对话框提示内容popDialog->setVisible(true);//对话框显示出来}
//对话框点击后进入该方法
void GameBaseScene::buyLandCallback(Node *pNode)
{if(pNode->getTag() == Btn_OK_TAG){switch(popDialog->getDataTag()){case MSG_BUY_BLANK_TAG:{//如果点击的是确认,修改空地图片为角色对应的土地标示landLayer->setTileGID(player1_building_1_tiledID,ccp(buy_land_x,buy_land_y));//landLayer->setTileGID();log( "need $1000 ");break;}case MSG_BUY_LAND_1_TAG:{break;}}popDialog->setVisible(false);//购买完毕后,让对话框消失,并发送消息,让其他角色行走NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,String::createWithFormat("%d",MSG_PICKONE_TOGO_TAG));log("Btn_OK_TAG");}else{//点击取消,则让对话框消失,发送消息,让其他角色行走popDialog->setVisible(false);NotificationCenter::getInstance()->postNotification(MSG_PICKONE_TOGO,String::createWithFormat("%d",MSG_PICKONE_TOGO_TAG));}}

效果如下

点击下载代码

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

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

Cocos2d-x 3.2 大富翁游戏项目开发-第十三部分 购买空地相关推荐

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第二十三部分 购买彩票

    当角色路过彩票的标志或者停留位置有彩票标志时,弹出购买彩票的对话框,提示购买彩票,已经买过的号码,不显示.当机器对手路过时则直接购买彩票. 1. 在RicherPlayer.h中增加std::vect ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走

    路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScene::goB ...

  3. Cocos2d-x 3.2 大富翁游戏项目开发

    第一部分开工大吉 大富翁游戏以前采用了AndEngine引擎开发,由于该引擎的天生缺陷,不支持跨平台,只能在Android设备上运行,所以刻苦研究C++ ,搜罗关于Cocos2d-x 的资料,终于把C ...

  4. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

    点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法,用来获取 ...

  5. Cocos2d-x 3.2 大富翁游戏项目开发-第三十部分 项目移植

    本人只有android设备,没有苹果,无法测试,就不说怎么移植到苹果了.能力有限,请各位见谅 首先调整屏幕适配 修改AppDelegate.cpp文件 //glview->setFrameSiz ...

  6. Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能

    本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力  等级共5 ...

  7. Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市

    当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点 ...

  8. Cocos2d-x 3.2 大富翁游戏项目开发-第三部分 菜单场景

    上一部分介绍到片头动画介绍后进入到菜单场景,场景效果如图 MenuScene.h头文件如下: class MenuScene : public LayerColor { public:static S ...

  9. Cocos2d-x 3.2 大富翁游戏项目开发-第二十八部分 游戏保存和载入存档游戏

    1.游戏保存 如图,在右下角增加保存图标,点击后进行游戏的保存. 游戏保存采用json格式,具体如下: {"map_level":2, // 游戏关卡"gameRound ...

最新文章

  1. VirtualBox快照(Snapshot)功能使用及注意事项
  2. linux下单独安装oracle12.1客户端
  3. vuepress 代码高亮支持的语言
  4. hdu Candy Sharing Game
  5. 小白打基础一定要吃透的11类 Python 内置函数
  6. Java实现Redis的消息订阅和发布
  7. 判断参数大于0_能做条件判断的文本函数
  8. 【渝粤教育】国家开放大学2019年春季 2766养羊技术 参考试题
  9. 001.Spark的日志配置
  10. 程序员懒人投资大法之定投指数基金
  11. 2020新版小桔灯作文能力阶梯序列作文课件教案教材全套
  12. Proteus与Keil联调 ARM STM32流水灯
  13. 关于单点登录的一点想法
  14. 【GNURadio实验报告】实验2-使用GNURadio仿真OOK信号
  15. 关于树的一些学习心得
  16. zabbix tigger 设置
  17. 系统设置了静态IP之后还会获取动态IP的问题解决
  18. 白杨SEO:从5118站长工具备案内参发现百度SEO批量建站优化玩法
  19. 【Proteus仿真】【51单片机】数字电压表设计
  20. 快递提前签收件怎么快速归类

热门文章

  1. 微商前途无量,可微信电商没有出路
  2. CAS 票根'ST-685-XXXXXXXX-eFfa-cas'不符合目标服务
  3. Cesium 四种雷达扫描效果
  4. 详解退役军人一体化综合信息服务云平台解决方案
  5. 《J2SE 回炉再造03》-------溺水狗
  6. 打印直角三角型、等腰三角型、菱形
  7. 网络与继续教育学院2022 学年上学期《基础实验》期末考试试题(综合大作业)
  8. 学习BitSet集合中set方法的小结
  9. 同花顺python_【本地直连】同花顺 Python量化交易接口上线
  10. bzoj4861 / P3715 [BJOI2017]魔法咒语