开发cocos2d-x 游戏 实战篇(6)之 绚丽的魔法特效

来源:互联网 发布:手机软件无法连接网络 编辑:程序博客网 时间:2024/05/20 02:54
呵呵看起来还是很绚丽的吧 要问这个代码是怎么实现 明白人一看大概都能了解     首先我修改了我武器系统里面的部分代码   就是为了加入上面那些绚丽的特效

  1. void WeaponSprite::initIdleMagicSpool(cocos2d::CCLayer* pLayer){
  2.         int cout=3;// 假设 魔法矩阵的

  3.         CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("specia/thumbnails.plist",CCTextureCache::sharedTextureCache()->textureForKey("specia/thumbnails.png"));
  4.         for(int i=0;i<cout;i++){                        
  5.                 MagicMatrixSprite* magicMatrixSprite=MagicMatrixSprite::createWithPic("game/jnzt.png","game/jnl.png");
  6.                 this->magicArray->addObject(magicMatrixSprite);
  7.                 magicMatrixSprite->setAnchorPoint(ccp(0,0));
  8.                 float x=pLayer->getContentSize().width-magicMatrixSprite->getContentSize().width*(i+1)-(i+1)*20;
  9.                 magicMatrixSprite->setPosition(ccp(x,0));
  10.                 magicMatrixSprite->setActivation(true);
  11.                 magicMatrixSprite->runMagicCDAnimation();        
  12.                 magicMatrixSprite->setHurt(100);
  13.                 if(i==2){
  14.                         // 地狱石块特效
  15.                         magicMatrixSprite->setSpeciaCount(16);
  16.                         magicMatrixSprite->setSpeciaFileName("specia/diyu.plist");
  17.                         magicMatrixSprite->setSpeciaName("diyu");
  18.                         magicMatrixSprite->setSpeciaPicName("specia/diyu.png");
  19.                         magicMatrixSprite->setAnchorPo(ccp(0.5,0.4));
  20.                         if (magicMatrixSprite->getActivation()){
  21.                                 CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("diyus.png"));
  22.                                 tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
  23.                                 magicMatrixSprite->addChild(tem);
  24.                         }
  25.                         

  26.                 }else if(i==1){
  27.                         // 二龙戏珠特效
  28.                         magicMatrixSprite->setSpeciaCount(15);
  29.                         magicMatrixSprite->setSpeciaFileName("specia/long.plist");
  30.                         magicMatrixSprite->setSpeciaName("long");
  31.                         magicMatrixSprite->setSpeciaPicName("specia/long.png");
  32.                         magicMatrixSprite->setAnchorPo(ccp(0.5,0.4));
  33.                         if (magicMatrixSprite->getActivation()){
  34.                                 CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("longs.png"));
  35.                                 tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
  36.                                 magicMatrixSprite->addChild(tem);
  37.                         }
  38.                         
  39.                 }else {
  40.                         // 闪电特效
  41.                         magicMatrixSprite->setSpeciaCount(18);
  42.                         magicMatrixSprite->setSpeciaFileName("specia/ligtht.plist");
  43.                         magicMatrixSprite->setSpeciaName("light");
  44.                         magicMatrixSprite->setSpeciaPicName("specia/ligtht.png");
  45.                         magicMatrixSprite->setAnchorPo(ccp(0.5,0.2));
  46.                         if (magicMatrixSprite->getActivation()){
  47.                                 CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("lights.png"));
  48.                                 tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
  49.                                 magicMatrixSprite->addChild(tem);
  50.                         }
  51.                    
  52.                 }
  53.                 
  54.                 
  55.                 pLayer->addChild(magicMatrixSprite,2);
  56.         }

  57. }
复制代码
要想知道上面的代码的意思 看魔法阵的精灵类
  1. #ifndef __MAGICMATRIX_SPRITE_H__
  2. #define __MAGICMATRIX_SPRITE_H__
  3. #include "cocos2d.h"
  4. #include "DefenderGameLayer.h"
  5. //此类是魔法矩阵
  6. class MagicMatrixSprite:public cocos2d::CCNode{
  7. public:
  8.       MagicMatrixSprite();
  9.           ~MagicMatrixSprite();
  10.           CC_SYNTHESIZE(float,hurt,Hurt);// 伤害值
  11.           CC_SYNTHESIZE(bool,avail,Avail);//是否可用  
  12.           CC_PROPERTY(bool,activation,Activation);// 是否激活魔法阵
  13.           // 注意一点图片必须放在缓存里面
  14.           static MagicMatrixSprite* createWithPic(char* pMagicPic,char* pMagicPicBg); // 第一个参数CD 的比较暗淡的图片 第二个是比亮的图片  第三个参数是 魔法阵的图片
  15.           CC_SYNTHESIZE(float,mana,Mana);// 消耗魔法值
  16.           void runMagicCDAnimation();// 执行魔法CD 动画
  17.           CC_SYNTHESIZE(char*,speciaPicName,SpeciaPicName);// 图片的名字
  18.           CC_SYNTHESIZE(char*,speciaFileName,SpeciaFileName);// plist 文件的名字
  19.           CC_SYNTHESIZE(char*,speciaName,SpeciaName);//特效的通用名字
  20.           CC_SYNTHESIZE(int,speciaCount,SpeciaCount);//特效的图片的张数
  21.           CC_SYNTHESIZE(cocos2d::CCPoint,anchorPo,AnchorPo);// 当前魔法特效的相对位置
  22.           void runSpecial(DefenderGameLayer* layer,cocos2d::CCPoint point);//执行播放当前技能特效的动画
  23. private:
  24.           bool setUpdateView(char* pMagicPic,char* pMagicPicBg );
  25.           cocos2d::CCProgressTimer *ptss;// 魔法阵的CD 动画
  26.           void runMagicCDAnimationCallBack(cocos2d::CCNode* pSed);
  27.           void runSpecialCallBack(cocos2d::CCNode* pSend);
  28.          
  29. };
  30. #endif
