开发cocos2d-x 游戏 实战篇(8)--终结篇

哈哈虽然这个游戏完结了但是不代表我的博客更新就此,结束。我以后还会不断更新以项目的方式给大家讲解cocos2d-x 的用法。对于这个游戏我来总结一下。这些天群里问我的朋友不少,我发现一个问题。或者说 咱们的思路可能不一样。很多人问我是怎么想的哪些功能是怎么实现的。其实BOY也是人也不是神。很多东西我一开始也没想到,不过大的框架的地方一定要想到。例如拿武器系统来说 我刚开始想的时候 想这个武器系统能生产子弹和发射子弹 就可以了 后来发现不够 还得加子弹回收系统。再后来发现还需要检测碰撞。这些都是在做的过程中一点一点细化出来的。做的时候有最开始最简单的做起这样可以增强自己的信心,千万不要一开始想的太复杂。不过如果你是一个团队,刚开始尽量把一个功能想清楚。如果是个人的 可以按照我的想法来。总之我做游戏的方法是从大到小从简单到困难。还有一个最重要的我要在这里说一下就是学习能力。很多群里的朋友遇到问题就问。很多时候都是很简单的问题,你可以通过度娘谷歌 这个两个NB的师傅来帮助你。其实这也是一个学习过程在你找的过程中可以加深记忆。如果你一上来就问,别人帮你解决了你可能就当是能记住。还有一个就是对于某些方法不知道什么意识的一定要看注释。或者源码。cocos2d-x 的注释加的还是比较好。英文看不懂的 google 翻译一下就OK 。说了这么多就是想给大家说如果提高自己的学习能力。还有一个最重的 就是千万不要眼高手低 一定要多加练习。俗话说的好 好记心不如烂笔头。

           哈哈发现我能吐槽这么多。我把今天的代码 大略的讲解一下吧。

           首先先上游戏截图

    

