Вторая попытка обновить демоверсию 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 и превратить его в простую игру.
А пока скачайте полный код для этой статьи здесь.