简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下:

人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等;

类似上面的图示交互UI,他们是悬浮于窗体上的。那么按照我现在做的层级架构就是这些UI操作,是不属于任何CCObject的,或者被继承的;

回到第一篇我对整个架构的分析,这些交互UI属于事件,和任务类型!对于手游UI来说这类似的UI设计更为严格,因为玩家位移的交互方式,

就是点击屏幕,我们要虚拟化各种按键去实现各种操作。

先把以上描述的基本UI在界面上画出来:

BaseUI.cpp , BaseUI.h 类

  1.    ui_exp = BaseUI::create(p_expbd);
  2. ui_exp ->setPosition(ccp(,ui_exp->getContentSize().height+));
  3. layer->addChild(ui_exp,);
  4.  
  5. ui_skillbar = BaseUI::create(p_skillbarbd);
  6. ui_skillbar ->setPosition(ccp(size.width-ui_skillbar->getContentSize().width+,ui_skillbar->getContentSize().height));
  7. layer->addChild(ui_skillbar,);
  8.  
  9. ui_skill_skill0 = BaseUI::create(p_skill_nv0);
  10. ui_skill_skill0 ->setPosition(ccp(size.width-ui_skill_skill0->getContentSize().width+,ui_skill_skill0->getContentSize().height+));
  11. layer->addChild(ui_skill_skill0,,);

我们需要通过触摸点击去识别判断我们的UI坐标是否被用户点击:

  1. CCRect BaseUI::rect_skill0()
  2. {
  3. //获取精灵区域大小
  4. return CCRectMake(ui_skill_skill0->getPositionX()- ui_skill_skill0->getContentSize().width * ui_skill_skill0->getAnchorPoint().x,ui_skill_skill0->getPositionY()-ui_skill_skill0->getContentSize().height* ui_skill_skill0->getAnchorPoint().y,ui_skill_skill0->getContentSize().width, ui_skill_skill0->getContentSize().height);
  5.  
  6. }
  7.  
  8. void BaseUI::isTouchInside(CCTouch *pTouch)
  9. {
  10.  
  11. CCPoint localPoint = pTouch->getLocation();
  12. CCRect rc = rect_skill0();
  13. bool isTouched = rc.containsPoint(localPoint);
  14. if (isTouched == true) {
  15. CCLog(FontChina::G2U("1111111111111111111!"));
  16. if(touch_skill0_flag!=true)
  17. {
  18. touch_skill0_flag = true;
  19. }
  20. }
  21. }

我们设置了变量如:技能的变量(touch_skill0_flag)来在其他地方去实现技能释放,执行释放操作的的关联是在baseMap上面,因为之前我们的逻辑关系上,玩家是属于地图层级,那么我们便可以很方便的去控制玩家释放技能对怪物的操作交互;

  1. //启动玩家操作监听器
  2. nowmap->schedule(schedule_selector(Maps_Diyu::makeroleAttack));

让在地图层上面我们需要启动监听器去实现技能得操作,那么我们就如下去写:

  1. void Maps_Diyu::makeroleAttack(float times)
  2. {
  3. if(touch_skill0_flag==true)
  4. {
  5. //先去寻找主角周围的敌人,选择最近的一个为目标;
  6. CCPoint playerpoint = this->getChildByTag()->getPosition();
  7. int attck_reatR = ;
  8. int nowtag = -;
  9. CCPointArray* attck_pointlist = CCPointArray::create();
  10. for (int i = ; i < ; i++)
  11. {
  12. CCRect* attck_rect = new CCRectMake(this->getChildByTag()->getPosition().x-attck_reatR/,this->getChildByTag()->getPosition().y-attck_reatR/,attck_reatR,attck_reatR);
  13. if(this->getChildByTag(+i)!=NULL)
  14. {
  15. if(attck_rect->containsPoint(this->getChildByTag(+i)->getPosition())==true)
  16. {
  17. CCLog(FontChina::G2U("在主角攻击范围"));
  18. attck_pointlist->addControlPoint(this->getChildByTag(+i)->getPosition());
  19. nowtag=+i;
  20. break;
  21. }
  22. }
  23. }
  24. if(nowselects==true)
  25. {
  26. //攻击默认怪物
  27. CCPoint attck_point = this->getChildByTag(nowselecttag)->getPosition();
  28. basedatas = new GetNPCData();
  29. basedatas->GetRoleData();
  30. basedatas->role_player.acttodo=attack;
  31. SpiritsPlayer::attckTomap_dir(ccp(attck_point.x,attck_point.y),(CCSprite*)this->getChildByTag(),basedatas->role_player);
  32. SkillEffects* role_skill = new SkillEffects(ccp((int)attck_point.x,(int)attck_point.y),basedatas->role_player,(0.2f+CCRANDOM_0_1()),,,);
  33.  
  34. this->addChild(role_skill->effects_main,,);
  35. role_skill->release();
  36. SpiritsMonster::showattcknumber(,(CCSprite*)this->getChildByTag(nowselecttag));
  37. }
  38. else
  39. {
  40. if(attck_pointlist->count()>)
  41. {
  42. //攻击默认怪物
  43. CCPoint attck_point = attck_pointlist->getControlPointAtIndex();
  44. //该技能是否先移动一定距离,再进行攻击,还是直接释放魔法攻击
  45. basedatas = new GetNPCData();
  46. basedatas->GetRoleData();
  47. basedatas->role_player.acttodo=attack;
  48. SpiritsPlayer::attckTomap_dir(ccp(attck_point.x,attck_point.y),(CCSprite*)this->getChildByTag(),basedatas->role_player);
  49. SkillEffects* role_skill = new SkillEffects(ccp((int)attck_point.x,(int)attck_point.y),basedatas->role_player,(0.2f+CCRANDOM_0_1()),,,);
  50.  
  51. this->addChild(role_skill->effects_main,,);
  52. role_skill->release();
  53. SpiritsMonster::showattcknumber(,(CCSprite*)this->getChildByTag(nowtag));
  54. }
  55. }
  56. touch_skill0_flag=false;
  57. }
  58.  
  59. }

