後で..最近の質問への回答として:
そのため、最初に、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;
}