在上一节里,在头文件看到 定义了一个 CCSpriteBatchNode* batchNode;,在addEnemy方法里看到 batchNode->addChild(enemy); 新建的敌机不是add到layer上,而是add到 CCSpriteBatchNode 上,关于 CCSpriteBatchNode 的了解这里不多说,网上大把,下面说说 CCSpriteBatchNode 在这里的应用。
1、通过 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(const char *pszPlist) 读取plist文件(关于拼图这里不说,自行google)。
其中的细节包括:
(1)调用 CCTextureCache 读取一个和plist文件同名的png文件到纹理缓存里,然后根据plist文件的信息把这个大纹理里面包括的所有精灵帧 CCSpriteFrame 存储到 CCSpriteFrameCache 里面。
(2)这里要注意两点:这个大纹理已经被存储到纹理缓存里了而没有存到精灵帧缓存里;精灵帧缓存里存储了根据plsit文件信息得到 小精灵帧,但纹理缓存里并没有这些小精灵帧对应的小纹理!
(3)所谓精灵帧,其实就是保存里一些关于纹理的信息:纹理的名字和要显示的区域。所以在(2)里的那些精灵帧,其实就保存里两样信息:和plist文件同名的 png 格式的纹理,要显示的区域。
2、CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(const char* fileImage, unsigned int capacity); 读取和plist文件同名的png文件,这个文件其实已经被读取到纹理内存里了的。还要记得把batchNode加到某个父节点上。
3、batchNode->addChild(enemy); 把那些enemy加到 CCSpriteBatchNode 上,但是,这些enemy要通过这个batchNode所对应的大纹理的某一部分来创建的才行,enemy可以如下初始化:CCSprite::initWithSpriteFrameName(spriteFrameName)。还记得 1 里说过的frameCache加载plist文件吧,这里所用到的精灵帧就是那时加到精灵帧缓存的,而这些精灵帧所对应的纹理就是加到batchNode的那个大纹理,这是最重要的一点,就是保证所有添加到batchNode上的精灵所对应的纹理都是batchNode所对应的纹理~~
另外,好像这样子加到batchNode上面的精灵,无法再添加子节点了
总结如下:假如有 A.plist 和 A.png
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“A.plist”);
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("A.png", 50);
CCSprite* sprite1 = CCSprite::createWithSpriteFrameName("精灵帧1的名字");
CCSprite* sprite2 = CCSprite::createWithSpriteFrameName("精灵帧2的名字");
batchNode->addChild(sprite1);
batchNode->addChild(sprite2);
this->addChild(batchNode);
搞定,不过要注意Z轴的设置,别让batchNode被其他节点给覆盖了而看不到。