SwiftUI, SpriteKit и отсутствующий жест касания

SpriteKit существует уже почти десять лет, выходит на WWDC 2013, пересматривается в 2014, 2016, 2017 и 2019 годах и даже упоминается на WWDC 2020.

Это платформа Apple для создания 2D-игр. Это простой в использовании и очень хороший способ научить молодых программистов своему ремеслу. Поищите во всех ваших любимых источниках документы, в которых рассказывается, как это реализовать. Большинство статей, которые вы найдете, сосредоточены либо на основах (как Фелисити Джонсон в этой статье), либо на полной (например, Дилан Шайн собрал a супер-впечатляющее руководство по созданию игры).

Это обе отличные статьи, и я тоже хочу создать игру, но я хочу взглянуть на это больше с точки зрения Артури Джалли. Это не игра, но демонстрирует, как использовать SpriteKit вместе со SwiftUI.

Вернемся в 2019 год, когда Apple проговорилась, что теперь вы можете добавить SKScene в интерфейс SwiftUI. Вы делаете это с помощью этих бессмертных строк:

GameScene, упомянутый в этом коде, создается с помощью следующего:

Я считаю, что этот фрагмент кода взят из одного из пресс-релизов Apple, в котором описываются новые функции. Он показывает черный квадрат, на котором вы создаете спрайты с помощью касания. Когда вы используете свое прикосновение, они падают на землю. Это что-то вроде игры, но подождите. Прочтите этот абзац еще раз.

Это звонило в колокол? Некоторое время назад я написал статью об использовании перетаскивания для имитации отсутствующего жеста в арсенале SwiftUI - touch.



Он работает хорошо - у вас есть что-то вроде touch, и вам нужно только двигать пальцем достаточно, чтобы он зарегистрировался. Это нормально, но мы можем сделать это по-другому. Мне хотелось сказать лучше, но есть одна оговорка, о которой я упомяну позже.

Используя SpriteKit в SwiftUI, вы получаете настоящий touch жест. Давайте посмотрим, как можно реализовать touch в SwiftUI с помощью SpriteKit. Мы сделаем это, создав простую игру.

Кодер

Я хочу реализовать игру, которая была у меня на первом калькуляторе. Это была ранняя версия Space Invaders. Это работало так, что у вас был простой дисплей, на котором будут отображаться числа, и, как и они, вам нужно было нажать на указанное число, чтобы оно исчезло. Это работало так:

Все девять полей - это экземпляры SceneKit, внутри которых у вас SKLabelNode. Коробки раскладываются с использованием LazyHGrid в SwiftUI. Я смотрю, видит ли экран событие touch внутри каждого SceneKit объекта.

Когда происходит касание, он меняет фон на моем SpriteView на красный. Когда прикосновение заканчивается, он становится черным. Белые круги просто нарисованы в SwiftUI поверх SpriteKit Views.

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

Если вам удастся заставить все числа исчезнуть, то время, необходимое для увеличения строки, сократится вдвое, и вам придется выполнять работу в два раза быстрее. Если число достигает десяти цифр, игра окончена.

Вам необходимо отобразить таймер, а также используемую задержку. Сделайте это, и вы сможете бросить вызов своим друзьям, чтобы увидеть, кто сможет продержаться дольше всех с самой короткой задержкой на месте. Поскольку это простая версия, вы можете нажимать цифры на клавиатуре в любом порядке. В жесткой версии вы должны вводить только крайнюю левую цифру. Вторая задача за дополнительную плату.

Сейчас здесь непросто увидеть, но понять, что происходит. Хотя на первый взгляд может показаться, что мы используем tap, это не так. Мы используем touch.

Используя SceneKit, мы можем реализовать жест touch с помощью сборки SwiftUI, хотя есть одно предостережение, о котором я хочу упомянуть. Круги, которые я нарисовал поверх кнопок, фактически блокируют touch жесты. Я могу обойтись без этого в этом примере, но вы должны помнить об этом, если думаете, что сможете использовать эту технику.

Вот код анимированного GIF / игры, который вам нужно обновить:

Заключение

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