Работа с иерархическими эффектами в играх iOS и приложениях

Я начал работать в качестве разработчика iOS около полутора лет назад, и у меня возникли проблемы с архитектурой и организацией программного обеспечения. Я использую рекомендованную Apple парадигму Model-View-Controller, и мой код, как правило, очень иерархичен: если на экране есть (например) HUD, панель управления и область отображения, у меня есть главный контроллер для экрана и суб- контроллеры для HUD, панели управления и области отображения. Суб-контроллеры обычно не знают о своих соседних контроллерах и используют методы в основном контроллере для взаимодействия с ними.

Тем не менее, особенно в играх, я часто сталкиваюсь с проблемами, связанными с иерархией, которые просто не могут быть элегантно решены с помощью этой модели. Например, допустим, у меня есть монета в области панели управления, которую я хочу анимировать для полета в HUD. Я могу либо анимировать оригинальную монету, либо новую позицию, для которой нужен такой метод, как animateCoinToPosition: в подконтроллере панели управления и метод getPositionForFinalCoinPositionInHUD в главном контроллере; или я могу скрыть оригинальную монету и создать дублирующую монету либо в главном контроллере, либо в контроллере HUD, для чего потребуется метод делегата, такой как animateCoinToHUDFromStartingPosition :. Мне не нравятся такие странно-специфичные методы в моих контроллерах, поскольку они действительно существуют для решения одной проблемы и дополнительно раскрывают иерархию. Моим идеальным решением было бы иметь один метод под названием animateCoinToHUD, но для этого потребовалось бы сгладить всю иерархию и объединить три контроллера в один, что, очевидно, не стоит. (Или предоставление субконтроллерам доступа к их братьям и сестрам), но это будет по существу иметь такой же эффект. Субконтроллеры тогда будут иметь зависимости друг с другом, создавая единый беспорядочный контроллер паукообразных пауз вместо основного контроллера и три в основном независимых суб- контроллеры.)

И это часто становится хуже. Что делать, если я хочу отображать полноэкранную анимацию или эффект частиц при перемещении монеты? Что делать, если моя монета намного сложнее простого спрайта с множеством подзаголовков и деталей до такой степени, что создание дублирующей монеты с использованием animateCoinToHUDFromStartingPosition: неэффективно? Что делать, если монета летит к HUD, а затем возвращается к панели управления? Могу ли я «одарить» монетный вид основному контроллеру, а затем вернуть его после завершения анимации, сохранив исходное положение / z-order / etc. во временных переменных, чтобы их можно было восстановить? И еще одно: логически, код, относящийся к нескольким субконтроллерам, принадлежит основному контроллеру, но если эти взаимодействия являются общими, основной контроллер растет до тысячи строк, что я видел во многих проектах, а не только мой собственный.

Существует ли последовательный способ обработки этих эффектов и действий, которые не требуют дублирования кода или активов, не раздувают мои контроллеры и не позволяют мне обмениваться объектами между субконтроллерами? Или я использую неправильный подход полностью?

  • предупреждение: попытка представить
  • One Solution collect form web for “Работа с иерархическими эффектами в играх iOS и приложениях”

    Итак, я думаю, вы можете подумать о том, чтобы «никогда не подниматься» по иерархии слишком буквально.

    Я думаю, идея состоит в том, что вы не знаете конкретно, что такое родитель, но вы можете определить протокол и знать, что независимо от вашего родительского объекта он отвечает на указанный протокол. Вы в идеале проверяете код, чтобы подтвердить, что он отвечает на этот протокол. Затем используйте протокол для отправки сообщения общим способом, в котором вы передаете объект монеты родительскому объекту и позволяете родительскому объекту анимировать его с экрана и в HUD.

    Затем id<parent_protocol> parent; элемент id<parent_protocol> parent; экземпляр переменной и их метод инициализации принимает один из них в качестве параметра. Учитывая ваше описание, у вас уже есть что-то подобное на месте или, по крайней мере, достаточно для реализации «субконтроллеры, как правило, не знают о своих соседних контроллерах и используют методы в основном контроллере для взаимодействия с ними», как вы говорите.

    Таким образом, идея с точки зрения дизайна заключается в том, что на панели дисплея появляется пикап монетки, и все, что он знает, это то, что у родительского объекта есть метод pickupCoin: который будет делать то, что подходит с выбранной монетой. Панель дисплея не знает, что она идет на HUD или что-то еще, только что собранные монеты обрабатываются методом pickupCoin: родительским контроллером.

    Философия дизайна ООП заключается в том, что все знания родителя инкапсулированы в определение протокола. Это делает ребенка и родителя более слабо связанными, чтобы вы могли поменять местами любой родитель, который реализовал этот протокол, и дети все равно будут работать нормально.

    Есть более свободные связи, которые вы могли бы использовать (сообщают глобально размещенные уведомления), но в тех случаях, которые вы описываете, я думаю, что что-то вроде того, что я изложил, вероятно, более уместно и, вероятно, более результативным.

    это помогает?

    Interesting Posts

    Swift: изменение цвета кнопки после нажатия

    Как перемещать изображение в ячейке таблицы при прокрутке

    Могу ли я сохранить один проект в XCode, но создать его для Mac OS X, Apple Mac Store и устройств iOS?

    iOS автоматически возобновляемые подписки: потоки проверки поступления

    Исключение при извлечении пользовательских данных parse.com в iOS 8 Today Extension

    Как заставить UISearchBar в UINavigationBar изменять размер только левого поля с помощью анимации блока?

    ios 8 opengl es 1.1 прекращено?

    обнаружить форму касания на iphone или андроиде?

    Ожидается, что в окнах приложений будет контроллер корневого представления в конце запуска приложения в XCode 5

    Пользовательские проблемы с вращением камеры

    Dealloc предупреждение о представлении

    Может ли камера iPhone видеть инфракрасный свет?

    GPUImageMovieWriter frame presentationTime

    Добавьте 'addObserver' (NSNotificationCenter) в 1-й контроллер представления, обработайте второй

    iOS создает салфетки для возврата

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.