您的位置:首页 > Web前端 > Node.js

动画 和精灵帧缓存CCSpriteFrameCache 精灵表单CCSpriteBatchNode的使用

2014-05-17 20:53 337 查看
代码片CCSpriteFrameCache.cpp 素材取自熬盟主 跑酷; 准备文件sprite_sheet.plist sprite_sheet.png
//简单帧动画
mainsprite = CCSprite::create("s_1.png");

CCAnimation * animation = CCAnimation::create();
animation->addSpriteFrameWithFileName("s_1.png");
animation->addSpriteFrameWithFileName("s_2.png");
animation->addSpriteFrameWithFileName("s_3.png");
animation->addSpriteFrameWithFileName("s_4.png");
animation->addSpriteFrameWithFileName("s_5.png");
animation->addSpriteFrameWithFileName("s_6.png");
animation->setDelayPerUnit(0.1f);
animation->setRestoreOriginalFrame(true);
//运行奔跑动画
mainsprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
mainsprite->setAnchorPoint(ccp(0.5f,0.5f));
mainsprite->setPosition(ccp(240,160));
addChild(mainsprite);
bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(!CCLayer::init());

//获取屏幕大小
CCSize _screenSize = CCDirector::sharedDirector()->getWinSize();

//CCSpriteFrameCache(精灵帧缓存)主要用来存放CCSpriteFrame,它没有提供特别的属性,而是提供一系列用于管理CCSpriteFrame的方法
//1) 缓存精灵帧和纹理。调用CCSpriteFrameCache的addSpriteFramesWithFile方法,传入生成的属性列表文件plist名称。
//这里会根据设定的资源搜索路径来自动寻找正确的文件。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("sprite_sheet.plist");

//2)创建一个精灵批处理节点。创建CCSpriteBatchNode对象,传入了精灵表单图像名称。
//任何时候创建来自这个精灵表单的精灵,都应当将这个精灵添加到这个CCSpriteBatchNode对象里。
gameBatchNode = CCSpriteBatchNode::create("sprite_sheet.png", 200);
this->addChild(gameBatchNode, 1);
//加入一个竞技团队
CCSprite* jam = CCSprite::createWithSpriteFrameName("jam_1.png");
//3)创建动画对象。
CCAnimation* animation = CCAnimation::create();;
//4)采集帧列表。
CCSpriteFrame * frame;
int i;
for(i = 1; i <= 3; i++) {
char szName[100] = {0};
sprintf(szName, "jam_%i.png", i);
frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(szName);
animation->addSpriteFrame(frame);
}
//帧动画属性
animation->setDelayPerUnit(0.2f / 3.0f);
animation->setRestoreOriginalFrame(false);
animation->setLoops(-1);
//5)创建动画和运行动画动作
CCAction* jamAnimate = CCAnimate::create(animation);
jamAnimate->retain();
gameBatchNode->addChild(jam, 0);
jam->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
jam->setPosition(ccp(_screenSize.width * 0.19f, _screenSize.height * 0.47f));

bRet=true;
} while (0);
return bRet;
}

CCSpriteBatchNode和CCSpriteFrameCache结合使用;CCSpriteFrameCache和CCSpriteBatchNode加载的是同一纹理贴图 

里边传入的纹理图片是子节点用到的纹理图片,我们可以设置好这些子精灵节点的坐标,然后添加到这个node中,这个node再添加到其他的层中,这样就可以批次渲染了。
这个node要求它的字精灵节点和它使用相同的纹理:
//或者使用texture2d初始化,里边传入一个texture

//CCSpriteBatchNode * batch = CCSpriteBatchNode::createWithTexture();

//CCSprite * sprite = CCSprite::createWithTexture(batchNode->getTexture());

那如果纹理不一样怎么办,那就把纹理都打包到一张图片上,用的时候从这张图片上截取,工具可以使用texturepacker。

纹理学习 待续;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: