2012-01-13 3 views
0

私は最初に使用可能なiOSアプリケーションを終了するのが遅れています。 私は単純なPongゲームを作成しています。私はCGRectIntersectsRectを使用して単純な衝突検出を使用していますが、問題が発生しました。iOS Pong Development、Collision Detection

if(CGRectIntersectsRect(mic.frame,plosina_a.frame)) { 
     if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) { 
      RychlostMice.y = -RychlostMice.y; 
     } 
    } 
    if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) { 
     if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) { 
      RychlostMice.y = -RychlostMice.y; 
     } 
    } 

は、私はこのボール(マイク)のようにそれを使用すると、ソートのパドル(plosina)に取得し、パドルの真ん中に一種の他の方法を移動を開始します。 私のプログラミング教師は以前に使った.frameの代わりに.frame.size.heightを追加することで、パドルの1つ(_bのもの)のこの問題を修正することができましたが、他のパドルそれは動作しませんでした私はそれが何であるか分からない。

また、ボールがパドルに巻き込まれる状況があることもあるので、おそらく片側だけでなくオブジェクト全体の定義を探しています。

私はあなたを助けることを望みます。

+0

は、上部に_aパドル、下部に_bパドルですか?そうであれば、おそらく_b.frame.size.heightでパドル_aの意味を逆転させてみてください。 –

+0

_aはゲームフィールドの下になく、_bは上にあります。 –

+0

私はNick Lockwoodが '+'の代わりに '+'を使うことを提案していると考えているので、逆転しようとしています –

答えて

0

私はあなたのポンが垂直に演奏されていると推測しているので、1つのパドルが画面の上部にあり、もう一方のパドルが下部にあります。

ロジックを他のパドルに対して垂直にミラーリングする必要がある場合は、今、あなたは、上部と下部のパドルに同じロジックを使用していますが、下のパドルのためにあなたは、おそらく私は>記号を使用して、代わりの高​​さを引いてるか

if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) { 
    if(mic.center.y > (plosina_b.center.y - plosina_b.frame.size.height)) { 
     RychlostMice.y = -RychlostMice.y; 
    } 
} 

代わりに以下の注意事項ようなものが必要それを追加する。

+0

よくplosina_bは何とかうまくいくものです。私があなたが言うことをやってもそれはうまくいくでしょうが、もし私がplosina_aにそれを適用すれば、それはちょうどうまくいきません。私は>記号を逆にして減算しようとしましたが、plosina_aの衝突検出で減算を使用すると、単純に通過します。 –

+0

それでも、ボールがパドルの内側にいつかはまってしまう問題は解決しません。 –

2

私はここで3つの潜在的な問題を見ることができます。

ボールがパドルに重なるまで待ってからタッチしてカウントすることです。ボールがパドルに接触したときにボールが他の方向に動くようにしたいと思うように思えます。 CGRectIntersectsRectは、重複するまで待機してからtrueを返します。いずれかの矩形をCGRectInsetの呼び出しで1ピクセル大きくすると、ボールがそのパドルに到達するとすぐにテストがtrueを返します。その時間が過ぎると、1ピクセルが展開矩形にオーバーラップします。テストは次のようになります。

if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_a.frame)) { 
    if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) { 
     RychlostMice.y = -RychlostMice.y; 
    } 
} 
if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_b.frame)) { 
    if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) { 
     RychlostMice.y = -RychlostMice.y; 
    } 
} 

2番目の潜在的な問題は、ボールの速度と関係があります。すべてのコードを見ることなく、私はこれが問題であるかどうかわかりません。ボールが一度に複数のピクセルを移動することができる場合、ボールはヒット検出なしでパドルと容易に重なり合うか、または通過することがあります。これを補うために追加できるロジックの変更はたくさんありますが、最も簡単な解決策は、ボールが一度に複数のピクセルを移動しないようにすることです。

最後に、両方のパドルにハックを使用する場合は、反対側の比較の記号を逆にします。

+0

私は一度に複数のピクセルを移動できるかどうかわかりません。私はCGPointMakeを使ってボールに速度を与えていますが、X軸とY軸の速度を与えています。 いずれにしても、CGRectInsetを使用すると、CGRectIntersectsRectが重ならないうちにボールが検出されます。 –

+0

私は比較記号を逆にして、_bパドルを正しく動作させるようにしましたが、ボールが重なっているように_aパドルが見えます。 –

+0

ボールを動かすための式を見てください。 x = x + dxのようなもので、yについても同様です。 abs(dx)が1より大きい場合は、一度に複数のピクセルを移動できます。 – Mike