2012-04-16 5 views
0

私はこの些細なことを解決するために少し問題があります。私のゲームでは、あるレベルのあるポイントで、メインのゲームループを止め、プレーヤーのスプライトをズームしたいと思います。プレーヤーのスプライトがこのループを含むレイヤーに追加され、コードを実行してこのプレーヤーにズームします。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) - シーンを作成するときに簡単に追加されます

答えて

0

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

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

ズームインとズームアウトを変更することができます。

+0

彼らは2DシーンでCCC​​ameraを使用していません。 –

+0

正しいが、私の経験からはうまくいく –

関連する問題