Cocos2d-x学习笔记(五) 精灵播放动画的两种方式



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

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

Cocos2d-x学习笔记(五) 精灵播放动画的两种方式_第1张图片

第一种方式:使用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));

 


Cocos2d-x学习笔记(五) 精灵播放动画的两种方式_第2张图片

认真写过这两种方式并且理解之后就能发现,第一种方式有些蛋疼,需要自己找图片位置,我也不知道是不是还有其他更加便捷的方式,不过很明显第二种方式更加科学。不知道还有没其他更好的方法呢?知道的同学可以交流一下哦~

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

做完这个例子还是有些小激动的,因为终于有点觉得自己在做游戏了,嘿嘿。

 

 

你可能感兴趣的:(Cocos2d-x)