ccspritecocos2dx batchnodee怎么删除精灵

在上一节里,在头文件看到 定义了一个&CCSpriteBatchNode* batchN,在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被其他节点给覆盖了而看不到。
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
cocos2d开发 精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口cocos2d-x(5)
在我们面试使用Cocos2dx&开发游戏的公司时候,有可能会问到CCSpriteBatchNode和CCSpriteFrameCache的区别有什么?
&&&总的讲CCSpriteBatchNode是读取一张图(或者是一张大图)根据Rect读取不同纹理,返回小图给Sprite使用。CCSpriteFrameCache读取拼图和plist,可以根据图片名字获取小的纹理图。
1:CCSpriteBatchNode
&&&&&&在屏幕上面绘制一张图片时,图形处理器会先准备渲染,&然后渲染图形,完成渲染后进行清理,这就是对一张图片开始渲染、结束渲染的系统开销。如果使用一张纹理贴图渲染一组精灵,图形处理器硬件只需要执行一次准备、渲染、完成渲染进行清理。
&&&&&&我们在使用一张图片多次出现在屏幕中的时候就可以使用CCSpriteBatchNode,会减少图形处理器硬件渲染图片对系统的开销。
我们测试使用普通的CCSprite添加1000张图片&&&
for(int i = 0;i & 1000;++i)
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::create(&Icon.png&);
testIcon-&setPosition( ccp(x, y) );
this-&addChild(testIcon);
我们会在左下角看到FPS&等一些信息。&&此时显示的是渲染的批次是 1000.
我们使用CCSpriteBatchNode同样添加1000张图片&&&&
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(&Icon.png&, 1000);
batchNode-&setPosition(CCPointZero);
this-&addChild(batchNode);
for(int i = 0;i & 1000;++i)
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::createWithTexture(batchNode-&getTexture());
testIcon-&setPosition( ccp(x, y) );
batchNode-&addChild(testIcon);
然而此时显示:渲染批次是 1.
//&利用贴图创建,默认子节点的数量是29(数量不够时,系统会自己增加)
CCSpriteBatchNode::create(const char* fileImage);
//&创建贴图并指定子节点的数量
CCSpriteBatchNode::create(const char* fileImage, unsigned int capacity);
2:CCSpriteFrameCache
&&&&&&将精灵添加到精灵帧缓存中
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache-&addSpriteFramesWithFile(&animations/grossini.plist&, &animations/grossini.png&);
m_pSprite1 = CCSprite::spriteWithSpriteFrameName(&grossini_dance_01.png&);
m_pSprite1-&setPosition( ccp( s.width/2-80, s.height/2) );
this-&addChild(m_pSprite);
结合使用看到更清楚明了
CCSpriteFrameCache::sharedSpriteFrameCache()-&addSpriteFramesWithFile(&animations/ghosts.plist&, &animations/ghosts.png&);
CCSpriteBatchNode *aParent = CCSpriteBatchNode::batchNodeWithFile(&animations/ghosts.png&);
addChild(aParent, 0, kTagSprite1);
CCSprite *pFather = CCSprite::spriteWithSpriteFrameName(&father.gif&);
pFather-&setPosition(ccp( s.width/2, s.height/2));
aParent-&addChild(pFather, 0, kTagSprite2);
大致就是这样,在后面如有更好的解释修改。
-------------------------------------我的一步步的爬坑---------------------
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48965次
积分:1059
积分:1059
排名:千里之外
原创:56篇}

我要回帖

更多关于 particlebatchnode 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信