2012-04-07 69 views
0

感谢您的阅读。使用CCLayerPanZoom和CCRenderTexture时,CCSprite子坐标变换失败?

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

现在我已经将单个精灵添加到表面,并且它们由Box2D管理。这也适用。我可以将它翻译成光源应该在的RenderTexture,并且它们渲染得很好。

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

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

这就好像由背景中的CCPanZoomLayer进行的常量缩放抛出锚指向每帧上方的图层,并重置它们不起作用。它们似乎都默认放入它们所连接的节点边界框​​的一个角落,就好像它们的变换在绘图时被阻塞或设置为零一样。

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

回答

0

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

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

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

 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替换为所需的定位点值。

+0

hm我一直在使用Cocos 1.x和Zwoptex很长一段时间,我从来没有遇到过这个问题。 – johnbakers 2012-04-09 01:42:17

+0

嗨安德鲁 - 你使用SpriteBatchNodes和缩放通过CCLayerPanZoom?正如我所描述的,在简单的项目中我也不会发生这种情况,但这不再简单。 – Averett 2012-04-10 04:59:56