1

衝突検出のための NSIntersectionRect の概念を理解しましたが、プロジェクトに実装する方法が思い浮かびません。ボタンをクリックすると、ビューのサブクラスが呼び出され、ウィンドウ内のランダムな場所に円が配置されます。そのビュー内をクリックすると、円が点滅します (これにより、アクティブなビューになります)。アクティブなビューがある場合、その外側 (別の円ではなく) をクリックすると、そのビューがクリック ポイントに移動します。

[activeView animator setFrame: NSMakeRect(x, y, w, h)] を使用してアクティブ ビューを移動しています。これを衝突検出に使用できますか、それとも CABasicAnimation を使用する必要がありますか? 基本的に私がやろうとしているのは、他の円 (この時点では物理は必要ありません。動きを止めるだけです) および/またはアプリ ウィンドウの境界との衝突を検出することです。

誰かが私を正しい方向に向けることができれば (チュートリアル リンク、コード スニペット)、感謝します。

編集:以下の詳細な回答に基づいて、もう少し明確にする必要があります。衝突検出を実装する場所がわかりません。ビュー クラスのアニメーター メソッドは、1 行のコードです。衝突チェックを実行するために、画面上のすべての静的な円をどのように反復処理しますか? そのため、最初に、CoreAnimation、OpenGL、または Chipmunk のようなものを使用する必要があるかどうか、そしてナッジまたはアシストが得られるかどうかを考えています。

4

1 に答える 1

4

後で..最近の質問への回答として:

そのため、最初に、CoreAnimation、OpenGL、または Chipmunk のようなものを使用する必要があるかどうか、そしてナッジまたはアシストを得ることができれば素晴らしいと考えています。

回答 - OpenGL は絶対に必要ありません :) 次に、Box2D や Chipmunk のような物理ライブラリは絶対に必要ありません ... 必要に応じてそのようにすることもできますが、それは膨大な量の不要な作業になります。明確にするために: DrawRect の使用に完全に慣れるまでは、Chipmunk のようなものはとにかく役に立たないので、忘れてください。

Core Animation はあまり役に立ちません。明確にするために、アニメーションが発生しているときに中断したい場合があります。あれは正しいですか?

衝突検出を実装する場所がわかりません。ビュー クラスのアニメーター メソッドは、1 行のコードです。衝突チェックを実行するために、画面上のすべての静的な円をどのように反復処理しますか?

悪いニュース...実際にアニメーションを中断したい場合、衝突が発生した場合は、Core Animation を忘れてください。Core Animation では、アニメーションの「1 つの単位」として A から B に送信できます。 途中で停止させることはできません(衝突の場合)。それで、それはそれです。

はっきり言って、それがあなたのやりたいことですよね? 円を動かし、途中で何かに当たった場合は停止させます。これは正しいです?もしそうなら、コア アニメーションのことは完全に忘れて、これまでの作業をすべて捨ててください。

「実際の」プログラミング (それが何を意味するにせよ) に飛び込んで、drawRect を使い始める必要があります。あなたはそれの準備ができていますか?

この時点で、コロナのコピーを購入することを検討してください(100ドルほどです-デモは無料だと確信しています)。コロナを使えば、文字通り5分であなたが説明しているすべてのことができます。(この記事を書くのにかかった時間の1/10??) iPhoneに興味がある人には、いつもこれをお勧めします。銃の iPhone プログラマーになるのに 6 か月から 18 か月も費やしたくない場合は、iPhone 用のコロナをクリックするだけで、スタック オーバーフローを使用するよりもはるかに短い時間で、iPhone でサークルを激しくバウンスさせることができます。画面。

それで失敗したら、作業に取り掛かり、タイマー (NSTimer) を起動し、UIView で drawRect を使用する方法を学ぶ必要があります。

UIView のサブクラスである MyFirstView (.h および .m ファイル) という名前の新しいクラスを作成します (弱虫のための UIViewController ではありません!)。MyFirstView に drawRect メソッドが必要で、そこから先に進みます。