哈哈看起来比较简单吧。不过确实很简单,但是不代表好写。这里主要要掌握好个个升级以后的比例值。在这里大家不要吐糟BOY 的数值问题。我也是随便弄得。真正的游戏 数值这一块肯定是会好好的策划一下的,不过这些东西大家可以根据自己的喜好来修改这些值。         贴上这个界面的主要代码

  1. #include "UpgradeSystemLayer.h"
  2. #include "DefenderGameLayer.h"
  3. USING_NS_CC;
  4. CCScene* UpgradeSystemLayer::scene(){
  5.         CCScene* scene=CCScene::create();
  6.         UpgradeSystemLayer* layer=UpgradeSystemLayer::create();
  7.         scene->addChild(layer);
  8.         return scene;
  9. }
  10. bool UpgradeSystemLayer::init(){
  11.         bool isRet=false;
  12.         do 
  13.         {
  14.                 CC_BREAK_IF(!BaseLayer::init());
  15.                 CC_BREAK_IF(!this->setUpdateView());
  16.                 isRet=true;
  17.         } while (0);
  18.         return isRet;
  19. }
  20. bool UpgradeSystemLayer::setUpdateView(){
  21.         bool isRet=false;
  22.         do {
  23.                 char temp[12];
  24.                 // 初始化背景
  25.                 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("game/lvSyspng.plist",CCTextureCache::sharedTextureCache()->textureForKey("game/lvSyspng.png"));
  26.                 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("game/lvinfo.plist",CCTextureCache::sharedTextureCache()->textureForKey("game/lvinfo.png"));

  27.                 CCSprite* pbg=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("gmbg/research_bg.png"));
  28.                 CC_BREAK_IF(!pbg);
  29.                 pbg->setPosition(getWinCenter());
  30.                 this->addChild(pbg);

  31.                 int gold =CCUserDefault::sharedUserDefault()->getIntegerForKey("goldNum",0);
  32.                 // 金币数目
  33.                 sprintf(temp,"%d",gold);
  34.                 CCLabelAtlas* goldnumbrer= CCLabelAtlas::create(temp,"game/numtips.png",25,31,'0');
  35.                 CC_BREAK_IF(!goldnumbrer);
  36.                 goldnumbrer->setAnchorPoint(ccp(0,0));
  37.                 goldnumbrer->setPosition(ccp(425,440));
  38.                 goldnumbrer->setScale(0.5);
  39.                 this->addChild(goldnumbrer,1,5);


  40.                 int lve=CCUserDefault::sharedUserDefault()->getIntegerForKey("lve",1);
  41.                 sprintf(temp,"%d",lve);
  42.                 // 当前关卡
  43.                 CCLabelAtlas* stagenumbrer= CCLabelAtlas::create(temp,"game/numtips.png",25,31,'0');
  44.                 CC_BREAK_IF(!stagenumbrer);
  45.                 stagenumbrer->setScale(0.5);
  46.                 stagenumbrer->setAnchorPoint(ccp(0,0));
  47.                 stagenumbrer->setPosition(ccp(715,440));
  48.                 this->addChild(stagenumbrer,1,6);

  49.                 // 选中某个按钮是显示边框
  50.                 CCSprite* pselect= CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("logselect.png"));
  51.                 CC_BREAK_IF(!pselect);
  52.                 pselect->setVisible(false);
  53.                 this->addChild(pselect,2,1);

  54.                 // 创建 防御者升级按钮
  55.                 CCMenuItemSprite* denfer=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("defender.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("defender.png")),this,menu_selector(UpgradeSystemLayer::publicClickCallBack));
  56.                 CC_BREAK_IF(!denfer);
  57.                 denfer->setPosition(getWinCenter());
  58.                 denfer->setPositionY(denfer->getPositionY()+90);
  59.                 denfer->setTag(2);


  60.                 //  创建城墙升级按钮
  61.                 CCMenuItemSprite* citywall=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("citywall.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("citywall.png")),this,menu_selector(UpgradeSystemLayer::publicClickCallBack));
  62.                 CC_BREAK_IF(!citywall);
  63.                 citywall->setPosition(getWinCenter());        
  64.                 citywall->setTag(3);


  65.                 // 创建 魔法升级按钮
  66.                 CCMenuItemSprite* magictower=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("magictower.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("magictower.png")),this,menu_selector( UpgradeSystemLayer::publicClickCallBack));
  67.                 CC_BREAK_IF(!magictower);

  68.                 magictower->setPosition(getWinCenter());

  69.                 magictower->setPositionY(magictower->getPositionY()-90);
  70.                 magictower->setTag(4);


  71.                 // 创建继续按钮
  72.                 CCMenuItemSprite* contin=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("button_nextup.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnnextdown.png")),this,menu_selector( UpgradeSystemLayer::coniteClickCallBack));
  73.                 CC_BREAK_IF(!contin);
  74.                 contin->setAnchorPoint(ccp(1,0));
  75.                 contin->setPosition(converSpritRel(getWinSize().width,10));


  76.                 // 创建升级按钮
  77.                 CCMenuItemSprite* updage=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnupgradeUp.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnUpgradedown.png")),this,menu_selector(UpgradeSystemLayer::updateClickCallBack));
  78.                 CC_BREAK_IF(!updage);

  79.                 updage->setAnchorPoint(ccp(1,0));
  80.                 updage->setPosition(converSpritRel(getWinSize().width-180,10));
  81.                 updage->setTag(5);

  82.                 CCMenu* menu=CCMenu::create(denfer,citywall,magictower,contin,updage,NULL);
  83.                 CC_BREAK_IF(!menu);
  84.                 menu->setPosition(CCPointZero);
  85.                 this->addChild(menu,1,12);

  86.                 CCSprite* deinfo=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("definfo.png"));
  87.                 deinfo->setAnchorPoint(ccp(0,0.5));
  88.                 deinfo->setPosition(ccp(10,48));
  89.                 this->addChild(deinfo,1,7);
  90.                 deinfo->setVisible(false);

  91.                 // 创建显示金币的小图标

  92.                 CCSprite* coin=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("game/coin.png"));
  93.                 coin->setAnchorPoint(ccp(0,0));
  94.                 coin->setPosition(converSpritRel(getWinSize().width-315,50));
  95.                 this->addChild(coin,1,11);
  96.                 coin->setVisible(false);

  97.                 // 显示金币消耗数目
  98.                 CCLabelAtlas* updagexiao= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
  99.                 CC_BREAK_IF(!updagexiao);
  100.                 updagexiao->setAnchorPoint(ccp(0,0));
  101.                 updagexiao->setPosition(converSpritRel(getWinSize().width-280,57));
  102.                 updagexiao->setScale(0.7f);
  103.                 this->addChild(updagexiao,1,10);
  104.                 updagexiao->setVisible(false);


  105.                 // 当前等级说明
  106.                 CCLabelAtlas* curint= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
  107.                 CC_BREAK_IF(!curint);
  108.                 curint->setAnchorPoint(ccp(0,0));
  109.                 curint->setPosition(ccp(160,30));
  110.                 curint->setScale(0.5f);
  111.                 this->addChild(curint,1,8);
  112.                 curint->setVisible(false);

  113.                 // 下一等级说明
  114.                 CCLabelAtlas* nextp= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
  115.                 CC_BREAK_IF(!nextp);
  116.                 nextp->setAnchorPoint(ccp(0,0));
  117.                 nextp->setPosition(ccp(180,10));
  118.                 nextp->setScale(0.5f);
  119.                 this->addChild(nextp,1,9);
  120.                 nextp->setVisible(false);
  121.                 isRet=true;
  122.         } while (0);
  123.         return isRet;
  124. }

  125. // 通用触摸回调事件
  126. void UpgradeSystemLayer::publicClickCallBack(cocos2d::CCObject* pSend){        
  127.         CCMenuItemSprite* item=(CCMenuItemSprite*) pSend;
  128.         CCSprite* pselect=(CCSprite*)this->getChildByTag(1);
  129.         pselect->setPosition(item->getPosition());
  130.         pselect->setVisible(true);
  131.         int tag=item->getTag();
  132.         this->initDefner(tag);

  133. // 升级按钮回调事件
  134. void UpgradeSystemLayer::updateClickCallBack(cocos2d::CCObject* pSend){
  135.         int gold =CCUserDefault::sharedUserDefault()->getIntegerForKey("goldNum",0);
  136.         if(selectId==2){        
  137.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗1000
  138.                 int denfehurtlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurtlv",0); // 默认0
  139.                 if((denfehurtlv+1)*1000<=gold){
  140.                         int defr= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurt",10); // 默认攻击力是10
  141.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("denfehurt",(defr+5));// 提升攻击力
  142.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("denfehurtlv",(denfehurtlv+1));// 提升等级
  143.                         gold=gold-(denfehurtlv+1)*1000;
  144.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金币
  145.                         this->initDefner(selectId);
  146.                 }        
  147.         }else if(selectId==3){
  148.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗500
  149.                 int citybloodlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citybloodlv",0); // 默认0
  150.                 if((citybloodlv+1)*500<=gold){
  151.                         int cityblood= CCUserDefault::sharedUserDefault()->getIntegerForKey("cityblood",100); // 默认攻击力是20
  152.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("cityblood",(cityblood+10));// 提升攻击力
  153.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("citybloodlv",(citybloodlv+1));// 提升等级
  154.                         gold=gold-(citybloodlv+1)*1000;
  155.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金币
  156.                         this->initDefner(selectId);
  157.                 }        
  158.         }else if(selectId==4){

  159.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗1500
  160.                 int citymglv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymglv",0); // 默认0
  161.                 if((citymglv+1)*500<=gold){
  162.                         int citymg= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymg",100); // 默认攻击力是20
  163.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("citymg",(citymg+10));// 提升攻击力
  164.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("citymglv",(citymglv+1));// 提升等级
  165.                         gold=gold-(citymglv+1)*1000;
  166.                         CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金币
  167.                         this->initDefner(selectId);
  168.                 }        

  169.         }

  170.         // 重新初始化上面显示的总金币数

  171.          CCLabelAtlas* goldnumbrer=(CCLabelAtlas*)this->getChildByTag(5);
  172.          char te[12];
  173.          sprintf(te,"%d",gold);
  174.          goldnumbrer->setString(te);

  175. }
  176. // 继续游戏按钮回调事件
  177. void UpgradeSystemLayer::coniteClickCallBack(cocos2d::CCObject* pSend){
  178.         CCScene* se=DefenderGameLayer::scene();
  179.         CCDirector::sharedDirector()->replaceScene(CCTransitionSlideInR::create(1,se));
  180. }
  181. // 初始化显示标签的内容
  182. void UpgradeSystemLayer::initDefner(int selectId){
  183.         char temp[12];
  184.         CCSprite* deinfo=(CCSprite*)this->getChildByTag(7);
  185.         deinfo->setVisible(true);
  186.         CCLabelAtlas* curint=(CCLabelAtlas*)this->getChildByTag(8);
  187.         curint->setVisible(true);
  188.         CCLabelAtlas* nextp= (CCLabelAtlas*)this->getChildByTag(9);
  189.         nextp->setVisible(true);
  190.         CCLabelAtlas* updagexiao=(CCLabelAtlas*)this->getChildByTag(10);
  191.         updagexiao->setVisible(true);
  192.         CCSprite* coin=(CCSprite*)this->getChildByTag(11);
  193.         coin->setVisible(true);
  194.         int tag=selectId;

  195.         if(tag==2){// 点击的防御者        
  196.                 deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("definfo.png"));
  197.                 int defr= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurt",10); // 默认攻击力是20
  198.                 sprintf(temp,"%d",defr);
  199.                 curint->setString(temp);
  200.                 // 假设没升级一次 增加5点攻击力
  201.                 sprintf(temp,"%d",(defr+5));
  202.                 nextp->setString(temp);
  203.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗1000
  204.                 int denfehurtlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurtlv",0); // 默认攻0
  205.                 sprintf(temp,"%d",(denfehurtlv+1)*1000);
  206.                 updagexiao->setString(temp);
  207.                 this->selectId=2;
  208.         }else if(tag==3){ // 主城
  209.                 deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("cityinfo.png"));        
  210.                 int cityblood= CCUserDefault::sharedUserDefault()->getIntegerForKey("cityblood",100); // 默认是100
  211.                 sprintf(temp,"%d",cityblood);
  212.                 curint->setString(temp);
  213.                 // 假设没升级一次 增加10点气血
  214.                 sprintf(temp,"%d",(cityblood+10));
  215.                 nextp->setString(temp);
  216.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗500
  217.                 int citybloodlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citybloodlv",0); // 0
  218.                 sprintf(temp,"%d",(citybloodlv+1)*500);
  219.                 updagexiao->setString(temp);

  220.                 this->selectId=3;
  221.         }else if(tag==4){
  222.                 deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("maginfo.png"));        
  223.                 int citymg= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymg",100); // 默认魔法是100 点
  224.                 sprintf(temp,"%d",citymg);
  225.                 curint->setString(temp);
  226.                 // 假设没升级一次 增加10点魔法
  227.                 sprintf(temp,"%d",(citymg+10));
  228.                 nextp->setString(temp);
  229.                 //设没每升一级 所消耗的金币是上次的双倍 第一次默认是消耗1500
  230.                 int citymglv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymglv",0); // 默认0
  231.                 sprintf(temp,"%d",(citymglv+1)*1500);
  232.                 updagexiao->setString(temp);
  233.                 this->selectId=4;
  234.         }
  235. }
复制代码
哈哈没想到一个小小的界面这么多代码吧。这个界面确实麻烦一点。可能还存在漏洞。不过整体设计就是这样的我的代码注释加的还可以吧。有时候复制粘贴的可能代码注释不是很对但是大多时候 大家还能能看明白的 这要注意别的类里面修改下从

  1. CCUserDefault 这个对象中取出相应的值
复制代码
在上一张游戏开始界面的图吧。终于看到了完整的按钮界面了



感觉好不错。我答应大家的说把这个游戏做完 我现在做到了。虽然在这些天大家给我提了很多的BUG 不过整体运行还是没问题。希望大家都比我好一点一定要坚持。         对于游戏中的BUG 大家可以自己把源码下过来来自己修改。甚至可以随便的改,不过千万不要用这个项目做商业用途啊。哈哈。转载的时候注明是BOY 哈哈        对于那些热爱游戏的新手们希望 我的博客能给你带来帮助。咱们一起学习进步。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值