2012-04-05 34 views
0

宇宙船がレイヤーを通過する小さなゲームを開発中ですが、状況によっては宇宙船が敵に近づき、レイヤー全体がズームインされます宇宙船のズームレベルは船と敵の距離に依存します。これらはすべて正常に動作します。ズームレイヤーをスプライトの中央に配置

しかし、主な質問は、ズームを宇宙船の中心に維持する方法です。

現在、私はupdateメソッドを通じてGameLayerオブジェクトにズームを制御し、ここでのコードは次のとおりです。

-(void) prepareLayerZoomBetweenSpaceship{ 
    CGPoint mainSpaceShipPosition = [mainSpaceShip position]; 
    CGPoint enemySpaceShipPosition = [enemySpaceShip position]; 

    float distance = powf(mainSpaceShipPosition.x - enemySpaceShipPosition.x, 2) + powf(mainSpaceShipPosition.y - enemySpaceShipPosition.y,2); 
    distance = sqrtf(distance); 

    /* 
     Distance > 250 --> no zoom 
     Distance < 100 --> maximum zoom 
    */ 
    float myZoomLevel = 0.5f; 
    if(distance < 100){ //maximum zoom in 
     myZoomLevel = 1.0f; 
    }else if(distance > 250){ 
     myZoomLevel = 0.5f; 
    }else{ 
     myZoomLevel = 1.0f - (distance-100)*0.0033f; 
    } 

    [self zoomTo:myZoomLevel]; 
} 

-(void) zoomTo:(float)zoom { 
    if(zoom > 1){ 
     zoom = 1; 
    } 

    // Set the scale. 
    if(self.scale != zoom){ 
     self.scale = zoom; 
    } 
} 

基本的に私の質問は:どのように私はレイヤーをズームしないと2隻の間で正確にセンタリング?私はこれが2本の指でピンチズームのようなものだと思います!

+0

ズームがship.Alsoに焦点を当てていることを示唆しているこのコードには何もありません。ユーザーインタラクションを通じて画面上を自由に移動できる船か、固定されていて、レイヤーを移動していますか? – skytz

+0

こんにちは、船はジョイスティックで制御されています。私の質問は、実際にはどのようにズームされているときに船にレイヤーをフォーカスすることです:) – clops

+0

私は決定的な答えを与えるが、一般的に知る必要があります:中心点の位置を取得し、それらのコードの。次に、それらのコードをスケールで掛けます。 – tustvold

答えて

1

以下は、あなたのために働くべきコードです。基本的にあなたがしたい:

  1. parentNode年代内のあなたの船の位置は、これらの新しい位置をシステム軸
  2. 図アウト画面がに拘束されることになる原因となります座標更新します。
  3. スケールおよび再配置parentNode

私はいくつかのまばらなコメントを追加しましたが、あなたは、それ以上の質問/問題があれば私に知らせてください。

CGSize size = [[CCDirector sharedDirector] winSize]; 
fullScreenSize = CGPointMake(size.width, size.height); 
halfScreenSize = ccpMult(fullScreenSize, .5f); 
parentNode = [CCNode node]; 
[self addChild:parentNode]; 

shipA = [CCSprite spriteWithFile:@"Icon-Small.png"]; //or whatever sprite 
[parentNode addChild:shipA]; 

shipB = [CCSprite spriteWithFile:@"Icon-Small.png"]; 
[parentNode addChild:shipB]; 

//schedules update for every frame... might not run great. 
//[self schedule:@selector(updateShips:)]; 

//schedules update for 25 times a second 
[self schedule:@selector(updateShips:) interval:0.04f]; 
:あなたのCCLayerに入れて

CCNode *parentNode; 
CCSprite *shipA; 
CCSprite *shipB; 
CGPoint destA, deltaA; 
CGPoint destB, deltaB; 
CGPoint halfScreenSize; 
CGPoint fullScreenSize; 

のinitもの:それはあなたのCCLayerに入れて...最初のテストプロジェクトに

アイバーズこれをダンプするのが最も簡単かもしれません

ズーム/センター/船の更新方法:

-(void)updateShips:(ccTime)timeDelta { 
    //SHIP POSITION UPDATE STUFF GOES HERE 
    ... 

    //1st: calc aspect ratio formed by ship positions to determine bounding axis 
    float shipDeltaX = fabs(shipA.position.x - shipB.position.x); 
    float shipDeltaY = fabs(shipA.position.y - shipB.position.y); 
    float newAspect = shipDeltaX/shipDeltaY; 

    //Then: scale based off of bounding axis 

    //if bound by x-axis OR deltaY is negligible 
    if (newAspect > (fullScreenSize.x/fullScreenSize.y) || shipDeltaY < 1.0) { 
     parentNode.scale = fullScreenSize.x/(shipDeltaX + shipA.contentSize.width); 
    } 
    else { //else: bound by y-axis or deltaX is negligible 
     parentNode.scale = fullScreenSize.y/(shipDeltaY + shipA.contentSize.height); 
    } 


    //calculate new midpoint between ships AND apply new scale to it 
    CGPoint scaledMidpoint = ccpMult(ccpMidpoint(shipA.position, shipB.position), parentNode.scale); 
    //update parent node position (move it into view of screen) to scaledMidpoint 
    parentNode.position = ccpSub(halfScreenSize, scaledMidpoint); 
} 

また、何度も何度も何度も何度も演奏するのかどうかはわかりませんが、別に問題があります。

+0

徹底的な答えをお寄せいただきありがとうございます。私は今夜テストしますが、約束しています:) – clops

+0

簡単なデモのためにランダムに動き回る 'updateShips'メソッドには〜20行のコードがありますあなたはそれが動作するのを見るためにサンプルプロジェクトに落とすことができます。あなたがそれらをしたい場合私に教えてください! – MechEthan

+0

編集済み回答:分かりやすくするために、コードの最後の行を2行+ 2個のコメントに分割しましたが、機能的には元のコードと同じです。 – MechEthan

0

ビュー全体を移動しないと、&は船が画面中央に来るように配置しますか?私はあなたの例でそれを試していないが、それはまっすぐでなければならない。たぶん、このような何か - 私はすべてをあなたはすでに私はかなりしばらくの間、UIScrollViewのを使用していないscreenCentreX & Y.を設定した

CGFloat x = (enemySpaceShipPosition.x - mainSpaceShipPosition.x)/2.0 - screenCentreX; 
CGFloat y = (enemySpaceShipPosition.y - mainSpaceShipPosition.y)/2.0 - screenCentreY; 


CGPoint midPointForContentOffset = CGPointMake(-x, -y); 

[self setContentOffset:midPointForContentOffset]; 

...(ユニティで何かに取り組んできを忘れていますObj-C)、&私はcontentOffsetがどのようにズームレベルの影響を受けるか覚えていません。試してみてください&を参照してください! (あなたがUIScrollViewを使用していると仮定しています。もしあなたがそうでなければ、それを試すこともできます)

+0

これは、物を扱う正しい方法のように見えます - >レイヤーを2つの船間の中心点に合わせて移動します。しかし、ピンチズームのように、スケーリングする必要があります。 – clops

関連する問題