开发cocos2d-x 游戏 实战篇(5)之魔法阵和自定义弹框

这一章包含的内容有 添加魔法阵的CD 动画 其实就是游戏中的技能的CD 在一个重要的一点就是自定义弹出框。还有一点就是给主城添加气血和魔法。在这里给大家说下我添加的这些东西 有些具体的功能还没实现 例如魔法阵 这一块我感觉是比较重要的一块,我准备放到下一章来专门讲解 魔法阵的实现,在游戏中如何使用魔法消灭怪物,呵呵是不是很期待啊。还有一个就是在弹出框中我 我重新开始游戏这一点我还没实现,别看这么一个简单的小功能 这个牵涉到关卡系统,这个游戏写到这里我还没写到关卡系统 因为我感觉这个比较重要。所以也放到后面的章节中讲解

       下面讲解一下魔法阵的CD 的实现由于 目前魔法阵不具有 释放魔法的能力所以 有些功能我还没实现后面专门一张讲解魔法阵大家 关注我的博客啊。

       贴出魔法阵的代码


  1. #ifndef __MAGICMATRIX_SPRITE_H__
  2. #define __MAGICMATRIX_SPRITE_H__
  3. #include "cocos2d.h"
  4. //此类是魔法矩阵
  5. class MagicMatrixSprite:public cocos2d::CCNode{
  6. public:
  7.       MagicMatrixSprite();
  8.           ~MagicMatrixSprite();
  9.           CC_SYNTHESIZE(float,hurt,Hurt);// 伤害值
  10.           CC_SYNTHESIZE(bool,avail,Avail);//是否可用  
  11.           CC_PROPERTY(bool,activation,Activation);// 是否激活魔法阵
  12.           // 注意一点图片必须放在缓存里面
  13.           static MagicMatrixSprite* createWithPic(char* pMagicPic,char* pMagicPicBg); // 第一个参数CD 的比较暗淡的图片 第二个是比亮的动画
  14.           CC_SYNTHESIZE(float,mana,Mana);// 消耗魔法值
  15.           void runMagicCDAnimation();// 执行魔法CD 动画
  16. private:
  17.           bool setUpdateView(char* pMagicPic,char* pMagicPicBg );
  18.           cocos2d::CCProgressTimer *ptss;// 魔法阵的CD 动画
  19.           void runMagicCDAnimationCallBack(cocos2d::CCNode* pSed);
  20. };
  21. #endif
复制代码
这个代码大家都能看懂吧 其实技能的CD 实现就是一张暗色的图片在下面 一张明亮的图片在上面   用
  1. CCProgressTimer
复制代码

来实现技能的CD 效果

看主要代码

  1. bool MagicMatrixSprite::setUpdateView(char* pMagicPic,char* pMagicPicBg ){
  2.         bool isRet=false;
  3.         do 
  4.         {

  5.                 CCSprite *s2=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPicBg));//pa2.png是较暗的图片 
  6.                 CC_BREAK_IF(!s2);
  7.                 s2->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));  
  8.                 addChild(s2,0);
  9.                 CCSprite *s=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPic));//pa1.png是较亮的图片
  10.                 CC_BREAK_IF(!s);
  11.                 ptss=CCProgressTimer::create(s);
  12.                 CC_BREAK_IF(!ptss);

  13.                 if(!this->getActivation()){
  14.                         ptss->setVisible(false);
  15.                 }
  16.                 ptss->setPercentage(0);

  17.                 ptss->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));  
  18.                 //转圈的CD实现  
  19.                 ptss->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeRadial));  
  20.                 //从中间到外的出现  
  21.                 //pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeBar));  
  22.                 this->addChild(ptss,1); 


  23.                 isRet=true;
  24.         } while (0);
  25.         return isRet;

  26. }
复制代码
初始化技能CD 动画代码
  1. void MagicMatrixSprite::runMagicCDAnimation(){
  2.         if (ptss)
  3.         {
  4.                 if (avail==false&&this->activation)
  5.                 {
  6.                         ptss->stopAllActions();
  7.                         CCProgressTo *t=CCProgressTo::create(8,100);  
  8.                         CCCallFuncN *onComplete =  CCCallFuncN::create(this, callfuncN_selector(MagicMatrixSprite::runMagicCDAnimationCallBack));  
  9.                         CCSequence* pse=CCSequence::create(t,onComplete,NULL);
  10.                         ptss->runAction(pse);  
  11.                 }

  12.         }


  13. }
