0

私はCocos2d 2.0で作業していますが、それ以外は使用していません(BOX2Dなどはありません..)。キャラクターがあり、CCSprite 子ノードとしてシャドウを追加しました。動くと素晴らしい「飛行効果」が得られますが、残念なことに、キャラクターが回転すると子供も回転し、影の子供は非現実的な方法で動きます。この写真を見てください:

ここに画像の説明を入力

3D ゲームでは、これは 3D マトリックスとゲーム内の光源の位置を使用してグラフィック エンジンで処理されます。ただし、私のゲームははるかに単純で、3D グラフィックスを必要としないため、プログラムで近似値を見つける必要があります。

最初に「setPosition」および「setRotation」メソッドを上書きしようとしましたが、あまり役に立ちませんでした (影の位置は変わりません)。

-(void) setPosition:(CGPoint)position
{
    [super setPosition:position];


    CCSprite * shadow = (CCSprite *)[self getChildByTag:belowByOneZFirst];
    if (shadow!=nil) {
        [shadow setPosition:shadowOriginalPosition];
        CCLOG(@"Setting shadow position");
    }

}

-(void) setRotation:(float)rotation
{
    [super setRotation:rotation];
    CCSprite * shadow = (CCSprite *)[self getChildByTag:belowByOneZFirst];
    if (shadow!=nil) {
        [shadow setRotation:0];
        CCLOG(@"Setting shadow rotation");
    }

}

私が今たどる道は二つあります。1 つは、シャドウを独立した CCSprite にする (子として追加しない) ことであり、もう 1 つは、"SET_DIRTY_RECURSIVELY()" マクロを変更してセッターをオーバーライドしようとすることです (子に特定のタグがあるかどうかをチェックし、そうであれば変更は適用されません)。

最初のアプローチは少し複雑すぎます。2 番目のアプローチは問題ないように思えますが、それでも少し複雑すぎます。

また、影の相対位置を「変更」しないだけでは、問題は完全には解決されません。代わりに、画面内のスプライトの相対位置を考慮して、影の相対位置を調整するコードを記述する必要があります (たとえば、太陽を左上隅に設定すると、影の相対位置に応じて影の形状が変化します)。太陽)。

他の誰かが Cocos2d で実装する同様のアルゴリズムを持っていましたか?もしそうなら、これを解決するための一般的なパターンはありますか?

4

1 に答える 1

0

ヒント:スプライトとシャドウ(位置オフセットあり)の両方をccnodeの子として追加します。ノードを移動し、スプライトのみを回転させます。シャドウの位置は、スプライトの位置へのオフセットのままです。問題は解決しました(私が理解している限り)。

于 2013-02-23T18:43:48.087 に答える