Создайте классическую игру-змейку в SwiftUI без сетки

Перечисление и переменные

Мы собираемся определять направление движения и заставлять змею постоянно двигаться в этом направлении, пока направление не изменится. Давайте сначала создадим перечисление для направлений:

У нас будет таймер, чтобы контролировать скорость змеи. Чтобы сделать змею медленнее или быстрее, мы можем изменить интервалы таймера. Вместо сетки используется размер змейки. Это поможет нам контролировать положение змеи и ее пищи. В нашей игре нам потребуются следующие переменные:

Элементы представления змейки

Внутри нашего тела добавьте ZStack. Внутри вы можете добавить цвет для своего фона. Нам понадобится еще ZStack для нашего прямоугольника змейки и прямоугольника еды. Чтобы создать тело змеи, мы собираемся перебрать массив, содержащий положение тела змеи. Задайте обоим прямоугольникам ширину и высоту нашей переменной snakeSize. Последний элемент внутри нашего представления - это текстовое представление, которое появляется при включении нашей переменной gameOver:

Функции

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

К одному из наших ZStacks мы можем добавить .onAppear, чтобы установить позицию для нашей змейки и еды, используя функцию, которую мы создали выше:

Создайте функцию, которая проверяет, находится ли змея внутри или за пределами границ экрана, проверяет направление движения пользователя, а затем перемещает змею в этом направлении:

Мы можем определить, в каком направлении пользователь смахнул, с помощью следующего кода, который использует DragGesture для получения начальной и конечной позиции смахивания, а затем вычисляет разницу между координатами x и y для определения направления смахивания. Добавьте следующую функцию к нашему первому ZStack:

Все, что нам нужно добавить к нашему ZStack, чтобы завершить игру, - это .onReceieve функция, которая берет наш таймер и обновляет положение змейки и еды. Когда змея окажется на корме, добавьте новую позицию к нашему массиву положений тела змеи, чтобы змея стала длиннее:

Все сделано! Спасибо за прочтение.