この些細な機能を解決するのに少し問題があります。私のゲームでは、レベルのある時点で、メインのゲームループを停止し、プレーヤーのスプライトにズームしたいと思います。プレーヤースプライトは、このループを含むレイヤーに追加され、コードを実行してこのプレーヤーにズームします。
このように見えます:
-(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)です-デフォルトのアンカーポイント
- メインレイヤーの位置は、最初はタイマーの前に(0,0)-シーンの作成時に追加されるだけです。