复制代码
这代码大家都能懂吧当大家实现以上代码的时候 就可以看到这样的效果 看到下面的魔法阵了的CD 动画了吧 是不是帅 不帅我也没法了 这是我在网上找到图片,今天群里面人吐槽我弄的图片丑 在这里给大家说声对不起 本人PS 水平真不行。下面就是今天压轴戏了 自定义弹出框  大家要是想 建立一个自己的弹出框 首先去了解一下cocos2d-x 触摸等级 这个东西。龙灵修大哥的视频中有讲解,大家可以去看看这里也谢谢龙灵修和无脑码农。弹出框主要代码
  1. #ifndef __PAUSEGAMEDIALOG_LAYER_H__
  2. #define __PAUSEGAMEDIALOG_LAYER_H__
  3. #include "BaseLayer.h"
  4. class PauseGameDialogLayer : public BaseLayer
  5. {
  6. public:
  7.         PauseGameDialogLayer();
  8.         ~PauseGameDialogLayer();    
  9.         virtual bool init();
  10.         // 初始化对话框内容
  11.         bool setUpdateView();    
  12.         CREATE_FUNC(PauseGameDialogLayer);    
  13.         void onEnter();
  14.         void onExit();    
  15.         virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
  16.         virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
  17.         virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
  18.         virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);    
  19.         void homeMenuItemCallback(cocos2d::CCObject *pSender); //点击家按钮回调函数
  20.         void retyMenuItemCallback(cocos2d::CCObject *pSender); //点击重新开始游戏回调函数
  21.         void resumeMenuItemCallback(cocos2d::CCObject *pSender);//点击继续游戏按钮 回调函数
  22.         cocos2d::CCMenu *m_pMenu; // 模态对话框菜单    
  23.         bool m_bTouchedMenu;// 记录菜单点击
  24. };
  25. #endif
复制代码
这里的弹出框我是继承我自己自定义的layer   主要是这句代码
  1. void PauseGameDialogLayer::onEnter()
  2. {
  3.         BaseLayer::onEnter();
  4.         CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(  
  5.                 this,//在那个类中实现触屏回调函数  
  6.                 -128, //优先级  
  7.                 true);//触摸时间是否被该目标截获  
  8. }
复制代码
看到优先等级了吗我把这个层  等级设成成 -128  可以说是最高了
  1. bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
  2. {

  3.         m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent);

  4.         return true;
  5. }

  6. void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
  7. {
  8.         if (m_bTouchedMenu) {
  9.                 m_pMenu->ccTouchMoved(pTouch, pEvent);
  10.         }
  11. }

  12. void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
  13. {
  14.         if (m_bTouchedMenu) {
  15.                 m_pMenu->ccTouchEnded(pTouch, pEvent);
  16.                 m_bTouchedMenu = false;
  17.         }
  18. }

  19. void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
  20. {
  21.         if (m_bTouchedMenu) {
  22.                 m_pMenu->ccTouchEnded(pTouch, pEvent);
  23.                 m_bTouchedMenu = false;
  24.         }
  25. }
复制代码
大家看到这一段代码时候或许会疑惑 其实总体的思路是这样的 当这个层接受到 触摸事件的时候吧把他接受到的时间传递给你要接受的按钮 让下面的那个层的按钮无法接受触摸时间就OK 了然后退出这个层的时候  把这个层的触摸时间给移除掉
  1. void PauseGameDialogLayer::onExit()
  2. {
  3.         BaseLayer::onExit();
  4.         CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  5. }
复制代码
上面的都是我自己摸索弄的 理解上可能有偏差,如果那里不对希望大家给我留言我会更正一下 省的误导大家当上面的代码都实现的时候 就可以看到下面这个弹出层的界面 哈哈一个漂亮的弹出框就出来 至于按钮上的时间 最后一个没实现其都以实现 。别说我懒啊。    最后给大家一点忠告 就一句话 好记心不如烂笔头,就是劝大家多练练别扯没用的东西。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值