2011-02-01 8 views
0

私はiPhone用のゲームに取り組んでおり、大きな問題にぶつかっています。ゲームは次のように動作します。プレイヤーは画面の下部にあるキャラクターをコントロールします。キャラクターを前後に動かして、画面の上から落ちてくるボールを捕まえます。これらのボールはすべてスクリーンの下に移動する配列の一部です。それらはすべて同じポインタを持ちます。 *玉。メソッドが呼び出されると、新しいボールが作成されます。ボールがキャラクターと衝突すると、ボールは別のキャラクターの上に積み重なります。これを行うには、それらを移動する配列から削除し、X位置を文字と等しくし、Y位置が衝突した位置にすることによって、それらをスタックの一部にする別の配列に追加します。私の問題は、画面全体が下にスクロールする必要があるスタックが大きくなるにつれてです。キャラクターがスクリーンから消えて、ボールが1つずつ追加されると、下の1つのボールも画面の下に移動します。一度に3つのボールのみを画面に表示します。私は2番目の配列を移動させようとしましたが、それらのすべてが同じ位置にあり、したがって "スタック"を破壊します。以下は私の更新メソッドです。この仕事をどうやって行うのか教えてください。私はこれに少し新しいですので、良いexplainationは大いに感謝しています!同じ配列の人に電話をかけるcocos2d iphone

おかげ タナー

if (CGRectIntersectsRect(SealRect, BallRect)) { 

      BallIsMoving = NO; 
      BallHasIntersectedSeal = NO; 
      //BallIntersectedSeal = YES; 
      [self CollisionRectUpdate]; 
      NumberOfCollisions = NumberOfCollisions + 1; 
      Ball.position = ccp(SealSprite.position.x + 10, SealSprite.position.y + 20 + (NumberOfCollisions * 60)); 
      [BallArray_ removeObject: Ball]; 
      [BallHasCollidedArray_ addObject: Ball]; 

     } 
} 

for (CCSprite *Ball in BallHasCollidedArray_) { 
    Ball.position = ccp(SealSprite.position.x + 10, Ball.position.y); 

} 
for (CCSprite *SealSprite in AllObjectsArray_) { 

    if (NumberOfCollisions > 3) { 

     FullScreenDisplacementSeal = (NumberOfCollisions - 4) * -60; 

     if (SealSprite.position.y > FullScreenDisplacementSeal) { 

      SealSprite.position = ccp(SealSprite.position.x, SealSprite.position.y - 5); 

     } 
    } 
} 

for (CCSprite *Ball in BallHasCollidedArray_) { 

    if (NumberOfCollisions > 3) { 

     FullScreenDisplacement = (NumberOfCollisions - 4) * 60; 
     Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);  
    } 

} 

}

私はまだ個別に各1に作用しながら、BallHasCollidedArray内のすべての「ボール」に基づいて行動する方法が必要ですね。 5000ボールがあってもまだ動作するように表現する必要があります。

答えて

1

あなたは、彼らはまた、x座標とまったく同じを持っているので、彼らは定義によって同じ場所になり、このように

Ball.position = ccp(Ball.position.x, FullScreenDisplacement); 

ラインにすべてのボールがまったく同じ-y座標与えています(あなたが説明するように)。

また、変位を決定するためのあなたの数学は私にオフに思える:あなたが見ることができるように

FullScreenDisplacement = ((NumberOfCollisions - 3) * -60) + (NumberOfCollisions * 60) 
         = (-60 * NumberOfCollisions) + 180 + (60 * numberOfCollisions) 
         = 180 

は、いくつかの単純化した後、衝突のあなたの数が実際に出要因。あなたが実際に望んでいるのは、あなたがシールをずらしたのと同じ量だけ各ボールのオリジナルのy座標を置き換えることです(正しく動いたと仮定して)。私はあなたのボールは、高さ60個のピクセル(あなたが使用している60の故に因子)であることをここに仮定します:

for (CCSprite *Ball in BallHasCollidedArray_) 
{ 
    if (NumberOfCollisions > 3) 
    { 
     FullScreenDisplacement = (NumberOfCollisions - 3) * -60; 
     Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement); 
    } 
} 

そのような場合、あなたのシールが正しい位置にもおそらくない疑いされ、与えられましたあなたが投稿したコード。そうであれば、同じアプローチが適用されます。

最後に、FullScreenDisplacementです。ループ不変式 - ループのどの時点でも値は変化しません。このように、ループの外側で一度だけ計算する方がはるかに効率的です。同じことがifテストにも当てはまります。

if (NumberOfCollisions > 3) 
{ 
    FullScreenDisplacement = (NumberOfCollisions - 3) * -60; 
    for (CCSprite *Ball in BallHasCollidedArray_) 
    { 
     Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement); 
    } 
} 

また、私はあなたが呼んこのccp機能が何をするかわからないんだけど、それが唯一の引数から新しい位置を作成した場合、次ははるかに簡単かつ効率的に同等である:

Ball.position.y -= FullScreenDisplacement; 

上記のすべてが役立つことを願っています。何かが意味をなさない場合や、提案された変更が問題に役立たない場合は、私に知らせてください。

+0

ありがとうございました!私はまだいくつかの問題を抱えています。私は私の質問のコードを更新しました。今度は最初に動作するように見えますが、ボールは積み重ねられ、第4コーションではシールとスタック全体が動くように動きますが、60点後にシールが止まり、ボールは続行します。同じ場所で。シールは1つしかないので、私のシールはうまくいきます。しかし、私は複数のボールがあるので、同じ方法を使用することはできません。 もう一度お世話になりました。 Tanner –

+0

私はそれをクリアしたと思います。あなたの助けをありがとう! –

+0

あなたは大歓迎です:) – Mac

関連する問題