在开始这一章之前我先说一个问题 ,最近群里的朋友问我,环境怎么配置我想说请看我的第一章的简介,一定要仔细看,还有那些只为把项目运行起来根本就不看代码的直接问问题 。一定要好好的看下代码,你可以按照自己的逻辑先想一下 然后在问,不要直接使用哪来主义。 不过还要谢谢大家给我提了那么多的主义 让我来修正我的代码

今天废话不多首先来一张绚丽的魔法特效图

呵呵看起来还是很绚丽的吧

要问这个代码是怎么实现 明白人一看大概都能了解

首先我修改了我武器系统里面的部分代码

就是为了加入上面那些绚丽的特效

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群的管理 哈哈。

本节源码下载

跟着BOY学习开发cocos2d-x 游戏 实战篇(6)之 游戏主界面 -----绚丽的魔法特效相关推荐

  1. 【NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测

    [NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...

  2. 【物联网服务NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测

    [NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...

  3. Unity游戏开发日记(一):独自开发2d横板游戏:Small man(MainMenu主界面)基本构建

    目录 一.独自开发想法 前言: 开发构想: 二.主要内容:MainMenu主界面基本构建 (一)预想功能 (二)功能实现 1.主界面UI设计 2.Option功能设计 3.TypeOption功能设计 ...

  4. 【NodeJs-5天学习】第三天实战篇④ ——QQ机器人,实现自动回复、重要提醒

    [NodeJs-5天学习]第三天实战篇④ --QQ群自动回复机器人 1. 前言 2.实现思路 2.1 oicq模块 2.1.1 安装模块 2.1.2 官方说明文档(必须看) 2.1.3 常见API文档 ...

  5. 【物联网服务NodeJs-5天学习】第三天实战篇④ ——QQ机器人,实现自动回复、重要提醒

    [NodeJs-5天学习]第三天实战篇④ --QQ群自动回复机器人 1. 前言 2.实现思路 2.1 oicq模块 2.1.1 安装模块 2.1.2 官方说明文档(必须看) 2.1.3 常见API文档 ...

  6. 【NodeJs-5天学习】第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统

    [NodeJs-5天学习]第三天实战篇② --基于物联网的WiFi自动打卡考勤系统 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.1.1 对接Express服务器 2.1.2 对接Ma ...

  7. 【物联网服务NodeJs-5天学习】第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统

    [NodeJs-5天学习]第三天实战篇② --基于物联网的WiFi自动打卡考勤系统 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.1.1 对接Express服务器 2.1.2 对接Ma ...

  8. 手把手带你学习微信小程序 —— 项目实战篇

    微信小程序项目实战篇 WeChat-applet 1.支付宝界面展示 2.微博发帖功能实现 3.时间格式化案例 4.微信红包界面展示 5.微信消息删除案例 6.微信icon 组件 6.1 支付成功界面 ...

  9. 跟着BOY学习开发cocos2d-x 游戏 实战篇(4)之 游戏主界面 -----怪物系统---赌徒来袭

    兄弟们相比等这一章 等的时间比较长了吧!呵呵这几天公司的事情比较忙每天都只有晚上回来写会.所以进度慢了,不过兄弟们放心 我会坚持把这个游戏写完的写成一个可以买的游戏!哈哈 吹下牛了 其实在开发游戏的过 ...

最新文章

  1. 批处理命令——goto 和 :
  2. 病人还能生存多久?现在AI能给出更精准的预测
  3. java数组长度怎么求,含答案解析
  4. ckeditor的使用实例
  5. 折半查找和二叉排序树的时间性能_详解二叉排序树(基础篇)
  6. web的demo制造_基于Web的制造追溯系统DEMO
  7. OpenCV C++ 常用功能
  8. .net web 应用程序C#
  9. 尺缩钟慢之动钟变慢——思想实验推导狭义相对论(七)
  10. 如何利用Gmail群发电子邮件
  11. phyton做彩色电子管
  12. 三种页面置换算法(详解)
  13. 什么是虚拟机?Mac电脑怎么使用虚拟机安装双系统?
  14. jkd8新特性 StreamAPi流
  15. if中return语句作用/条件判断中如何退出函数
  16. ubuntu16.04卸载ceres
  17. curl https -k
  18. linux基础培训下载,huimaiLinux系统基础培训.ppt
  19. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 14: illegal multibyte sequence
  20. 计算机配置怎么开启,ipv6怎么设置? ipv6的开启方法

热门文章

  1. QT(C++)游戏之坦克大战(一)
  2. Hashmap 原理、源码、面试题(史上最全)
  3. STM32编程常踩的地雷
  4. 三、SIGNALING PACKET FORMATS
  5. Git提交的时候检查代码格式
  6. 粤嵌教你从C轻松到C++(一)
  7. 从0到1搭建测试自动化框架
  8. #边学边记 必修4 高项:对事的管理 第4章 项目进度管理之 制定进度计划
  9. ULTRA社区月度更新报告#3
  10. 整懵了,蚂蚁金服4面成功拿下测开offer,涨薪6k,突然觉得跳槽也不是那么难