GVKun编程网logo

cocos2d-x学习笔记:SpriteBatchNode(cocos2d-x教程)

16

对于cocos2d-x学习笔记:SpriteBatchNode感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解cocos2d-x教程,并且为您提供关于14.2Cocos2d-x中的粒子系统(

对于cocos2d-x学习笔记:SpriteBatchNode感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解cocos2d-x教程,并且为您提供关于14.2Cocos2d-x 中的粒子系统(笔记);14.2.1 ParticleBatchNode;、cocos2d-iphone – Cocos2d的CCSpriteBatchNode抱怨不同的纹理ID、Cocos2d-js_____Sprite 和 SpriteBatchNode、Cocos2d-x 3.x学习笔记:猩先生带你打飞机(一)环境与创建项目的宝贵知识。

本文目录一览:

cocos2d-x学习笔记:SpriteBatchNode(cocos2d-x教程)

cocos2d-x学习笔记:SpriteBatchNode(cocos2d-x教程)

SpriteBatchNode的作用大致可理解为:

在开发游戏时,当一个层中需要使用多个相同的图片进行渲染某个sprite时,为了避免同样的图片重复渲染,所以使用该类来创建精灵。代码大致如下:

SpriteBatchNode* node = SpriteBatchNode::create("test.png");
if( !node )
  return false;
this->addChild(node);
auto sprite1 = Sprite::create("test.png");
sprite2->setPosition(200,300);
node->addChild(sprite1);
<pre name="code">auto sprite2 = Sprite::create("test.png");
sprite2->setPosition(300,300);
node->addChild(sprite2);
 上述代码中,两个精灵使用的是同一个图片,所以,在cocos2d-x2.2版本中,上面的代码会避免重复渲染同样的图片导致帧率下降。 
 

但是在3.0的版本中,已经不推荐这么做了,以下引用来自

https://github.com/fusijie/Cocos2dx-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md#sprite-%E5%92%8C-spritebatchnode

Sprite 和 SpriteBatchNode

v2.2 2.2版本中推荐的优化游戏方式是将SpriteBatchNode对象设置为Sprite对象的父节点。 虽然使用SpriteBatchNode对象仍然是一个非常好的优化游戏的方式,但是它仍然有一定的限制:

  • Sprite对象的孩子只能是Sprite(否则,Cocos2d-x 会触发断言)
    • Sprite的父节点是SpriteBactchNode时,不能添加ParticleSystem作为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才会是你最后的选择(你需要对它的限制条件很熟悉)。

14.2Cocos2d-x 中的粒子系统(笔记);14.2.1 ParticleBatchNode;

14.2Cocos2d-x 中的粒子系统(笔记);14.2.1 ParticleBatchNode;

1,批处理类ParticleBatchNode

2,粒子系统类ParticleSystem

3,粒子系统子类 ParticleSystemQuad



爆炸效果:ParticleExplosion;

火球效果: ParticleFire




14.2.1 粒子批处理类ParticleBatchNode

initWithFile


initWithTexture

disableParticle;

setBlendFunc/getBlendFunc;

updateallAtlasIndexes;

increaseAtlasCapacityTo;

getCurrentIndex;

searchNewPositionInChildernForZ;

代码实例:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
	// 创建精灵类
	auto sprite = Sprite::create("taotaoahui.jpg");
	//sprite->setPosition(ccp(visibleSize.width / 2,visibleSize.height / 2));
	sprite->setAnchorPoint(ccp(0,0));
	addChild(sprite,1);


   // ParticleBatchNode 使用方法,
	 auto _emitter = ParticleSystemQuad::create("Particles/taotao.xml.particle.plist");// 首先创建ParticleSystemQuad或者ParticleSystem
	 _emitter->retain();
	 auto batch = ParticleBatchNode::createWithTexture(_emitter->getTexture());
	 batch->addChild(_emitter);
	 batch->setPosition(ccp(visibleSize.width /2,visibleSize.height /2 ));	// sjt
	 this->addChild(batch,10);
    

    return true;
}

cocos2d-iphone – Cocos2d的CCSpriteBatchNode抱怨不同的纹理ID

cocos2d-iphone – Cocos2d的CCSpriteBatchNode抱怨不同的纹理ID

我正在尝试使用CCSpriteBatchNode优化我的游戏,一次渲染多个精灵.但是,由于某些原因,当我引入CCSpriteBatchNode作为我的精灵的父级时,cocos2d给了我这个错误:

"CCSprite is not using the same texture id"

我很困惑,因为我有一个1024×1024纹理图集和我的所有图形.它是使用TexturePacker创建的,没有批处理节点,一切正常.我一直在加载它:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlas1.plist"];

现在我正在尝试使用CCSpriteBatchNode:

CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"something.png"];
CCSpriteBatchNode* bar = [CCSpriteBatchNode batchNodeWithFile:@"atlas1.png"];
[bar addChild: sprite]; // assert error here

我尝试将一些NSLog调试输出添加到cocos2d纹理初始化/查找代码中,并且令人惊讶的是,有一些纹理被创建为具有不同的尺寸(例如256×256甚至更小).我不明白当我只有一个1024×1024 png作为输入时会发生什么.

