0

この些細な機能を解決するのに少し問題があります。私のゲームでは、レベルのある時点で、メインのゲームループを停止し、プレーヤーのスプライトにズームしたいと思います。プレーヤースプライトは、このループを含むレイヤーに追加され、コードを実行してこのプレーヤーにズームします。

このように見えます:

-(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)-シーンの作成時に追加されるだけです。
4

1 に答える 1

0

私の知る限り、スケーリングはアンカーポイントによって影響を受けます。ズームインするだけの場合は、CCCameraを使用しないでください。

[myLayer.camera setEyeX:0 eyeY:0 eyeZ:zoomValue];

eyeZを変更してズームインおよびズームアウトできます。

于 2012-04-17T08:05:44.840 に答える