cocos2dx之利用精灵帧缓存自己构造动画创建器

                   利用SpriteFrameCache手动构造动画创建器

   在刚开始接触c2d的时候,很多小伙伴并不知道如何让一个精灵逐帧播放而形成一个动作。

   这篇博客就是来简单介绍如何利用帧缓存手动创建一个动画创建器。

 

 (一)首先把所用到的景精灵帧利用TexturePacket等工具制成大图以及plist文件;

            plist文件里面包含着每一帧精灵纹理的名字,坐标以及宽高,只要把plist文件加载到精灵帧缓存里,cocos就会自动帮你把大图重新分割成数张精灵帧,以供我们在之后的开发中调用。具体操作如下:

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("xxxx.plist");
// plist文件应该存放在Resource文件夹中,否则寻址路径要改变

   (二)创建动画创建器ActionTool的.h和.cpp文件

            这个两个文件主要用来存放我们的动画创建器这个类,类里面封装着手动创建精灵帧动画的方法。

    ActionTool.h:

            其中frameName是精灵帧的名字,例如有精灵奔跑帧run1到run11,那么frameName就是指run。

            iloops是指有多少帧,如果知道数目则填上帧的数目,若否则填-1让系统自己判断下一帧是否为空。

            delay是这个帧动画的播放时长。

#ifndef ActionTool_H__          // 避免重定义
#define ActionTool_H__

#include "cocos2d.h"            // 引入cocos2d的头文件
USING_NS_CC;                    // cocos的名称空间 

class ActionTool {              // 动画创建器类
public:
	static Animate* animationWithFrameName(const char *frameName, int iloops, float delay);
	                            // 动画创建方法
	
};  

     ActionTool.cpp

       首先科普一下:

    (1)Animation:用于存储动画相关的信息。其中包含用于动画的所有动画帧信息,单位帧的时间间隔,总帧数,动画重复次数等等信息。 

    (2)Animate  :用于创建动画的Action动作,需要Animation作为创建的参数。

      PS:Animation 只是存放了动画需要的数据信息。而执行动画还是需要 Animate。

 

       所以实现动画构造函数:首先创建一个动作Animation*的变量,和一个空的精灵帧。在iloops等于-1的情况下,我们就从第一帧开始在帧缓存里面循环遍历,若存在该帧,则加载进animation中,若已经没有了,则结束循环。至于iloops为具体数目时,只要从1循环到iloop,然后同样把帧存放进animation就可以了。

       然后,只要设置一些animation的基本属性,接着利用它create一个动画类Animate*并返回就可以了。之后我们只需要调用你所选中的精灵的runAction()方法,并把利用ActionTool得到的Animate*类型的返回值作为参数放进runAction(Animate*)就可以看到效果了。具体代码如下:

Animate* ActionTool::animationWithFrameName(const char *frameName, int iloops, float delay)
{
	SpriteFrame* frame = NULL;
	// 定义一个空的帧
	Animation* animation = Animation::create();
	// 定义一个空的动作

	int index = 1;
	// 遍历具有frameName特征的图片帧,从第一张开始

	if (iloops == -1)
	{
		do
		{
			String * name = String::createWithFormat("%s%d.png", frameName, index++);
			// 当前是第index帧

			frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
			//帧缓存存储一个帧到frame里面

			if (frame == NULL)
			{
				break;
			}
			animation->addSpriteFrame(frame);
			//把一个帧存进去动画里

		} while (true);

		
	}

	else
	{
		do
		{
			String * name = String::createWithFormat("%s%d.png", frameName, index++);
			// 当前是第index帧

			frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
			//帧缓存存储一个帧到frame里面

			if (frame == NULL)
			{
				break;
			}
			animation->addSpriteFrame(frame);
			//把一个帧存进去动画里

		} while (true);

	}
	// 设置Animation的一些基本属性
	animation->setDelayPerUnit(delay);
	//帧的时间间隔
	animation->setRestoreOriginalFrame(true);
	//动画结束的时候是否返回原始的一帧

	Animate* animate = Animate::create(animation);
	// 返回一个Animate动画
	return animate;
}

 

  至此我们的动画创建器已经构造完成,谢谢大家!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值