0

読んでくれてありがとう。

私は Cocos2D 1.x のセットアップに取り組んでおり、無料のパンとズームを備えたシーンに巨大な CCLayerPanZoom があります。すべてのフレームで、「闇」を作成するために CCRenderTexture を上に追加で描画する必要があります (光を切り取っています)。それはうまくいきます。

これで、単一のスプライトがサーフェスに追加され、Box2D によって管理されます。それもうまくいきます。光源があるべき場所を RenderTexture に変換すると、うまくレンダリングされます。

そして、シーンに CCLayer を追加して、上に HUD レイヤーを追加したいと考えました。そのレイヤーには、ユーザー インターフェイス要素として、互いに重ねられた複数のスプライトを含める必要があります。

ただ、これらの要素はすべて、必要な場所、つまり画面のちょうど中央に描画できません。HUD レイヤーに追加されたスプライトはすべてオフになっており、「convertToWorldSpace」、「convertToNodeSpace」など、ほぼすべてのバリエーションを繰り返しました。

バックグラウンドでの CCPanZoomLayer による一定のスケーリングにより、各フレームの上のレイヤーのアンカー ポイントが失われ、それらをリセットしても役に立たないかのようです。それらはすべて、描画に関しては変換がブロックされているかゼロに設定されているかのように、アタッチされているノード バウンディング ボックスのコーナーの 1 つにデフォルト設定されているように見えます。

誰かがこの問題に遭遇しましたか? これは、CCLayerPanZoom を使用し、各フレームの上にカスタム CCRenderTexture を描画する場合の既知の問題ですか?

4

1 に答える 1

0

ハ!犯人を見つけた!Cocos2D の Zwoptex データの使用方法にバグがあります。(私は Cocos2D v 1.0.1 を使用しています)。

Zwoptex v3 データをロードすると、実際のスプライト フレームのアンカー ポイントが計算されるときに、スプライト フレームのトリム オフセット データが無視されるようです。その結果、定義 (plist など) にトリム オフセットがあるスプライトのアンカー ポイントには、正しく設定されたアンカー ポイントがありません。本当に奇妙です.これは他の誰かに起こったのだろうか?明快な問題です。

再現方法は次のとおりです。 zwoptex v3 形式 (トリム データを使用するもの) でスプライト フレームのデータを作成します。実際にトリミングされたスプライトがあることを確認してください。つまり、オフセットは 0 より大きく、画像サイズはソースよりも大きくする必要があります。スプライトを読み込んで、画面の中央に配置してみてください。オフになっていることがわかります。アンカーポイントを正しく計算する方法は次のとおりです。

        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 に答える