复制代码
看着加注释的代码是不是很爽啊 呵呵看下里面具体的代码逻辑的实现
  1. //执行播放当前技能特效的动画
  2. void MagicMatrixSprite::runSpecial(DefenderGameLayer* layer,cocos2d::CCPoint point){
  3.         
  4.         CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(this->speciaFileName,CCTextureCache::sharedTextureCache()->textureForKey(this->speciaPicName));
  5.         CCArray* sperci=CCArray::create();
  6.         
  7.         for(int i=0;i<this->getSpeciaCount();i++){
  8.         sperci->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("%s%d.png",this->speciaName,i)->getCString()));
  9.         }
  10.         CCSprite* monst=CCSprite::createWithSpriteFrame((CCSpriteFrame*)sperci->objectAtIndex(0));

  11.         CCAnimation *animation=CCAnimation::createWithSpriteFrames(sperci,0.15f);
  12.         CCAnimate *animate=CCAnimate::create(animation);
  13.         CCCallFuncN *onComplete =  CCCallFuncN::create(this, callfuncN_selector(MagicMatrixSprite::runSpecialCallBack));  
  14.         CCSequence* pse=CCSequence::create(animate,onComplete,NULL);
  15.         monst->setAnchorPoint(this->getAnchorPo());
  16.         monst->setPosition(point);
  17.         layer->addChild(monst,3);
  18.         
  19.         //monst->runAction(CCRepeatForever::create(pse));

  20.         this->avail=false;//设为不可用
  21.         this->ptss->setPercentage(0);
  22.         this->runMagicCDAnimation();


  23.         monst->runAction(pse);
  24. }
复制代码
当你把这代码都弄懂的时候 你就运行起来上最初我发的那张图了 不过这里大家或许会疑惑了就是如何触发上面的特效 这个时候就用到一个小的魔法阵的图片 当把魔法阵的图片拖动到响应的位置的时候就在那个地方释放魔法效果主要在 ccTouchBegan 这个方法里面的主要代码
  1. CCSprite* magicspr=(CCSprite*) this->getChildByTag(100);//用100 来表示 创建阵型的图片
  2.                  if (!magicspr){
  3.                          magicspr=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("game/MagicMatrix.png"));
  4.                          magicspr->setAnchorPoint(ccp(0.5,0.5));
  5.                          this->addChild(magicspr,1,100);
  6.                  }
复制代码
然后就是 ccTouchMoved 方法的里面的部分代码
  1.   CCSprite* magicspr=(CCSprite*) this->getChildByTag(100);//用100 来表示 创建阵型的图片
  2.           if (magicspr){
  3.                 magicspr->setPosition(dpoint);
  4.           }
复制代码
当你弄到这里的时候你会发现你可以随意的拖动一张魔法阵图片了 是不是很简单效果如下图                                                                                                                       呵呵看起来很帅吧
其实当你实现这些的会后你就会发现 我的魔法怎么才能打怪呢  其实就是 检测当前的魔法阵的图片是否和怪物相撞。不过我写的还是有点BUG的 今天太晚了就不改了 不当午你的程序运行哈哈 来张打怪的效果吧                                                                                                                             呵呵看起来还是很炫的吧 不过我这里给大家说明一下其实这一章真没啥东西可讲的 都是平时动画的一些堆积 用逻辑来控制这些动画的释放而已。 要说值得注意的地方就是 魔法阵 释放完魔法的时候要重新走下技能CD 这样看起来让咱们的程序更加的生动最后来一章 我这节    所有的魔法特效的效果图吧                                                                                                                                            其实这次做的这些魔法特效 还都是单个的 我在想如何做一个全屏的 魔法打击特效这样让咱们的程序看起来更加的生动。                                              写到这里 我发现貌似就剩下最重要的 关卡系统了。在这里说明一下关卡系统我这两天一直在想,我准备弄个一个简单的一点的大家不要有怨言啊 回头想做复杂的咱们可以在群里面讨论。其实这里还有重要的一点 就是 怪物的AI  我的下一章里面会专门讲解一下怪物的AI  其实就是出怪的时候怪物可以摆各种阵型,让程序看来生动一点而不是现在这样太随机了。
原创粉丝点击