发生了什么?我该怎么调试呢?

更新:

Bongeh的回答帮助我解决了这个问题 – 让我看了两遍.我的iOS模拟器中有一些旧版本的PNG文件被加载,即使它们不在Xcode项目中也是如此.从Xcode执行“清理”甚至“清理构建文件夹”不起作用,但使用iOS模拟器中的“重置内容和设置”命令就可以了.万岁!

解决方法

如果游戏中有超过1个spritesheet,请确保它们不共享和帧名,另一种解决方法是手动指定纹理ID.

将以上代码替换为:

CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"something.png"];
CCSpriteBatchNode* bar = [CCSpriteBatchNode batchNodeWithFile:@"atlas1.png"];
[sprite setTexture:[bar texture]];
[bar addChild: sprite]; // assert error here

我发现的唯一另一件事是,如果你的游戏在应用程序委托中收到内存警告,纹理缓存会被清除,你可以将其注释掉,但只要注意清除缓存即可.

Cocos2d-js_____Sprite 和 SpriteBatchNode

Cocos2d-js_____Sprite 和 SpriteBatchNode

Sprite 和 SpriteBatchNode点击打开链接

v2.2 2.2版本中推荐的优化游戏方式是将SpriteBatchNode对象设置为Sprite对象的父节点。 虽然使用SpriteBatchNode对象仍然是一个非常好的优化游戏的方式,但是它仍然有一定的限制:

  • Sprite对象的孩子只能是Sprite(否则,Cocos2d-x 会触发断言)
    • Sprite的父节点是SpriteBactchNode时,不能添加ParticleSystem作为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才会是你最后的选择(你需要对它的限制条件很熟悉)。

Cocos2d-x 3.x学习笔记:猩先生带你打飞机(一)环境与创建项目

Cocos2d-x 3.x学习笔记:猩先生带你打飞机(一)环境与创建项目

目录
1、环境与创建项目
2、素材准备与菜单场景
3、物理引擎的使用
4、游戏场景:背景与我机的创建、敌机的创建
5、敌我碰撞检测、分数计算、音乐播放
6、游戏结束场景

前言:
近几个月在一个网站开发公司搬砖,然后这砖搬着搬着,就累觉不爱。心好累,心好累。好吧,网站开发实在不适合我。所以,我决定走回那一条不归路,游戏开发。为什么是说走回呢?自己参悟去。
现在还是以学习cocos2d-x为主,将来的目标是Unity 3D。作为一个coco2d-x的新手,看了两本书几套视频,然后就觉悟了。新手进化~~啦啦啦~菜鸟!!!。下面分享是利用cocos2d-x引擎写的飞机大战过程,纯属一个菜鸟的自导自演,如有雷同,请勿冲动。不足之处,也请各位大神指正。还有非常欢迎广大朋友一起来讨论学习。
好,下面就由我来手把手带大家打飞机~~~((⊙o⊙))

环境准备:
什么?你还没搭环境??好吧,百度去。这个也不是什么难事。工欲善其事必先利其器,一定要确保环境搭好!!!。
我当前的环境是:
win7、cocos2d-x 3.3、vs 2012、Python 2.7、java 8、ant 1.9.4、ndk r9d、还有sdk起码10以上吧。
好,环境准备好,开始创建游戏。这也是验证我们环境是否搭好的第一阶段。
打开命令行cmd 敲入cocos new planegame -p com.xin.game -l cpp -d f:/cocos
这是新建项目的命令,planegame 是项目名,-p com.xin.game 是指java开发相关的包,-l cpp 指开发的语言是c++,-d f:/cocos 是指项目创建到那个目录下
注:在敲这些命令行之前必须确保环境变量已经配好(切,这不是谁都知道的么,(⊙o⊙)好吧)
创建成功,如下图:

然后再编译,现在是在win7平台开发和测试,所以选择编译win32,在命令行敲入cocos run -p win32 -s f:/cocos/planegame
当然也可以在vs导入项目后编译,不过我发现那个编译是非常慢,而且非常卡,机子渣渣的我只能选择使用命令行去编译。编译过程都是一个非常庞大的工程,不信你去看看我们的项目现在的大小。3G!!!未编译之前是200兆吧。
如编译好了,就会出现如下图所示

好了,现在已经编译好(这是个艰难的过程,擦汗~~),编译好后我们可以看到已经启动了我们的hello world,如下图
看到这里,我们已经成功创建了我们的第一个项目。这也说明了我们的环境配置有一半已经确保无误了。 下一节将开始我们的代码之旅,敬请期待。

今天关于cocos2d-x学习笔记:SpriteBatchNodecocos2d-x教程的介绍到此结束,谢谢您的阅读,有关14.2Cocos2d-x 中的粒子系统(笔记);14.2.1 ParticleBatchNode;、cocos2d-iphone – Cocos2d的CCSpriteBatchNode抱怨不同的纹理ID、Cocos2d-js_____Sprite 和 SpriteBatchNode、Cocos2d-x 3.x学习笔记:猩先生带你打飞机(一)环境与创建项目等更多相关知识的信息可以在本站进行查询。

本文标签: