0

谢谢阅读。

我正在 Cocos2D 1.x 中进行设置,其中我有一个巨大的 CCLayerPanZoom 在一个可以自由平移和缩放的场景中。每一帧,我都必须在顶部额外绘制一个 CCRenderTexture 以创建“黑暗”(我正在切断光线)。效果很好。

现在我在表面上添加了单个精灵,它们由 Box2D 管理。这也有效。我可以转换到光源应该在的 RenderTexture,并且它们渲染得很好。

然后我想通过在场景中添加一个 CCLayer 在顶部添加一个 HUD 层。该层需要包含多个堆叠在一起的精灵,作为用户界面元素。

只是,所有这些元素都无法在我需要它们的位置绘制:正好在屏幕的中心。添加到 HUD 层的 Sprite 全部关闭,我已经迭代了几乎所有变体“convertToWorldSpace”、“convertToNodeSpace”等。

就好像 CCPanZoomLayer 在后台的不断缩放会抛出每一帧上方图层中的锚点,并且重置它们没有帮助。它们似乎都默认为它们所连接的节点边界框​​的角之一,就好像它们的变换在绘图时被阻止或设置为零一样。

有没有人遇到过这个问题?使用 CCLayerPanZoom 并在每帧顶部绘制自定义 CCRenderTexture 时,这是一个已知问题吗?

4

1 回答 1

0

哈!我找到了罪魁祸首!Cocos2D 使用 Zwoptex 数据的方式存在错误。(我使用的是 Cocos2D v 1.0.1)。

似乎在加载 Zwoptex v3 数据时,在计算实际的精灵帧锚点时会忽略精灵帧的修剪偏移数据。效果是在定义中(例如在 plist 中)具有修剪偏移的精灵上没有锚点正确设置其锚点。真的很奇怪......我想知道这是否发生在其他人身上?这是一个明显的问题。

以下是如何重现: 为 zwoptex v3 格式的精灵帧创建任何数据(使用修剪数据的格式)。确保你确实有一个修剪过的精灵,即偏移量必须大于零,并且图像大小必须大于源。加载精灵,并尝试将其定位在屏幕中心。你会看到它关闭了。以下是正确计算锚点的方法:

        CCSprite *floor = [CCSprite spriteWithSpriteFrameName:@"Menu_OmeFloor.png"]; //create a sprite
        CCSpriteFrame *frame=[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Menu_OmeFloor.png"]; //get its frame to access frame data
        [floor setTextureRectInPixels:frame.rect rotated:frame.rotated untrimmedSize:frame.originalSizeInPixels]; //re-set its texture rect
        //Ensure that the coordinates are right: Texture frame offset is not counted in when determining normal anchor point:
        xa = 0.5 + (frame.offsetInPixels.x / frame.originalSizeInPixels.width);
        ya = 0.5 + (frame.offsetInPixels.y / frame.originalSizeInPixels.height);
        [floor setAnchorPoint:ccp(xa,ya)];
        floor.position=(where you need it);

将 xa/ya 公式中的 0.5 替换为所需的锚点值。

于 2012-04-08T06:00:52.873 回答