代码片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();
//CCSpriteBatchNode * batch = CCSpriteBatchNode::createWithTexture();
//CCSprite * sprite = CCSprite::createWithTexture(batchNode->getTexture());
那如果纹理不一样怎么办,
那就把纹理都打包到一张图片上
,用的时候从这张图片上截取,工具可以使用texturepacker。
纹理学习 待续;