首页 > 代码库 > 3Animation动画的创建,CCSpeed,CCFollow
3Animation动画的创建,CCSpeed,CCFollow
动画,不同于动作,动画并非属性的改变。而是对帧的播放。
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; classT14Animation :publicTBack { public: staticCCScene *scene(); CREATE_FUNC(T14Animation); boolinit();
CCSprite *spr; voidonEnter(); voidonEnterTransitionDidFinish(); };
#endif |
T14Animation.cpp |
#include"T14Animation.h" #include"AppMacros.h"
CCScene *T14Animation::scene() { CCScene *scene =CCScene::create(); T14Animation *layer =T14Animation::create(); scene->addChild(layer); returnscene; }
boolT14Animation::init() { TBack::init(); returntrue; }
//在进入场景的时候做以下操作 voidT14Animation::onEnter() { TBack::onEnter(); //以图片的方式创建一个精灵 spr =CCSprite::create("animation/p_2_01.png"); //设置精灵的显示位置 spr->setPosition(ccp(winSize.width / 2, winSize.height / 2)); addChild(spr); }
voidT14Animation::onEnterTransitionDidFinish() { TBack::onEnterTransitionDidFinish(); //plist中是图片信息 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist");
//创建动画 CCAnimation *animation =CCAnimation::create(); //这个用于存储图片的名字 char nameBuf[100]; for (inti = 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; classT15Speed :publicTBack { public: staticCCScene *scene(); CREATE_FUNC(T15Speed); boolinit();
//英雄这个精灵 CCSprite *hero; //食物这个精灵 CCSprite *food;
CCMoveBy *by; voidupdate(floatdt); };
#endif |
T15Speed.cpp |
#include"T15Speed.h" #include"AppMacros.h"
CCScene *T15Speed::scene() { CCScene *scene =CCScene::create(); T15Speed *layer =T15Speed::create(); scene->addChild(layer); returnscene; }
boolT15Speed::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();
charnameBuf[100]; for (inti = 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(); returntrue; }
voidT15Speed::update(floatdt) { //将boundingBox()缩放 CCRectheroRect =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); returnscene; }
boolT16CCFollow::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();
charnameBuf[100]; for (inti = 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); returntrue; }
voidT16CCFollow::funcNCallBack(CCNode * node) { CCSprite *spr = (CCSprite *)node; CCLog("x = %g, y = %g",spr->getPositionX(),spr->getPositionY());
CCPointworld =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); returnscene; }
boolT16CCFollow::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();
charnameBuf[100]; for (inti = 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); returntrue; }
voidT16CCFollow::funcNCallBack(CCNode * node) { CCSprite *spr = (CCSprite *)node; CCLog("x = %g, y = %g",spr->getPositionX(),spr->getPositionY());
CCPointworld =this->convertToWorldSpace(spr->getPosition());
CCLog("x = %g, y = %g",world.x,world.y); } |
运行结果: |
3Animation动画的创建,CCSpeed,CCFollow