如何使用cocos2d x3.0-x3.0来给Sprite添加遮罩

如何使用Cocos2d-x3.0来给Sprite添加遮罩_百度知道
如何使用Cocos2d-x3.0来给Sprite添加遮罩
提问者采纳
启动terminal,运行&python /Cocos/Cocos2d-x-3.0beta2/tools/project-creator/create_project.py&。把工程命名为MaskedCal,然后选择一个文件夹来保存,最后点Create。  接下来,请下载本工程所需要的资源文件并把它们拖到你的Xcode的Resource分组中,确保“Copy items into destination group’s folder (if needed)” 并复选中,然后点Finish。  在开始编码之前,让我们先来一点爵士音乐。同时,由于这里给的图片是480x320的,为了适应各个分辨率,这里需要setDesignResolutionSize,方便在不同的设备上显示。
来自团队:
其他类似问题
为您推荐:
cocos2d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁评论 - 1130查看: 4150|回复: 12
cocos2d-x 3.0中Sprite和SpriteBatchNode的新特性应该如何使用?
阅读权限20
在线时间 小时
文档中有说,现在Sprite可以不用将父节点设置为SpriteBatchNode了,但是我看了正式版中官方的examples,都是老方法,直接将sprite添加到batchNode的,有没有新特性下如何使用Sprite和SpritejBatchNode的示例?
附录:官方描述
Sprite 和 SpriteBatchNodev2.2 2.2版本中推荐的优化游戏方式是将 SpriteBatchNode 对象设置为 Sprite 对象的父节点。 虽然使用 SpriteBatchNode 对象仍然是一个非常好的优化游戏的方式,但是它仍然有一定的限制:Sprite 对象的孩子只能是 Sprite (否则,Cocos2d-x 会触发断言)当 Sprite 的父节点是 SpriteBactchNode 时,不能添加 ParticleSystem 作为 Sprite的子节点。这将导致当 Sprite 的父节点是 SpriteBatchNode 时,不能使用 ParallaxNode
所有的 Sprite 对象必须共享相同的纹理ID (否则,Cocos2d-x 会触发断言)Sprite 对象使用 SpriteBatchNode 的混合函数和着色器。
虽然 v3.0 仍然支持 SpriteBatchNode (与之前的版本拥有相同的特效和限制),但是我们不鼓励使用它。相反,我们推荐直接使用 Sprite,不需要再它作为子节点添加到 SpriteBatchNode 中。但是,为了能让 v3.0 有更好的表现,你必须要确保你的 Sprite 对象满足以下条件:贡献相同的纹理ID(把它们放在一个spritesheet中,就像使用 SpriteBatchNode 一样)确保它们使用相同的着色器和混合函数(就像使用 SpriteBatchNode 一样)
如果这么做, Sprites 将会像使用 SpriteBatchNode 一样的快...(在旧设备上大概慢了10%,在新设备上基本上察觉不出)v2.2 和 v3.0 最大的区别在于:Sprite 对象可以有不同的纹理ID。Sprite 对象可以有不同种类的 Node 作为子节点,包括 ParticleSystem。Sprite 对象可以有不同的混合函数和不同的着色器。
但是如果你这么做,渲染器 可能无法对它所有的子节点进行批处理(性能较低)。但是游戏仍然可以正常运行,不会触发任何断言。总结:保持将所有的精灵放在一张大的 spritesheet 中。使用相同的混合函数(使用默认)使用相同的着色器(使用默认)不要将精灵添加到 SpriteBatchNode
只有当你需要一些额外的性能上提升(虽然很小),SpriteBatchNode 才会是你最后的选择(你需要对它的限制条件很熟悉)。
阅读权限70
在线时间 小时
在3.0中不是很推荐用batchnode了,3。0的处理是,如果有一张纹理集tp1,里面有两个纹理,s1,s2,在3.0中你只需要分别用这两个纹理创建两个sprite1,sprite2,然后在3.0中新的渲染器,会知道这两个sprite都是用的同一张纹理,所以会自动放到一个drawcall里面,也就自动实现了batchnode。也避免了多个batchnode的zoder的问题,但是3.0有globalzoder也可以解决这个问题
阅读权限20
在线时间 小时
本帖最后由 childin 于
12:59 编辑
在3.0中不是很推荐用batchnode了,3。0的处理是,如果有一张纹理集tp1,里面有两个纹理,s1,s2,在3.0中你 ...
感谢您的回答,我想借用官方示例SpriteTest中的例子再问一下:
原来示例为:SpriteBatchNode1::SpriteBatchNode1()
{
& & auto BatchNode = SpriteBatchNode::create(&Images/grossini_dance_atlas.png&, 50);
& & addChild(BatchNode, 0, kTagSpriteBatchNode);
& &
void SpriteBatchNode1::addNewSpriteWithCoords(Point p)
{
& & auto BatchNode = static_cast&SpriteBatchNode*&( getChildByTag(kTagSpriteBatchNode) );
& & auto sprite = Sprite::createWithTexture(BatchNode-&getTexture(), Rect(x,y,85,121));
& & BatchNode-&addChild(sprite);
}复制代码是否改成这样即可:
SpriteBatchNode1::SpriteBatchNode1()
{
auto BatchNode = SpriteBatchNode::create(&Images/grossini_dance_atlas.png&, 50);
addChild(BatchNode, 0, kTagSpriteBatchNode);
void SpriteBatchNode1::addNewSpriteWithCoords(Point p)
{
auto BatchNode = static_cast&SpriteBatchNode*&( getChildByTag(kTagSpriteBatchNode) );
auto sprite = Sprite::createWithTexture(BatchNode-&getTexture(), Rect(x,y,85,121));
this-&addChild(sprite);
阅读权限10
在线时间 小时
谢谢 对我 很有帮助
阅读权限70
在线时间 小时
感谢您的回答,我想借用官方示例SpriteTest中的例子再问一下:
原来示例为:是否改成这样即可:
可以的,不过没有必要创建batchnode,直接用sprite的create函数,用文件名创建,或者用先将纹理先添加,再创建都可以的。
阅读权限20
在线时间 小时
可以的,不过没有必要创建batchnode,直接用sprite的create函数,用文件名创建,或者用先将纹理先添加, ...
您说的“没有必要创建batchnode”,具体怎么做呢?不先创建batchnode,直接用sprite::createwithBatchNodeName可以嘛?
阅读权限70
在线时间 小时
您说的“没有必要创建batchnode”,具体怎么做呢?不先创建batchnode,直接用sprite::createwithBatchNod ...
就是 Sprite *a = Sprite::create(文件名, rect),你可以用这个吧。你去看sprite的create的方法就知道了,也就是说你不用去管batchnode
阅读权限20
在线时间 小时
就是 Sprite *a = Sprite::create(文件名, rect),你可以用这个吧。你去看sprite的create的方法就知道了 ...
可是所有sprite都是用texturepacker生成的,现在不用导入plist和png?
阅读权限70
在线时间 小时
可是所有sprite都是用texturepacker生成的,现在不用导入plist和png?
哦,是tp生成那就更方便了,就是spriteframecache缓存了,然后createwithspriteframename就好了,主要是我看你前面用了rect,我以为你只有一张png图片,通过位置来创建,用tp的,那就和普通一样用,只是不用batchnode
阅读权限20
在线时间 小时
本帖最后由 childin 于
13:49 编辑
哦,是tp生成那就更方便了,就是spriteframecache缓存了,然后createwithspriteframename就好了,主要是 ...
您的意思是只要:
& & auto cache = SpriteFrameCache::getInstance();
& & cache-&addSpriteFramesWithFile(&xxx.plist&, &xxx.png&);
这样即可?不用再涉及到SpriteBatchNode了是嘛?
引用的时候直接通过createWithSpriteFrameName来处理是嘛,我刚才执行了下,倒是没错,不知道官方是不是就是这样的指导用法?最后想问下,如果不使用原来的:
SpriteBatchNode* myBatchNode = SpriteBatchNode::create(&xxx.png&, 6);
this-&addChild(myBatchNode);复制代码
那么之前通过addSpriteFramesWithFile增加的texture会不会在内存不够的时候被释放掉,造成程序崩溃,因为毕竟老方法里是有addChild来做一个retain引用的
Powered bySpriteFrameCache 主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示出不同的图案。
SpriteFrameCache
SpriteFrameCache的内部封装了一个Map&std::string, SpriteFrame*& _spriteFrames对象。key为帧的名称。SpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。
SpriteFrameCache的常用接口和TextureCache类似,不再赘述了,唯一需要注意的是添加精灵帧的配套文件一个plist文件和一张大的纹理图。下面列举了SpriteFrameCache常用的方法:(详细API请看SpriteFrameCache
获取单例的SpriteFrameCache对象。sharedSpriteFrameCache方法在3.0中已经弃用
SpriteFrameCache* cache = SpriteFrameCache::getInstance();&
销毁SpriteFrameCache对象。
SpriteFrameCache::destroyInstance();
使用SpriteFrameCache获取指定的精灵帧,创建精灵对象
SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();
frameCache-&addSpriteFramesWithFile(&boy.plist&,&boy.png&);//boy.png里集合了boy1.png,boy2.png这些小图
auto frame_sp = Sprite::createWithSpriteFrameName(&boy1.png&);//从SpriteFrameCache缓存中找到boy1.png这张图片.
this-&addChild(frame_sp,2);
SpriteFrameCache vs. TextureCache&
SpriteFrameCache精灵框帧缓存。顾名思义,这里缓存的是精灵帧SpriteFrame,它主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示出不同的图案。
跟TextureCache功能一样,将SpriteFrame缓存起来,在下次使用的时候直接去取。不过跟TextureCache不同的是,如果内存池中不存在要查找的图片,它会提示找不到,而不会去本地加载图片。
* TextureCache时最底层也是最有效的纹理缓存,缓存的是加载到内存中的纹理资源,也就是图片资源。
* SpriteFrameCache精灵框帧缓存,缓存的时精灵帧。
* SpriteFrameCache是基于TextureCache上的封装。缓存的是精灵帧,是纹理指定区域的矩形块。各精灵帧都在同一纹理中,通过切换不同的框帧来显示出不同的图案。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:219501次
积分:3396
积分:3396
排名:第4816名
原创:138篇
转载:104篇
评论:11条
文章:16篇
阅读:11395
(3)(2)(2)(6)(4)(2)(8)(10)(21)(2)(1)(1)(3)(2)(2)(1)(3)(6)(11)(6)(4)(1)(1)(4)(3)(10)(9)(3)(2)(16)(14)(1)(3)(9)(16)(14)(10)(27)如何使用Cocos2d-x3.0来给Sprite添加遮罩_百度知道
如何使用Cocos2d-x3.0来给Sprite添加遮罩
提问者采纳
//a static methodSprite* HelloWorld::maskedSpriteWithSprite(Sprite* textureSprite, Sprite* maskSprite){
RenderTexture * rt = RenderTexture::create( maskSprite-&getContentSize().width,
maskSprite-&getContentSize().height );
maskSprite-&setPosition(maskSprite-&getContentSize().width/2,
maskSprite-&getContentSize().height/2);
textureSprite-&setPosition(textureSprite-&getContentSize().width/2,
textureSprite-&getContentSize().height/2);
maskSprite-&setBlendFunc( BlendFunc{GL_ONE, GL_ZERO} );
textureSprite-&setBlendFunc( BlendFunc{GL_DST_ALPHA, GL_ZERO} );
rt-&begin();
maskSprite-&visit();
textureSprite-&visit();
rt-&end();
Sprite *retval = Sprite::createWithTexture(rt-&getSprite()-&getTexture());
retval-&setFlippedY(true);}...
其他类似问题
为您推荐:
cocos2d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 cocos2d sprite 的文章

更多推荐

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

点击添加站长微信