私はこの些細なことを解決するために少し問題があります。私のゲームでは、あるレベルのあるポイントで、メインのゲームループを止め、プレーヤーのスプライトをズームしたいと思います。プレーヤーのスプライトがこのループを含むレイヤーに追加され、コードを実行してこのプレーヤーにズームします。Cocos2d:レイヤーをスプライトにスケールする
それは次のようになります。
-(void) stopGameAndZoomToPlayer {
[gamePlayLoop_ invalidate];
zoomToPlayerLoop_ = [NSTimer scheduledTimerWithTimeInterval:1.0f/60.0f target:self selector:@selector(tickZoomToPlayerLoop:) userInfo:nil repeats:YES];
}
ダニの方法は、次のように実装されているため:
-(void) tickZoomToPlayerLoop:(NSTimer*)timer {
if (self.scale > 4) {
[zoomToPlayerLoop_ invalidate];
}
[self setScale:self.scale+0.001];
CGSize winSize = [[CCDirector sharedDirector]winSize];
CGPoint targetPosition = playerSprite_.position;
float wantedX = ((winSize.width/2-targetPosition.x)/self.scale);
float wantedY = ((winSize.height/2-targetPosition.y)/self.scale);
CGPoint maximumCenter = ccp(wantedX,wantedY);
[self setPosition:maximumCenter];
}
は些細な権利ですか?しかし、ゆっくりとしたズームは、プレーヤーのスプライトに対してオフセットされているため、欠落しているものがあります。 tickZoomToPlayerLoopタイマーの最後にプレーヤーのスプライトが表示され、画面の右上に表示されます。中央にはありません(ビューポートの右上隅の中心にさえされていません)。
私はそれを見て、このコードは、メインレイヤーの中心をプレーヤーのスプライトの位置に置きます。次に、の位取りをします。実際には、位置はズームループ内にすべきではありませんが、ここではレベルレイヤの境界を処理する必要があるため、ここに入れておきます。なぜなら、今のところユーザーはレベル外の黒い空き領域を見ることができるからです。しかし、ループの始めのメインレイヤーの中心がプレイヤーのスプライトのように見える場合でも、スケーリングすると、それが見えません。
スケールがCCNodeの中心をターゲットにしていますか?それはどのような方法で相殺されていますか?スケーリングの仕方にアンカーポイントが関与していますか?
いくつかの詳細に関する情報:主層の
- アンカーポイントは、(0.5,0.5)される - デフォルト1
- メイン層の位置は(、タイマーの前に最初に、あります0,0) - シーンを作成するときに簡単に追加されます
彼らは2DシーンでCCCameraを使用していません。 –
正しいが、私の経験からはうまくいく –