Iphone Core Animation отслеживание координат и столкновений - PullRequest
0 голосов
/ 18 мая 2009

В настоящее время я изучаю программирование для Iphone, и у меня возникли некоторые проблемы, связанные с CAKeyframeAnimation

Я использую CAKeyframeAnimation для анимации объектов на экране следующим образом:

CGPathMoveToPoint (thePath, NULL, start.x, start.y); CGPathAddLineToPoint (thePath, NULL, finish.x, finish.y); animation.path = thePath; animation.duration = animationDuration;

// Добавить группу анимации к слою [Layer addAnimation: animation forKey: @ "animate"]

Я использую эту базовую идею для перемещения своих объектов, но теперь я хотел бы иметь возможность обнаруживать столкновения между объектами.

Я думал о добавлении к каждому анимированному объекту на экране наблюдателя [анимированный addObserver: ...]

и пусть при изменении позиции вызывает метод, который проверяет текущую позицию относительно позиции всех других анимированных объектов.

проблема в том, что может быть много объектов (может быть, до 100 (оценка, но может быть и больше)), которые собираются проверить список из 10-20 объектов на предмет столкновения. поэтому я боюсь, что на каждой итерации будет много испытаний.

что бы вы мне предложили сделать?

Ответы [ 4 ]

4 голосов
/ 19 мая 2009
for(UIView *aView in arrayOfMovingObjects){

    CGRect aFrame = [(CALayer*)[aView.layer presentationLayer] frame];

    for(UIView *anotherView in arrayOfMovingObjects){

        if(aView!=anotherView){

             CGRect anotherFrame = [(CALayer*)[anotherView.layer presentationLayer] frame];

             if(CGRectIntersectsRect(aFrame, anotherFrame){

             // handle collision

             }
        }
   }
}

Я не слишком уверен в производительности с большим количеством объектов, но это будет работать. Также вам нужно обрабатывать обнаруженные коллизии, в противном случае вы будете обнаруживать каждую коллизию дважды.

3 голосов
/ 21 мая 2009

Я считаю, что CoreAnimation (CA) предназначена для анимации, которая не влияет на вашу "бизнес-логику" (или игровую логику в этом случае), а вместо этого просто радует пользователя или дает ему визуальный Обратная связь. Если вам нужно сделать больше, чем просто отменить анимацию или получить уведомление, когда это будет сделано, это сильный признак против с использованием CA.

Как указал tequilatango, обычно хорошей идеей является разделение столкновений и графики. Или даже более общий: графика обычно является односторонней дорогой для пользователя. Очень редко результаты вашего рендеринга могут влиять на другие части вашей программы.

1 голос
/ 18 мая 2009

что бы вы мне предложили сделать?

Я не думаю, что Core анимация - это правильная структура для вашего приложения. 100 спрайтов собираются расширить возможности основной анимации на iPhone, и нет способа получить требуемый тип обновлений.

1 голос
/ 18 мая 2009

Хорошее обнаружение столкновений может быть проблемой для волос. Часто рекомендуется смоделировать его независимо от графики. Я предлагаю вам ознакомиться с физическим движком с открытым исходным кодом, в который встроено обнаружение столкновений. Box2D - это популярный и хороший выбор, который имеет либеральную лицензию, подходящую для игр для iPhone.

Использование трансформаций Core Animation для игры с большим количеством движущихся анимаций может быть сложным. Фактическое положение CALayer во время анимации не отражается в его координатах, только конечная точка или начальная точка в зависимости от вашего выбора. Таким образом, для этого вам нужно создать собственную абстракцию. отредактировано: как указывает Брэд, вы можете получить позицию во время анимации из слоя представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...