Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画



这几天在看控件类,临时没有想好实际运用的方向。单纯的创建网上已经有非常多这方面的样例,我就不写了。接下来是学习精灵类。精灵类若是单独学习也是非常easy。于是我加了一些有关动画方面的知识点与精灵类一起使用。让精灵播放简单的帧动画。

首先我们准备好动画素材,我在网上下了一个小游戏。将里面的素材做成了png和plist大图以供程序调用。我是用TexturePackerGUI来生成plist的。我选的是一个简单的待机动作,我们的目的就是让这张图动起来~

第一种方式:使用CCSpriteFrame

// 利用 CCTexture2D读取图片
	CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("hero/hero_standby.png");

	// 生成序列帧。CCRectMake的4个參数(x,y,width,height)分别代表取该图片中坐标为x,y宽高为width,height的图
	// 以下读出4个图暂存在frame中
	CCSpriteFrame *frame0 = CCSpriteFrame::createWithTexture(texture, CCRectMake(0, 114 * 0, 66, 114));
	CCSpriteFrame *frame1 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25, 114 * 0, 66, 114));
	CCSpriteFrame *frame2 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25*2, 114 * 0, 66, 114));
	CCSpriteFrame *frame3 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25 * 3, 114 * 0, 66, 114));

	//以下这行代码是设置默认图片和初始位置,由于COCOS2dx须要默认原始的图片
	CCSprite* sprite = CCSprite::createWithSpriteFrame(frame0);
	sprite->setPosition(ccp(size.width / 2, size.height / 2 +100));
	addChild(sprite);

	//将5张读出来的图加到一个动画序列
	CCArray *animFrames = new CCArray(4);
	animFrames->addObject(frame0);
	animFrames->addObject(frame1);
	animFrames->addObject(frame2);
	animFrames->addObject(frame3);

	//将5个动画帧生成CCAnimation对象 0.2f代表每一个之间的间隔时间
	CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f);

	//最后依据动画模板创建动画
	CCAnimate *animate = CCAnimate::create(animation);

	//给精灵设置之前创建好的动作
	sprite->runAction(CCRepeatForever::create(animate));

另外一种方式:使用CCSpriteFrameCache类读取plist

//将你须要的图片做成plist,然后用CCSpriteFrameCache读取出来
	CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
	cache->addSpriteFramesWithFile("hero/hero_standby.plist", "hero/hero_standby.png");

	//创建精灵并将读取出来的第一张图片作为默认图片
	CCSprite* sprite1 = CCSprite::createWithSpriteFrame(cache->spriteFrameByName("20005_1.png"));
	sprite1->setPosition(ccp(size.width / 2, size.height / 2 - 100));
	addChild(sprite1);

	//相同设置动画序列。这下面的步骤与第一种方式相同了
	CCArray *animFrames1 = new CCArray(4);
	animFrames1->addObject(cache->spriteFrameByName("20005_1.png"));
	animFrames1->addObject(cache->spriteFrameByName("20005_3.png"));
	animFrames1->addObject(cache->spriteFrameByName("20005_5.png"));
	animFrames1->addObject(cache->spriteFrameByName("20005_7.png"));

	CCAnimation *animation1 = CCAnimation::createWithSpriteFrames(animFrames1, 0.2f);
	CCAnimate *animate1 = CCAnimate::create(animation1);
	sprite1->runAction(CCRepeatForever::create(animate1));

认真写过这两种方式而且理解之后就能发现,第一种方式有些蛋疼,须要自己找图片位置,我也不知道是不是还有其它更加便捷的方式,只是非常明显另外一种方式更加科学。不知道还有没其它更好的方法呢?知道的同学能够交流一下哦~

可能有人不知道plist是什么。详细我就不解释了。自己去查查,我仅仅说我们这里能用到的信息,里面记录了图片的名称和在大图中的位置,所以直接读取plist是很方便的。

做完这个样例还是有些小激动的。由于最终有点认为自己在做游戏了,嘿嘿。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-11 11:43:53

Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画的相关文章

react学习笔记1之声明组件的两种方式

//定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class Welcome extends React.Component{ render(){ return <h1>Hello, {this.props.name}</h1>; } } ReactDOM.render( <Welcome name="kevin"/&g

十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可.但是在Activity中不能传递监听对象,所以考虑使用广播来实现. public void login(final LoginOnClickListener listener) { Intent intent = new Intent(context, LoginActivity.clas

MySQL学习笔记(2) - 修改MySQL提示符的两种方法

学习于慕课网 http://www.imooc.com/video/1806 1.方法一: cmd中处于未登录状态时,输入 mysql -uroot -p自己的密码 --prompt 新的提示符 示例:mysql -uroot -p111111 --prompt \h 111111为自己的密码,\h指的是localhost 2.方法二: cmd中处于登录状态时,输入 prompt 新的提示符 示例: 3.提示符可以用的参数: 1)\D :完整的日期 2)\d :当前数据库 3)\h :当前主机名

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

Spring学习笔记二(Bean注入的几种方式)

1.前言 上一篇博客从宏观上讲解了一下Spring的知识,下面这篇来着重讲解一下有关Bean注入的几种方式. 2.Bean注入的几种方式 2.1 类构造器初始化 这也是默认的方式,在上一篇博客中也有所体现.直接在applicationContext.xml配置文件中,配置Bean标签即可 <span style="font-family:SimSun;font-size:18px;"><!-- 实例工厂初始化 --> <!-- 必须先创建实例工厂对应的Be

Spring Boot2 系列教程(十五)定义系统启动任务的两种方式

在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( Servlet.Filter.Listener )之一 Listener ,这种情况下,一般定义一个 ServletContextListener,然后就可以监听到项目启动和销毁,进而做出相应的数据初始化和销毁操作,例如下面这样: public class MyListener implements

python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签",东西都是一样的.改变或者添加,复制出来的变量也会改变 样例: >>> a=[1,2,3] >>> b=a >>> a [1, 2, 3] >>> b [1, 2, 3] >>> a[1]=0 >>>

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </