源码:git@:baidang201/ARPG_Zhaoyun.git
本章在前面的基础上《Cocos2d-x自定义血条及其美化--之游戏开发《赵云要格斗》(4)》设计一个怪物类,并实现怪物的上方显示血条,血条跟随怪物的运动而运动。用到的血条类在上一讲中,平时我们游戏一般怪物都是头顶一个血条的,这里我们就是要实现这个功能。
Cocos2d-x版本:2.2.5
工程环境:windows7+VS
打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开
重要说明:由于TexturePacker试用期结束了,不能再用,所以接下来的动画都不合成plist和整张的PNG。同时,之前的赵云图像太动画效果不是很好,所以换了个赵云的图片。另外,将整个项目的类都分别归档,这样更加容易看懂些,所以hero.h和hero.cpp有些函数进行了更改,同时调用的地方也改了下。这里一定要注意!
这是本章的一个效果:
(下一章的效果)
一、更改英雄hero类
赵云的图片:以下中是一部分,动画就是通过读一张一张的PNG图片来实现的(没有再合成Plist和整张PNG)
更改后的英雄类Hero.h(类的函数和变量还是不变的,使用方法还是不变的,只不SetAnimation函数参数更改变了)
更改后的英雄类Hero.cpp
记得在用的地方要改下SetAnimation,其它地方都不变,只不SetAnimation函数参数更改变了
效果:和以前相比,赵云的图片更加清楚了些,而且攻击的图片也比较顺了一点(20张图片啊!)
二、自定义带血条的怪物
这里的血条用到了前面的自定义血条,思路就是把上篇自定义的血条类ProgressView应用在Monster中,得到Monster类中怪物的位置,然后根据这个位置来设置血条成员变量的位置(一般在上方),最后把怪物精灵和血条类都addchild()进来就行了。
下面这是怪物的资源:(一部分,动画也是通过一张一张的播放的)
Monster.h:
Monster.cpp:
使用方法:
HelloWorldScene.h添加头文件 #include "Monster.h"
HelloWorldScene.h添加成员变量: Monster *monster1;//怪物种类1
HelloWorldScene.cpp的Init()函数进行初始化:
这是不带血条的怪物:
这是带血条的怪物:
好了,这一篇就结束了,下一篇我们将会来讲讲智能怪物,让怪物动起来并能出动攻击!
下面是血条跟随怪物移动的效果。
源码下载:血条跟随怪物运动
//
总结下TexturePacker纹理的调用和多个图片调用的区别。
1 压缩纹理的调用
将压缩纹理图片载入全局纹理缓存CCSpriteFrameCache-》获取精灵框帧CCSpriteFrame,将特定序列的精灵框帧增加到列表-》使用列表初始化动画Animation-》使用动画包装成动作CCAnimate
2 多个图片的调用
使用创建动画对象Animation->动画增加每一帧的图片->动画包装成动作CCAnimate
:如下是示例代码:
《1 压缩纹理
CCSpriteFrameCache *m_frameCache=CCSpriteFrameCache::sharedSpriteFrameCache();
m_frameCache->addSpriteFramesWithFile(name_plist,name_png);
//用一个列表保存所有的CCSpriteFrameCache
Vector<CCSpriteFrame*> frameArray = Vector<CCSpriteFrame*>();
unsigned int i;
for(i=startIndex;i<=num;i++)
{
CCSpriteFrame* frame=m_frameCache->spriteFrameByName(CCString::createWithFormat("%s%d.png", actNameInNamePng, i)->getCString());
frameArray.pushBack(frame);
}
//使用列表创建动画对象
Animation* animation=Animation::createWithSpriteFrames(frameArray);
animation->setLoops(-1);//表示无限循环播放
animation->setDelayPerUnit(0.1f);//每两张图片的时间隔,图片数目越少,间隔最小就越小
//将动画包装成一个动作
CCAnimate* act=CCAnimate::create(animation);
m_HeroSprite->runAction(act);
《2多个图片的调用CCAnimation* animation = CCAnimation::create(); for( int i=1;i<=num;i++) { char szName[100] = {0}; sprintf(szName,"%s%d.png",name_each,i); animation->addSpriteFrameWithFileName(szName); //加载动画的帧 } animation->setDelayPerUnit(2.8f / 14.0f); animation->setRestoreOriginalFrame(true); //动画播放结束后,回到初始帧 animation->setLoops(-1); //动画循环 //将动画包装成一个动作 CCAnimate* act=CCAnimate::create(animation); m_MonsterSprite->runAction(act);