上面的写法,又再一次利用了怪物AI里面的一些基本逻辑,不过这套逻辑是需要玩家去手动触发的;

我建了一个QQ群:和大家一起分享cocos2dx开发经验【41131516】

【cocos2d-x 手游研发----界面UI设计】的更多相关文章

  1. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  2. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  3. SLG手游Java服务器的设计与开发——数据管理

    文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文介绍了我们的SLG手游的服务器架构设计以及网络通信部分,本文介绍数据管理部分,在数据存储方面,我选择了Mysql.M ...

  4. 手游研发CJ抱大腿指南

    文摘要:CJ来了,又是一年一度的游戏圈盛事,随着手游行业的迅速崛起,今年CJ上,手游研发商以及发行商必定成为焦点.由于门槛低.市场热.前景好等因素的影响,国内一下子蹦出一大堆手游研发团队.很幸运(或者 ...

  5. SLG手游Java服务器的设计与开发——架构分析

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  6. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  7. 【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】

    先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋···· 每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!! 这次新项目专项针对andr ...

  8. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  9. 【cocos2d-x 手游研发----怪物智能AI】

    原创文章,转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2d-xARPG4.html 谈到怪物AI,我觉得就比较话多了,首先理解一下(Artificial I ...

随机推荐

  1. swift 移除所有子控件

    /// 移除所有子控件 func removeAllSubViews(){ if self.view.subviews.count>0{ self.view.subviews.forEach({ ...

  2. iOS 基于MVC设计模式的基类设计

    iOS 基于MVC设计模式的基类设计 https://www.jianshu.com/p/3b580ffdae00

  3. Golang之定义错误(errors)

    基本示例: package main //定义错误 //error 也是个接口 import ( "errors" "fmt" ) var errNotFoun ...

  4. 【转】MEF程序设计指南一:在应用程序中宿主MEF

    在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可.首先需要添加MEF框 ...

  5. inux中Vi不能高亮显示行号的解决办法

    适用版本:CentOS,RedHat,UBUNTU,Fedora解决办法如下: 在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc 在Fedora中vim的配置文件存 ...

  6. url传递数据

    一.post传递数据 $ci = curl_init($url); curl_setopt($ci, CURLOPT_HEADER, 0); curl_setopt($ci, CURLOPT_RETU ...

  7. Jmeter参数化HTTP request中Send Files With The Request的文件路径和文件名

  8. 学习Java的方法

    许多人在刚开始学习Java时,会因为学习方法的不正确,而丧失信心,从而半途而废.所以,今天,巩固就要教教大家学习Java的方法. 1.多练习 编程其实是一个非常抽象的东西,要想学好它,就不能只是看看书 ...

  9. 2018.07.17 HAOI2016 找相同字符(SAM)

    传送门 就是给两个字符串,让你求公共字串的个数. 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了.我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可. ...

  10. 打包python为可执行文件时报错R6034解决方案

    R6034 指的是:”An application has made an attempt to load the C runtime library incorrectly. Please cont ...