Вторая попытка обновить демоверсию Apple SceneKit

На прошлой неделе я опубликовал статью о перестроении демонстрации Apple SceneKit WWDC 2017 с использованием SwiftUI. Бумага, которую вы можете найти здесь.

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

Обратите внимание, что код не будет работать на симуляторе. Вам нужно будет использовать реальное устройство, в идеале iPad.

Вся демонстрация работает в значительной степени так же, как когда Apple показала ее на WWDC2017, хотя я пропустил код SpriteKit. Это и тот факт, что теперь он использует элементы управления на основе SwiftUI. Присоединяйтесь ко мне сегодня, чтобы работать над дополнительными обновлениями и некоторыми обновлениями.

План

Когда я копнул глубже, я обнаружил, что foxy2 изначально называлась красной пандой, по крайней мере, это название модели — и, ну, в 2015 году они сделали отличное демо с использованием красной панды. Я планирую позаимствовать врага и идею, что вам нужно Соберите волшебные жемчужины из указанной демонстрации.
Я также хочу исправить некоторые предупреждения, которые я получил в foxy2, и удалить шаблон делегата, который я использовал, из микса, поскольку я подозреваю, что он мне не нужен.

Список желаний

Бон. Вот более точный список, учитывая, что я не хочу изобретать велосипед, если это вообще возможно. Если у вас есть какие-либо мысли о том, что еще я мог бы сделать, пожалуйста, добавьте их в комментарии в конце.

  • Я хочу, чтобы там было больше врагов, охраняющих тюрьму. Я буду использовать существующие модели и ту, что использовалась в демо-версии foxy1.
  • Я также хочу добавить волшебные жемчужины от foxy1, собирая жемчужины, которые придают вам больше жизненной силы.
  • Я хочу добавить индикатор жизни; на данный момент можно без последствий бегать по лавовым полям; Мне нужен индикатор, чтобы если вы слишком много сделаете, вы не сможете пройти игру, жизненная сила.
  • На этой же ноте я хочу, чтобы на индикатор жизни влияли враги, чтобы они подходили слишком близко, и вы теряли жизненную силу.
  • Мне нужно сообщение об окончании игры, когда вы отпускаете своих коллег и у вас кончаются сердца.
  • Я хочу ввести таймер, так что чем быстрее вы выполните задание, тем выше будет ваш результат.
  • Разговоры, баллы, автономный показ лучших результатов было бы неплохо! Презентация, которую я буду использовать для управления SwiftUI, так как я уверен, что это будет проще, чем фреймворк GamePlayKit.

Новые враги и жемчуг

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

Работает достаточно хорошо, но за то, что если фокси подойдет ближе, то оба врага сольются. Поскольку я использовал тот же компонент GameKit для поведения третьего врага, что и для второго, они оба тоже взрываются, если вы убиваете любого из них. Оба поведения нуждаются в исправлении.

Чтобы обойти это поведение/результат, я создал второй компонент погони, продублировав первый. Решение, которое решило мою проблему, связанную с тем, что оба врага уничтожаются, если я атакую ​​любого из них.
Однако — поскольку код по-прежнему идентичен, оба врага оказываются друг над другом, если я задерживаюсь слишком долго.
Я думал, что я попытаюсь использовать поведение бегства вместе с преследователем, но его правильное выполнение стало выглядеть как третий проект, поэтому я прибегнул к изменению переменных преследования для третьего врага, что в значительной степени устранило проблему.

Ресурсы Foxy1

Я скачал демонстрационный код foxy1, исправил несколько простых побед и запустил его — он тоже выглядит хорошо. Затем я проверил ресурсы и позаимствовал как врага, так и жемчуг. Я скопировал файлы *.scn и текстуры, используя редактор Xcode, чтобы сопоставить их заново.

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

И добавил этот код в метод collect в файле GameController.

Бон — достаточно сказано — время для предварительного просмотра, возможно. Вот видео WWDC SceneKit 2017 года, которое вы никогда раньше не видели.

В видео я начинаю с подбора одной жемчужины. Я вышел прямо в начале игры, а затем спустился на площадку. Камера находится в режиме отладки, поэтому не следит за мной. На арене статус вращающегося пламени — это второй элемент, который я взял из презентации WWDC 2015. Кроме того, я пересекаю лаву и освобождаю трех лисиц.

Изменения интерфейса SwiftUI

Конечно, SF Symbols дает идеальное изображение, необходимое мне для жизненной силы, сердце которой я решил дать игроку 16 с помощью этого кода.

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

Затем я настроил подписку на базе Combine, чтобы управлять ими с помощью простого PassthroughSubject, который будет отправлять «true», когда вы собираете жемчужину, и «false», когда вы бежите по лаве или не сражаетесь с охранниками. Ценности, дающие вам больше или меньше сердец.

Меня также не устроил крестовина, которую вы можете видеть из первого видео. Я изо всех сил пытался работать, переместив кнопки на верхний край — я попробовал несколько идей, но остановился на кнопке перехода вперед вместо простого вертикального прыжка. Я также разместил атаку / вращение под той же кнопкой.

Следующим в моем списке желаний был таймер; это было легко реализовано с помощью простого таймера в SwiftUI.

Выглядит хорошо; Конечно, его нужно доработать, но теперь можно идти. Итак, вот видео, показывающее окончательную сборку. Конечно, есть еще кое-что в списке пожеланий и, может быть, несколько в вашем.

На видео вы видите, как я собираю четыре жемчужины, убиваю двух роботов и спасаю трех своих коллег из тюрьмы; потеряв сердце или два, слишком много пропуская лаву.

Заключение

К сожалению, в коде есть проблема со звуком; насколько я могу судить, это выглядит правильно? Но это не работает. Кроме того, это выглядит хорошо; Надеюсь, вы согласны.

На этой ноте я закончу эту статью. Скажите мне в комментариях, если вы думаете, что я должен вернуться к foxy1 и обновить его ресурсами foxy2 и превратить его в простую игру.

А пока скачайте полный код для этой статьи здесь.