使用CCLayerPanZoom和CCRenderTexture时,CCSprite子坐标转换失败?

时间:2012-04-07 17:49:36

标签: cocos2d-iphone kobold2d

感谢阅读。

我正在Cocos2D 1.x中进行设置,我在场景中有一个巨大的CCLayerPanZoom,可以自由平移和缩放。 每一帧,我都必须在顶部画一个CCRenderTexture来创造“黑暗”(我正在削减光线)。这很有效。

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

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

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

就好像背景中CCPanZoomLayer的常量缩放会抛出每帧上方图层中的锚点,重置它们无济于事。它们似乎都默认为它们所附着的节点边界框​​的一个角落,就像它们的变换被阻挡或在绘图时设置为零一样。

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

1 个答案:

答案 0 :(得分: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替换为所需的锚点值。