私は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 で実装する同様のアルゴリズムを持っていましたか?もしそうなら、これを解決するための一般的なパターンはありますか?