- 动画,不同于动作,动画并非属性的改变。而是对帧的播放。
2
方法一
CCSprite * sp = CCSprite::create(“animation/p_2_01.png”);
sp->setPosition(ccp(240,160));
//注意:这里的CCRectMake中的参数都是相对自己来说的,前两个参数定义了一个点,80,80表示的是矩形的长,宽。
CCSpriteFrame * frame1 =
CCSpriteFrame::create("animation/p_2_01.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame2 =
CCSpriteFrame::create("animation/p_2_02.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame3 =
CCSpriteFrame::create("animation/p_2_03.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame4 =
CCSpriteFrame::create("animation/p_2_04.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame5 =
CCSpriteFrame::create("animation/p_2_05.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame6 =
CCSpriteFrame::create("animation/p_2_06.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame7 =
CCSpriteFrame::create("animation/p_2_07.png",CCRectMake(0,0,80,80))
;
CCSpriteFrame * frame8 =
CCSpriteFrame::create("animation/p_2_08.png",CCRectMake(0,0,80,80))
;
CCAnimation * animation = CCAnimation::create();
animation->addSpriteFrame(frame1);
animation->addSpriteFrame(frame2);
animation->addSpriteFrame(frame3);
animation->addSpriteFrame(frame4);
animation->addSpriteFrame(frame5);
animation->addSpriteFrame(frame6);
animation->addSpriteFrame(frame7);
animation->addSpriteFrame(frame8);
animation->setDelayPerUnit(0.1f);
animation->setLoops(kCCRepeatForever);
CCAnimate *animate = CCAnimate::create(animation);
sp->runAction(animate);
addChild(sp);
3
方法二(对一的改进)
CCSprite * sp = CCSprite::create(“animation/p_2_01.png”);
sp->setPosition(ccp(240,160));
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrameWithFile(“animation/plant.plist”);
char bufname[100];
CCArray * array = CCArray::create();
for(int I = 1;i<= 8;i++) {
memset(bufname,”p_2_0%d.png”,i);
CCSpriteFrame * frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(bufname);
array->addObject(frame);
}
CCAnimation * animation = CCAnimation::createWithSpriteFrames(array,0.2f);
animation->setLoops(kCCRepeatForever);
CCAnimate * animate = CCAnimate::create(animation);
addChild(sp);
4
更简单的
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“animation/plant.plist”);
char bufname[100];
CCAnimation * animation = CCAnimation::create();
for(int i = 1;i<=8;i++){
memset(bufname,sizeof(bufname),0);
sprint(bufname,”p_2_0%d.png”,i);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(bufname));
}
animation->setDelayPerUnit(0.2f);
animation->setLoops(kCCRepeatForever);
5
案例说明:
T14Animation.h
#ifndef
__T14Animation_H__
#define
__T14Animation_H__
#include
"cocos2d.h"
#include
"TBack.h"
USING_NS_CC;
class
T14Animation :public
TBack
{
public:
static
CCScene *
scene();
CREATE_FUNC(T14Animation);
bool
init();
CCSprite *spr;
void
onEnter();
void
onEnterTransitionDidFinish();
};
#endif
T14Animation.cpp
#include
"T14Animation.h"
#include
"AppMacros.h"
CCScene *T14Animation::scene()
{
CCScene *
scene =
CCScene::create();
T14Animation *
layer =
T14Animation::create();
scene->addChild(layer);
return
scene;
}
bool
T14Animation::init()
{
TBack::init();
return
true;
}
//在进入场景的时候做以下操作
void
T14Animation::onEnter()
{
TBack::onEnter();
//以图片的方式创建一个精灵
spr =
CCSprite::create("animation/p_2_01.png");
//设置精灵的显示位置
spr->setPosition(ccp(winSize.width
/ 2, winSize.height
/ 2));
addChild(spr);
}
void
T14Animation::onEnterTransitionDidFinish()
{
TBack::onEnterTransitionDidFinish();
//plist中是图片信息
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist");
//创建动画
CCAnimation *
animation =
CCAnimation::create();
//这个用于存储图片的名字
char
nameBuf[100];
for (int
i = 0;
i < 8;
i++)
{
memset(nameBuf,
0, sizeof(nameBuf));
sprintf(nameBuf,
"p_2_0%d.png",
i + 1);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf));
}
//设置每次动画执行的时候的延时
animation->setDelayPerUnit(0.1f);
//这只循环两次
animation->setLoops(2);
CCAnimate *
animate =
CCAnimate::create(animation);
spr->runAction(animate);
}
动画效果(2秒钟内循环执行了20次):
6 CCSpeed CCFollow
案例:
T15Speed.h
#ifndef _T15Speed_H__
#define
_T15CCSpeed_H__
#include
"cocos2d.h"
#include
"TBack.h"
USING_NS_CC;
class
T15Speed :public
TBack
{
public:
static
CCScene *
scene();
CREATE_FUNC(T15Speed);
bool
init();
//英雄这个精灵
CCSprite *
hero;
//食物这个精灵
CCSprite *
food;
CCMoveBy *
by;
void
update(float
dt);
};
#endif
T15Speed.cpp
#include
"T15Speed.h"
#include
"AppMacros.h"
CCScene *T15Speed::scene()
{
CCScene *
scene =
CCScene::create();
T15Speed *
layer =
T15Speed::create();
scene->addChild(layer);
return
scene;
}
bool
T15Speed::init()
{
TBack::init();
hero =
CCSprite::create("animation/hero.png");
hero->setPosition(ccp(100,
160));
addChild(hero);
by =
CCMoveBy::create(10,
ccp(300, 0));
hero->runAction(by);
food =
CCSprite::create("animation/food.png");
food->setPosition(ccp(200,
160));
addChild(food);
//因为小人跑动的姿势都是一幅幅的动画效果组成,所以下面通过
//CCSpriteFrameCache的方式加载一系列的图片
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/run.plist");
//创建动画效果
CCAnimation *
animation =
CCAnimation::create();
char
nameBuf[100];
for (int
i = 0;
i < 15;i++)
{
memset(nameBuf,
0, sizeof(nameBuf));
//取出图片等信息
sprintf(nameBuf,
"run%d.png",
i + 1);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf));
}
//图片切换的时候的时间延迟为0.1f
animation->setDelayPerUnit(0.1f);
//下面的方式表示永久循环
animation->setLoops(-1);
CCAnimate *
animate =
CCAnimate::create(animation);
hero->runAction(animate);
//开启定时器
scheduleUpdate();
return
true;
}
void
T15Speed::update(float
dt)
{
//将boundingBox()缩放
CCRect
heroRect =
CCRect(hero->boundingBox().origin.x
+ 50,
hero->boundingBox().origin.y,
hero->boundingBox().size.width
- 100,
hero->boundingBox().size.height);
//通过下面的方式实现:当人碰到豌豆了的时候移除豌豆
if (food&&heroRect.intersectsRect(food->boundingBox()))
{
//通过下面这句实现将food从主窗口中清除
food->removeFromParentAndCleanup(true);
food =
NULL;
//通过CCSpeed将原来的速度增加5倍
CCSpeed *
speed =
CCSpeed::create(by,
5);
hero->runAction(speed);
}
}
运行结果:
吃豆之后:
CCFollow
T16CCFollow.h
#include
"T16CCFollow.h"
#include
"AppMacros.h"
CCScene *T16CCFollow::scene()
{
CCScene *
scene =
CCScene::create();
T16CCFollow *
layer =
T16CCFollow::create();
scene->addChild(layer);
return
scene;
}
bool
T16CCFollow::init()
{
TBack::init();
//背景
CCSprite *
bg =
CCSprite::create("map.png");
//设置锚点
bg->setAnchorPoint(ccp(0,
0));
addChild(bg);
//创建一个英雄的精灵
hero =
CCSprite::create("animation/hero.png");
hero->setPosition(ccp(240,
160));
addChild(hero);
//下面的代码是添加动画的代码
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/run.plist");
CCAnimation *
animation =
CCAnimation::create();
char
nameBuf[100];
for (int
i = 0;
i < 15;
i++)
{
memset(nameBuf,
0, sizeof(nameBuf));
sprintf(nameBuf,
"run%d.png",
i + 1);
animation->addSpriteFrame(
CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf));
}
animation->setDelayPerUnit(0.1f);
animation->setLoops(-1);
CCAnimate *
animate =
CCAnimate::create(animation);
hero->runAction(animate);
by =
CCMoveBy::create(10,
ccp(400, 0));;
//添加假动作
CCCallFuncN *
func =
CCCallFuncN::create(this,
callfuncN_selector(T16CCFollow::funcNCallBack));
CCSequence *
seq =
CCSequence::create(by,
func,
NULL);
hero->runAction(seq);
//使用CCFollow的方式创建英雄
CCFollow *
follow =
CCFollow::create(hero);
this->runAction(follow);
return
true;
}
void
T16CCFollow::funcNCallBack(CCNode
* node)
{
CCSprite *
spr = (CCSprite
*)node;
CCLog("x
= %g, y = %g",
spr->getPositionX(),
spr->getPositionY());
CCPoint
world =
this->convertToWorldSpace(spr->getPosition());
CCLog("x
= %g, y = %g",
world.x,
world.y);
}
T16CCFollow.cpp
#include
"T16CCFollow.h"
#include
"AppMacros.h"
CCScene *T16CCFollow::scene()
{
CCScene *
scene =
CCScene::create();
T16CCFollow *
layer =
T16CCFollow::create();
scene->addChild(layer);
return
scene;
}
bool
T16CCFollow::init()
{
TBack::init();
//背景
CCSprite *
bg =
CCSprite::create("map.png");
//设置锚点
bg->setAnchorPoint(ccp(0,
0));
addChild(bg);
//创建一个英雄的精灵
hero =
CCSprite::create("animation/hero.png");
hero->setPosition(ccp(240,
160));
addChild(hero);
//下面的代码是添加动画的代码
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/run.plist");
CCAnimation *
animation =
CCAnimation::create();
char
nameBuf[100];
for (int
i = 0;
i < 15;
i++)
{
memset(nameBuf,
0, sizeof(nameBuf));
sprintf(nameBuf,
"run%d.png",
i + 1);
animation->addSpriteFrame(
CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf));
}
animation->setDelayPerUnit(0.1f);
animation->setLoops(-1);
CCAnimate *
animate =
CCAnimate::create(animation);
hero->runAction(animate);
by =
CCMoveBy::create(10,
ccp(400, 0));;
//添加假动作
CCCallFuncN *
func =
CCCallFuncN::create(this,
callfuncN_selector(T16CCFollow::funcNCallBack));
CCSequence *
seq =
CCSequence::create(by,
func,
NULL);
hero->runAction(seq);
//使用CCFollow的方式创建英雄
CCFollow *
follow =
CCFollow::create(hero);
this->runAction(follow);
return
true;
}
void
T16CCFollow::funcNCallBack(CCNode
* node)
{
CCSprite *
spr = (CCSprite
*)node;
CCLog("x
= %g, y = %g",
spr->getPositionX(),
spr->getPositionY());
CCPoint
world =
this->convertToWorldSpace(spr->getPosition());
CCLog("x
= %g, y = %g",
world.x,
world.y);
}
运行结果: