在开始这一章之前我先说一个问题 ,最近群里的朋友问我,环境怎么配置我想说请看我的第一章的简介,一定要仔细看,还有那些只为把项目运行起来根本就不看代码的直接问问题 。一定要好好的看下代码,你可以按照自己的逻辑先想一下 然后在问,不要直接使用哪来主义。 不过还要谢谢大家给我提了那么多的主义 让我来修正我的代码
今天废话不多首先来一张绚丽的魔法特效图
呵呵看起来还是很绚丽的吧
要问这个代码是怎么实现 明白人一看大概都能了解
首先我修改了我武器系统里面的部分代码
就是为了加入上面那些绚丽的特效
void WeaponSprite::initIdleMagicSpool(cocos2d::CCLayer* pLayer){要想知道上面的代码的意思 看魔法阵的精灵类
int cout=3;// 假设 魔法矩阵的
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("specia/thumbnails.plist",CCTextureCache::sharedTextureCache()->textureForKey("specia/thumbnails.png"));
for(int i=0;i<cout;i++){
MagicMatrixSprite* magicMatrixSprite=MagicMatrixSprite::createWithPic("game/jnzt.png","game/jnl.png");
this->magicArray->addObject(magicMatrixSprite);
magicMatrixSprite->setAnchorPoint(ccp(0,0));
float x=pLayer->getContentSize().width-magicMatrixSprite->getContentSize().width*(i+1)-(i+1)*20;
magicMatrixSprite->setPosition(ccp(x,0));
magicMatrixSprite->setActivation(true);
magicMatrixSprite->runMagicCDAnimation();
magicMatrixSprite->setHurt(100);
if(i==2){
// 地狱石块特效
magicMatrixSprite->setSpeciaCount(16);
magicMatrixSprite->setSpeciaFileName("specia/diyu.plist");
magicMatrixSprite->setSpeciaName("diyu");
magicMatrixSprite->setSpeciaPicName("specia/diyu.png");
magicMatrixSprite->setAnchorPo(ccp(0.5,0.4));
if (magicMatrixSprite->getActivation()){
CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("diyus.png"));
tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
magicMatrixSprite->addChild(tem);
}
}else if(i==1){
// 二龙戏珠特效
magicMatrixSprite->setSpeciaCount(15);
magicMatrixSprite->setSpeciaFileName("specia/long.plist");
magicMatrixSprite->setSpeciaName("long");
magicMatrixSprite->setSpeciaPicName("specia/long.png");
magicMatrixSprite->setAnchorPo(ccp(0.5,0.4));
if (magicMatrixSprite->getActivation()){
CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("longs.png"));
tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
magicMatrixSprite->addChild(tem);
}
}else {
// 闪电特效
magicMatrixSprite->setSpeciaCount(18);
magicMatrixSprite->setSpeciaFileName("specia/ligtht.plist");
magicMatrixSprite->setSpeciaName("light");
magicMatrixSprite->setSpeciaPicName("specia/ligtht.png");
magicMatrixSprite->setAnchorPo(ccp(0.5,0.2));
if (magicMatrixSprite->getActivation()){
CCSprite* tem=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("lights.png"));
tem->setPosition(ccp(magicMatrixSprite->getContentSize().width/2,magicMatrixSprite->getContentSize().height/2));
magicMatrixSprite->addChild(tem);
}
}
pLayer->addChild(magicMatrixSprite,2);
}
}
#ifndef __MAGICMATRIX_SPRITE_H__
#define __MAGICMATRIX_SPRITE_H__
#include "cocos2d.h"
#include "DefenderGameLayer.h"
//此类是魔法矩阵
class MagicMatrixSprite:public cocos2d::CCNode{
public:
MagicMatrixSprite();
~MagicMatrixSprite();
CC_SYNTHESIZE(float,hurt,Hurt);// 伤害值
CC_SYNTHESIZE(bool,avail,Avail);//是否可用
CC_PROPERTY(bool,activation,Activation);// 是否激活魔法阵
// 注意一点图片必须放在缓存里面
static MagicMatrixSprite* createWithPic(char* pMagicPic,char* pMagicPicBg); // 第一个参数CD 的比较暗淡的图片 第二个是比亮的图片 第三个参数是 魔法阵的图片
CC_SYNTHESIZE(float,mana,Mana);// 消耗魔法值
void runMagicCDAnimation();// 执行魔法CD 动画
CC_SYNTHESIZE(char*,speciaPicName,SpeciaPicName);// 图片的名字
CC_SYNTHESIZE(char*,speciaFileName,SpeciaFileName);// plist 文件的名字
CC_SYNTHESIZE(char*,speciaName,SpeciaName);//特效的通用名字
CC_SYNTHESIZE(int,speciaCount,SpeciaCount);//特效的图片的张数
CC_SYNTHESIZE(cocos2d::CCPoint,anchorPo,AnchorPo);// 当前魔法特效的相对位置
void runSpecial(DefenderGameLayer* layer,cocos2d::CCPoint point);//执行播放当前技能特效的动画
private:
bool setUpdateView(char* pMagicPic,char* pMagicPicBg );
cocos2d::CCProgressTimer *ptss;// 魔法阵的CD 动画
void runMagicCDAnimationCallBack(cocos2d::CCNode* pSed);
void runSpecialCallBack(cocos2d::CCNode* pSend);
};
#endif
看着加注释的代码是不是很爽啊 呵呵
看下里面具体的代码逻辑的实现
//执行播放当前技能特效的动画
void MagicMatrixSprite::runSpecial(DefenderGameLayer* layer,cocos2d::CCPoint point){
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(this->speciaFileName,CCTextureCache::sharedTextureCache()->textureForKey(this->speciaPicName));
CCArray* sperci=CCArray::create();
for(int i=0;i<this->getSpeciaCount();i++){
sperci->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("%s%d.png",this->speciaName,i)->getCString()));
}
CCSprite* monst=CCSprite::createWithSpriteFrame((CCSpriteFrame*)sperci->objectAtIndex(0));
CCAnimation *animation=CCAnimation::createWithSpriteFrames(sperci,0.15f);
CCAnimate *animate=CCAnimate::create(animation);
CCCallFuncN *onComplete = CCCallFuncN::create(this, callfuncN_selector(MagicMatrixSprite::runSpecialCallBack));
CCSequence* pse=CCSequence::create(animate,onComplete,NULL);
monst->setAnchorPoint(this->getAnchorPo());
monst->setPosition(point);
layer->addChild(monst,3);
//monst->runAction(CCRepeatForever::create(pse));
this->avail=false;//设为不可用
this->ptss->setPercentage(0);
this->runMagicCDAnimation();
monst->runAction(pse);
}
当你把这代码都弄懂的时候 你就运行起来上最初我发的那张图了
不过这里大家或许会疑惑了就是如何触发上面的特效 这个时候就用到一个小的魔法阵的图片 当把魔法阵的图片拖动到响应的位置的时候就在那个地方释放魔法效果
主要在 ccTouchBegan 这个方法里面的主要代码
CCSprite* magicspr=(CCSprite*) this->getChildByTag(100);//用100 来表示 创建阵型的图片
if (!magicspr){
magicspr=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("game/MagicMatrix.png"));
magicspr->setAnchorPoint(ccp(0.5,0.5));
this->addChild(magicspr,1,100);
}
然后就是 ccTouchMoved 方法的里面的部分代码
CCSprite* magicspr=(CCSprite*) this->getChildByTag(100);//用100 来表示 创建阵型的图片
if (magicspr){
magicspr->setPosition(dpoint);
}
当你弄到这里的时候你会发现你可以随意的拖动一张魔法阵图片了 是不是很简单效果如下图
呵呵看起来很帅吧
其实当你实现这些的会后你就会发现 我的魔法怎么才能打怪呢 其实就是 检测当前的魔法阵的图片是否和怪物相撞。不过我写的还是有点BUG的 今天太晚了就不改了 不当午你的程序运行
哈哈 来张打怪的效果吧
呵呵看起来还是很炫的吧 不过我这里给大家说明一下其实这一章真没啥东西可讲的 都是平时动画的一些堆积 用逻辑来控制这些动画的释放而已。 要说值得注意的地方就是 魔法阵 释放完魔法的时候要重新走下技能CD 这样看起来让咱们的程序更加的生动
最后来一章 我这节
所有的魔法特效的效果图吧
其实这次做的这些魔法特效 还都是单个的 我在想如何做一个全屏的 魔法打击特效这样让咱们的程序看起来更加的生动。
写到这里 我发现貌似就剩下最重要的 关卡系统了。在这里说明一下关卡系统我这两天一直在想,我准备弄个一个简单的一点的大家不要有怨言啊 回头想做复杂的咱们可以在群里面讨论。其实这里还有重要的一点 就是 怪物的AI 我的下一章里面会专门讲解一下怪物的AI 其实就是出怪的时候怪物可以摆各种阵型,让程序看来生动一点而不是现在这样太随机了。 今天大家就让我偷个懒吧。这几天太累了关于代码的实现谁要是不懂的话可以在我的博客留言或者在码农哥的群里面讨论。我是2群的管理 哈哈。
本节源码下载