Позже .. в ответ на ваши последние вопросы:
Именно поэтому я сначала задаюсь вопросом, нужно ли мне использовать CoreAnimation, OpenGL или что-то вроде Бурундука, а затем, если бы я мог получить толчок или помощь, это было бы здорово.
Ответ - вам совершенно определенно не нужен OpenGL :) Далее, вам определенно не нужна физическая библиотека, такая как Box2D или Chipmunk ... вы могли бы пойти по этому пути, если бы захотели, но это было бы огромное количество ненужная работа. Чтобы быть ясным: пока вы полностью не знакомы с использованием DrawRect, такие вещи, как бурундук в любом случае бесполезны для вас, так что просто забудьте об этом.
Базовая анимация вам не очень поможет. Чтобы было ясно, вы, возможно, хотите прервать анимацию, когда она происходит. Это правильно?
Я запутался в том, где реализовать обнаружение столкновений. Метод аниматора класса представления представляет собой одну строку кода. Как бы я перебрал все статические круги на экране, чтобы выполнить проверку столкновения?
Плохие новости ... если вы действительно хотите прервать анимацию, если есть столкновение, забудьте о Core Animation. Базовая анимация позволит вам отправить его из А в Б как «одну единицу» анимации. Это НЕ позволит вам остановить его посередине (в случае столкновения). Итак, вот и все.
Чтобы было ясно, это то, что вы хотите сделать правильно? Вы приводите круг в движение, и, если он попадает во что-то по пути, вы хотите, чтобы он остановился. Это правильно? если это так, полностью забудьте о Core Animation и отбросьте всю работу, которую вы проделали.
Вам придется погрузиться в «реальное» программирование (что бы это ни значило) и начать использовать drawRect. Вы готовы к этому?!
Здесь я мог бы просто упомянуть: подумайте о покупке копии Corona (это похоже на 100 долларов - я уверен, что демо-версия бесплатна). Вы можете сделать все, что вы описываете, буквально за пять минут, используя Corona. (1/10 времени, затраченного на написание этого поста ??) Я всегда рекомендую это людям, которые интересуются iPhone. Если вы не на самом деле хотите потратить от 6 до 18 месяцев на то, чтобы стать программистом для iPhone - просто нажмите на Corona для iPhone, и через некоторое время вам понадобится использовать Stack Overflow, вы можете получить круги дико подпрыгивают на экране iPhone.
Итак, в противном случае вам придется приступить к работе и научиться запускать таймер (NSTimer) и использовать drawRect в UIView.
Создайте новый класс под названием MyFirstView (файл .h и .m), который является подклассом UIView (не UIViewController, который предназначен для слабаков!). Вам понадобится метод drawRect в MyFirstView и продолжайте оттуда!
Оригинальный ответ ..
Я не уверен, что понимаю, что вы говорите, но поясню:
Вы хотите обнаружить столкновение между двумя кругами . В вашем случае все круги одинакового диаметра. Это правильно?
Если это так, к счастью, это очень легко сделать.
Напишите подпрограмму, которая получает расстояние между двумя CGPoints. (Если вы не знаете, как это сделать, я включил это ниже.)
Следующий шаг, вы должны знать ДИАМЕТР ваших кругов. Допустим, это 50,0 для примера.
Далее приведена процедура, которая проверяет, сталкиваются ли два круга:
static inline bool areTwoCirclesColliding( CGPoint aa, CGPoint bb )
{
return ( distanceBetweenTwoCGPoints(aa,bb) < 50.0 );
}
( Примечание ... если вы новичок в Objective C, обратите внимание, что приведенный выше код является полностью допустимым. Просто вставьте его в начало файла. ОК?)
Наконец, вам просто нужно проверить все свои круги, один против другого, чтобы увидеть, сталкиваются ли они.
Если у вас есть простое фиксированное количество кругов, скажем, три или около того, просто запишите все строки кода, чтобы проверить, не сталкиваются ли какие-либо комбинации, следовательно:
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
{В сторону - Для записи совершенно неважно, что вы проверяете каждую пару дважды в этом псевдокоде, нет проблем.}
Я не могу написать реальный код для вас, потому что я не знаю, какую структуру вы используете, извините.
Конечно, если ваш круг - это объект, вы могли бы разумно сделать егоПроверь себя против всех остальных кругов, та же идея.Если у вас есть база данных кругов в SQL, протестируйте их все друг против друга.
К счастью, вы можете видеть, что это одна (1) строка кода, чтобы проверить, сталкиваются ли два круга.И это примерно 3 или 4 строки кода, чтобы проверить все ваши круги на наличие коллизий.К счастью, всего около 5 строк!
Итак, это невероятно простое руководство по физике видеоигр, часть 1.1.1.1 !!!!Надеюсь, поможет!Если это не то, чего вы пытались достичь, это была полная трата текста!:)
Для записи вот процедура для получения расстояния между двумя CGPoints:
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,Обратите внимание, что приведенный выше код является полностью допустимым. Просто вставьте его вверху файла. Хорошо? Это похоже на использование любой обычной функции, предоставляемой Apple, такой как, например, x = CGLayerGetContext (). Наслаждайтесь!)
Позже .. и по многочисленным просьбам, для объекта, Круг ...
-(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;
}