【问题标题】:Game object with composition and CCSpriteBatchNode continued具有合成和 CCSpriteBatchNode 的游戏对象(续)
【发布时间】:2012-11-30 12:27:32
【问题描述】:

有人会考虑以下场景并给我一个建议:我正在使用一个具有一个 CCSpriteBatchNode 的 GameplayLayer 实现一个基本的 cocos2d 游戏。我有一个 GameObject:CCNode,它有 3 个 CCSprite,如下所示:

CCSprite *bodySprite;    
CCSprite *hairSprite;   
CCSprite *eyesSprite;

初始化GameObject 时,我将精灵添加到GameObject 作为它的子元素,如下所示:

[self addChild:bodySprite];
[self addChild:hairSprite];
[self addChild:eyesSprite];

这样我可以更改节点 (GameObject) 的位置、旋转等,并且所有精灵都会受到更改的影响但是当我添加更多时会出现一个主要的性能问题不止一个GameObjects 以"each sprite draws itself, which means one additional draw call per sprite" 身份出现在现场。

为了解决性能问题,在阅读了this post 之后,我决定在初始化时将GameObject 的精灵添加到GameplayLayerCCSpriteBatchNode,如下所示:

 [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:bodySprite];
 [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:hairSprite];
 [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:eyesSprite];

只是现在,我必须一一设置GameObject的精灵的位置,而不是

self.position = ...

我必须使用

bodySprite.position = ...
hairSprite.position = ...
eyesSprite.postion =...

这是一个乏味的更改,我失去了将 GameObject 设计为精灵组合的最大好处之一。

问题:有没有办法使用节点的位置来影响组成精灵的位置,我可以将它们作为子级添加到GameObjectsceneSpriteBatchNode 中吗?如果不是正确的方法,是不是一一设置精灵的位置?

【问题讨论】:

    标签: cocos2d-iphone code-organization


    【解决方案1】:

    首先,“主要表现”是相对的。如果这是您唯一的精灵,您将看不到精灵对它们进行批处理的任何效果。如果您同时在屏幕上显示几十个,情况就不同了。

    您不能同时向两个父节点添加节点。

    您可以做的是创建一个“容器”精灵。创建一个带有纹理的 CCSprite(与精灵批处理节点纹理相同)和一个 CGRectEmpty 作为纹理矩形。这使得 sprite 不绘制任何内容,您可以将其用作添加到 CCSpriteBatchNode 中的 CCNode。

    然后你可以将你的精灵添加到那个不可见的精灵中,并像以前一样使用容器精灵来影响其子精灵的位置、旋转等。

    【讨论】:

    • cool :) 非常感谢你,我会尽快尝试的……是的,平均而言,我同时有 20 个游戏对象,这使我的帧速率降至 40 fps 以下:/
    • 嗨,我确实尝试了建议的解决方案,它确实有效......唯一的问题是我依赖节点的位置并将整个纹理作为精灵的纹理(即使不可见)将使我根据节点的位置更改逻辑。我目前正在重新设计整个东西。
    猜你喜欢
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多