元の答え..

私はあなたの言っていることを理解しているかどうかわかりませんが、明確にするために:

2 つの円の間の衝突を検出したいとします。あなたの場合、すべての円は同じ直径です。あれは正しいですか?

もしそうなら、幸いなことに、それはとても簡単です。

2 つの CGPoint 間の距離を取得するルーチンを作成します。(その方法がわからない場合は、以下に含めます。)

次のステップでは、円の直径を知る必要があります。例として 50.0 としましょう。

次に、2 つの円が衝突しているかどうかをチェックするルーチンを次に示します。

static inline bool areTwoCirclesColliding( CGPoint aa, CGPoint bb )
    {
    return ( distanceBetweenTwoCGPoints(aa,bb) < 50.0 );
    }

(注... Objective C を初めて使用する場合は、上記が完全に有効なコードであることに注意してください。ファイルの先頭に貼り付けるだけです。OK?)

最後に、すべての円を互いにチェックして、衝突しているかどうかを確認する必要があります。

円の数が単純に固定されている場合 (3 つ程度としましょう)、すべてのコード行を書き出すだけで、いずれかの組み合わせが衝突しているかどうかを確認できます。したがって、次のようになります。

areTwoCirclesColliding(a,b)
areTwoCirclesColliding(a,c)
areTwoCirclesColliding(b,c)

円の配列またはある種のリストがある場合は、それらすべてを調べて、それぞれが互いに接触していないことを確認するだけです。疑似コードでは、このようなものかもしれません...

for n in 1 to numberCircles
   oneCircle = circles[n]
   for m in n+1 to numberCircles
      anotherCircle = circles[m]
      if ( areTwoCirclesColliding(oneCircle,anotherCircle) )
         .. break, you found a collision

あるいは、このように書くこともできますが、違いはありません..

for each aa in circles
  for each bb in circles
    if (aa != bb) if (areTwoCirclesColliding(aa,bb)) .. break, found collision

{余談ですが、疑似コードで各ペアを 2 回チェックすることはまったく重要ではありません。問題ありません。}

申し訳ありませんが、使用している構造がわからないため、実際のコードを書くことはできません。

もちろん、円がオブジェクトである場合、他のすべての円に対してそれ自体をテストするように賢明に設定できます。同じ考えです。円の SQL データベースがある場合は、それらすべてを相互にテストします。

幸いなことに、2 つの円が衝突しているかどうかを確認するのは 1 行のコードであることがわかります。すべての円の衝突をチェックするには、3 ~ 4 行のコードが必要です。幸いなことに全部で約5行!

これは、ビデオ ゲームの物理学に関する信じられないほど簡単なチュートリアルです。パート 1.1.1.1 !!!! それが役に立てば幸い!それがあなたが達成しようとしていたものではない場合、それはタイピングの完全な無駄でした! :)

記録として、2 つの CGPoint 間の距離を取得するルーチンを次に示します。

static inline float rawDistance(float x, float y, float p, float q)
    {
    return sqrt( ((x-p)*(x-p)) + ((y-q)*(y-q)) );
    }
static inline float distanceBetweenTwoCGPoints( CGPoint a, CGPoint b )
    {
    return rawDistance( a.x, a.y, b.x, b.y );
    }

(注... Objective C を初めて使用する場合は、上記が完全に有効なコードであることに注意してください。ファイルの先頭に貼り付けるだけです。OK? x=CGLayerGetContext など、Apple が提供する日常的な関数を使用するのとまったく同じです。 ()、例えば。お楽しみください!)

後で..そして一般的な要求により、オブジェクト、サークル...

-(bool)isTouchingOtherCircle:(circle)c
  {
  return areTwoCirclesColliding(self.center, c.center);
  }
-(bool)isTouchingAnyOtherCircle
  {
  for oc in yourCircles
    if (oc != self)
      if ( [self isTouchingOtherCircle:oc] )
        return false;
  return true;
  }
于 2011-02-19T19:20:26.723 に答える