Сервис для
сео - оптимизаторов

Найди ошибки на сайте
Ошибки мешают продвижению сайта
Исправь ошибки на сайте
Сайт без ошибок продвигать легче
Получи новых клиентов
Новые клиенты принесут больше прибыль

Как сделать игру похожей на переключатель цвета с помощью SpriteKit и Swift

  1. Начиная
  2. Препятствия
  3. Ваш первый SKShapeNode
  4. Остальная часть круга
  5. Как избежать дублирования кода
  6. Вращение препятствия
  7. Добавить игрока
  8. Добавление физики
  9. Преодолевая препятствие
  10. Добавить больше препятствий
  11. Прокрутка экрана
  12. Добавить другое препятствие
  13. счет
  14. Куда пойти отсюда?

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

Например, популярная игра Цветовой переключатель (более 125 миллионов загрузок по всему миру) создает забавные и привлекательные визуальные эффекты, используя только простые формы, такие как круги, линии и квадраты, которые ярко окрашены.

В этом уроке вы создадите игру, в которой цель состоит в том, чтобы переместить цветную точку вверх по экрану и преодолеть разноцветные препятствия - подобно Color Switch. Точка может безопасно проходить через формы, которые соответствуют ее собственному цвету, но отступит к началу, если она соприкоснется с любой формой другого цвета.

Вы узнаете, как использовать:

  • SKShapeNode с пользовательскими путями,
  • SKActions и радианы для вращающихся узлов на неопределенный срок,
  • Категория и битовые маски столкновений для отслеживания взаимодействий,
  • SKCameraCode для удобного отслеживания игрока по ходу игры,
  • И больше…

Начиная

Скачать стартовый проект для этого урока. Существуют лишь незначительные изменения шаблона Xcode по умолчанию, чтобы все работало как на iPhone, так и на iPad.

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

Препятствия

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

Конечный результат будет выглядеть так

Звуковой сигнал. Bop. Boop. Звуковой сигнал.

Поскольку препятствия состоят из геометрических фигур, вы будете строить их, используя класс SpriteKit SKShapeNode. Чтобы создать собственный SKShapeNode, вы можете определить его путь . Самый простой способ определить путь - использовать класс UIBezierPath.

UIBezierPath предоставляет несколько инициализаторов для простых фигур:

  • init (rect: CGRect): создает и возвращает прямоугольник заданного размера.
  • init (ovalIn: CGRect): Создает и возвращает овал (или круг), который помещается в данный прямоугольник.
  • init (roundedRect: CGRect, cornerRadius: CGFloat): создает и возвращает прямоугольник с закругленными углами. Чем больше угловой радиус, тем более закруглены углы.

Может показаться, что init (ovalIn :) - это то, что вы хотите сделать препятствием для вашего круга, но этот метод дает вам полный круг, и вам нужно, чтобы он был разделен на четыре части. Таким образом, каждый раздел может иметь свой собственный цвет. К счастью, UIBezierPath предоставляет дополнительные методы для прорисовки общего пути.

Ваш первый SKShapeNode

Хорошей отправной точкой является создание узла для желтой секции в правом нижнем углу круга. Вы сделаете это, нарисовав контур формы.

Вы сделаете это, нарисовав контур формы

Рисование пути

В GameScene.swift добавьте следующие методы didMove (to :):

func setupPlayerAndObstacles () {addObstacle ()} func addObstacle () {addCircleObstacle ()} func addCircleObstacle () {// 1 let path = UIBezierPath () // 2 path.move (в: CGPoint (x: 0, y: -) 200)) // 3 path.addLine (to: CGPoint (x: 0, y: -160)) // 4 path.addArc (withCenter: CGPoint.zero, радиус: 160, startAngle: CGFloat (3.0 * M_PI_2), endAngle: CGFloat (0), по часовой стрелке: true) // 5 path.addLine (to: CGPoint (x: 200, y: 0)) path.addArc (withCenter: CGPoint.zero, радиус: 200, startAngle: CGFloat (0.0 ), endAngle: CGFloat (3.0 * M_PI_2), по часовой стрелке: false)}

и добавьте это в didMove (to :):

setupPlayerAndObstacles ()

С помощью этого кода вы создаете одно круговое препятствие при запуске игры. Внутри addCircleObstacle () вы:

  1. Создать и вернуть пустой путь.
  2. Вызовите move (to: CGPoint), который перемещается в заданную точку, но не рисует путь. Этот метод обычно используется для перемещения к начальной точке вашей фигуры, что вы делаете здесь.
  3. Добавьте линию от предыдущей точки к данной. Это завершает первую линию вашего пути, которая является вертикальной линией, которая начинается в нижнем левом углу фигуры.
  4. Этот метод немного глоток, но здесь вы добавляете изогнутую линию от текущей точки. Я обычно нахожу, что некоторые проб и ошибок необходимы, чтобы получить комбинацию startAngle, endAngle и по часовой стрелке, чтобы работать так, как вы хотите.
  5. Затем вы добавляете горизонтальную линию к внешнему краю круга и завершаете путь другой дугой.

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

Значения начального и конечного углов указаны в радианах . Полный круг равен 2π радиан, а значения для других основных углов показаны на диаграмме. Константы определены для нескольких общих значений углов:

  • M_PI π радиан, или 180 °
  • M_PI_2 это π / 2 радиан или 90 °
  • M_PI_4 это π / 4 радиан или 45 °

Примечание: значения для по часовой стрелке, кажется, назад, чем они должны быть. Это связано с тем, что система координат для UIBezierPath отличается от используемой в SpriteKit. UIBezierPath, наряду со всем UIKit, использует направление + y как вниз . SpriteKit и другие системы OpenGL имеют направление + y вверх .

Теперь, когда у вас есть путь, вы можете создать и отобразить SKShapeNode. Добавьте это в конец вашего метода addCircleObstacle ():

let section = SKShapeNode (path: path.cgPath) section.position = CGPoint (x: size.width / 2, y: size.height / 2) section.fillColor = .yellow section.strokeColor = .yellow addChild (section)

Инициализатор для SKShapeNode использует CGPath, но UIBezierPath сделает это преобразование за вас с помощью свойства cgPath. Вы могли бы сгенерировать CGPath напрямую, но с UIBezierPath часто проще работать. Затем вы устанавливаете положение и свойства цвета узла и добавляете его в сцену для его отображения.

Вы устанавливаете значение strokeColor в дополнение к fillColor, потому что контур обводки по умолчанию имеет тонкую белую линию, и вы не хотите, чтобы какой-либо контур на фигуре.

Создайте и запустите проект, чтобы убедиться, что все работает.

Первая часть круга

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

Посмотрите на положение этой фигуры на экране. Заметьте, как это в нижнем правом квадранте экрана? Вы могли ожидать, что эта форма будет выглядеть более центрированной.

Причина в том, что путь, который вы нарисовали в первой части этого метода, нарисован относительно центральной точки, поэтому сама фигура смещена относительно этой центральной точки. Установка положения SKShapeNode изменяет положение этой центральной точки, что позволяет перемещать фигуру.

Остальная часть круга

Вы можете добавить другие части круга, вычерчивая точки и углы, как вы делали для первого раздела, но оказывается, что есть ярлык. Центр первого SKShapeNode находится в центре экрана. Это означает, что все, что вам нужно сделать, это повернуть его на 90 °, или на π / 2 радиана, чтобы он соответствовал верхней правой четверти круга.

Это означает, что все, что вам нужно сделать, это повернуть его на 90 °, или на π / 2 радиана, чтобы он соответствовал верхней правой четверти круга

Вращение желтой секции дает вам красную секцию.

Добавьте следующее в конец addCircleObstacle () в GameScene.swift :

let section2 = SKShapeNode (путь: путь.cgPath) section2.position = CGPoint (x: size.width / 2, y: size.height / 2) section2.fillColor = .red section2.strokeColor = .red section2.zRotation = CGFloat (M_PI_2); AddChild (раздел2)

У вас уже есть построенный путь, так что вам просто нужен другой SKShapeNode с другим цветом, повернутым путем изменения свойства zRotation.

Создайте и запустите проект, чтобы проверить ваш прогресс. Ты на полпути!

Ты на полпути

Woo! Наполовину.

Как избежать дублирования кода

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

Сначала добавьте свойство вверху GameScene.swift внутри класса, но перед методом didMove (to :):

let colors = [SKColor.yellow, SKColor.red, SKColor.blue, SKColor.purple]

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

Затем добавьте новый метод после закрывающей скобки addCircleObstacle ():

func препятствиеByDuplicatingPath (_ path: UIBezierPath, по часовой стрелке: Bool) -> SKNode {let container = SKNode () var вращениеFactor = CGFloat (M_PI_2), если! по часовой стрелке {вращениеFactor * = -1} для i в 0 ... 3 {разрешить секцию = SKShapeNode (path: path.cgPath) section.fillColor = colors [i] section.strokeColor = colors [i] section.zRotation = вращениеFactor * CGFloat (i); container.addChild (section)} возвратный контейнер}

Этот метод использует цикл for для повторения создания SKShapeNode четыре раза, каждый раз поворачиваясь на 90 °. Каждый из различных разделов добавляется в пустой контейнерный узел; таким образом, вы сможете выполнять действия с контейнером, и он будет действовать на все дочерние узлы одновременно.

Теперь очистите addCircleObstacle () с помощью этой новой функции. Это должно выглядеть так:

func addCircleObstacle () {let path = UIBezierPath () path.move (to: CGPoint (x: 0, y: -200)) path.addLine (to: CGPoint (x: 0, y: -160)) path.addArc (withCenter: CGPoint.zero, радиус: 160, startAngle: CGFloat (3.0 * M_PI_2), endAngle: CGFloat (0), по часовой стрелке: true) path.addLine (to: CGPoint (x: 200, y: 0)) путь. addArc (withCenter: CGPoint.zero, радиус: 200, startAngle: CGFloat (0.0), endAngle: CGFloat (3.0 * M_PI_2), по часовой стрелке: ложно), чтобы препятствие = препятствиеByDuplicatingPath (путь, по часовой стрелке: верно) препятствие.положение = CGPoint (x : size.width / 2, y: size.height / 2) addChild (препятствие)}

tactcleByDuplicatingPath (_: по часовой стрелке) возвращает узел контейнера, содержащий четыре раздела препятствия. Затем препятствие располагается в центре экрана и добавляется к сцене.

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

Создайте и запустите проект, чтобы увидеть завершенный круг.

Мы прошли полный круг.

Вращение препятствия

SKActions - очень распространенный и мощный способ перемещения и анимации узлов в SpriteKit. Добавьте это в конец addCircleObstacle ()

let rotateAction = SKAction.rotate (byAngle: 2.0 * CGFloat (M_PI), длительность: 8.0) tactcle.run (SKAction.repeatForever (rotateAction))

Убедитесь, что вы используете метод rotate (byAngle: duration), а не rotate (toAngle: duration). Первый поворачивает узел на заданный угол независимо от текущей ориентации. Вторая вращается, пока угол не совпадает с заданным углом, затем останавливается. Вы вращаете узел на 2π, что является полным вращением. Повторение этого действия заставляет узел вращаться непрерывно.

Более короткая продолжительность заставит круг вращаться быстрее, но будьте осторожны, так как это сделает игру более сложной.

Создайте и запустите проект, чтобы проверить вращение.

Создайте и запустите проект, чтобы проверить вращение

Рок-н-ролл!

Добавить игрока

Это не большая игра без игрока, так что это хороший следующий шаг. Добавьте это свойство в начало GameScene.swift сразу после цветов:

let player = SKShapeNode (circleOfRadius: 40)

Затем добавьте следующий метод после setupPlayerAndObstacles ():

func addPlayer () {player.fillColor = .blue player.strokeColor = player.fillColor player.position = CGPoint (x: size.width / 2, y: 200) addChild (player)}

Наконец, добавьте строку для вызова нового метода в начале setupPlayerAndObstacles ()

addPlayer ()

Постройте и запустите, чтобы увидеть новый узел игрока. Затем пришло время заставить его двигаться.

Затем пришло время заставить его двигаться

Просто отдыхаю.

Добавление физики

Движение игрока в этой игре состоит из двух частей. При нажатии на экран игрок движется вверх и падает вниз из-за силы тяжести между нажатиями. Вы добавите эти части сейчас.

Во-первых, добавьте эту структуру в начало GameScene.swift над свойствами:

struct PhysicsCategory {static let Player: UInt32 = 1 static let Препятствие: UInt32 = 2 static let Edge: UInt32 = 4}

И добавьте следующий код в конец didMove (to :):

let playerBody = SKPhysicsBody (circleOfRadius: 30) playerBody.mass = 1.5 playerBody.categoryBitMask = PhysicsCategory.Player playerBody.collisionBitMask = 4 player.physicsBody = playerBody let ledge = SKNode () ledge.position = CGPoint (х , y: 160) let ledgeBody = SKPhysicsBody (rectangleOf: CGSize (ширина: 200, высота: 10)) ledgeBody.isDynamic = false ledgeBody.categoryBitMask = PhysicsCategory.Edge ledge.physicsBody = ledgeBody addChild (ledge)

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

CollisionBitMask определяет, какие объекты являются твердыми для игрока. Узел игрока должен столкнуться с выступом, чтобы игрок не упал с нижней части экрана. Вы не хотите, чтобы игрок сталкивался с препятствием, так как он должен иметь возможность пройти сквозь неповрежденный, если цвета совпадают.

Вы устанавливаете для свойства isDynamic выступа значение false, чтобы сделать его статическим объектом, чтобы он не двигался из-за силы тяжести или при столкновении с ним игрока.

Затем добавьте этот метод в GameScene.swift :

переопределить func touchesBegan (_ touch: установить <UITouch>, с событием: UIEvent?) {player.physicsBody? .velocity.dy = 800.0}

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

Физические тела уже имеют гравитацию по умолчанию, но текущее значение немного слабое для этого объекта и игрового процесса. Сделайте его сильнее, добавив эту строку внизу didMove (to :):

PhysicsWorld.gravity.dy = -22

Для того, чтобы заставить ваши игры чувствовать себя и работать правильно, требуется некоторая проба и ошибка.

Постройте и запустите проект. Попробуйте переместить узел игрока по экрану.

Попробуйте переместить узел игрока по экрану

Wheeeee!

Преодолевая препятствие

Игровой узел случайно проходит через узел препятствий. Вы хотите, чтобы игрок прошел, только если его цвет соответствует разделу препятствия, которое он пересекает. Это другой тип взаимодействия, чем столкновения, которые SpriteKit называет контактными .

Чтобы сделать эту работу, вам сначала нужно добавить физические тела к секциям круга. Добавьте следующее в раздел цикла for ofclecleByDuplicatingPath (_: по часовой стрелке) непосредственно перед строкой container.addChild (section):

let sectionBody = SKPhysicsBody (polygonFrom: path.cgPath) sectionBody.categoryBitMask = PhysicsCategory.Obstacle sectionBody.collisionBitMask = 0 sectionBody.contactTestBitMask = PhysicsCategory.Player sectionBody.afferedByBph

Это создает физическое тело с той же формой, что и у узла сечения, с повторным использованием того же пути. CategoryBitMask определяет это как объект другого типа от других физических тел в игре. Значение collisionBitMask, равное 0, означает, что это тело не должно сталкиваться с другими телами, поскольку вы хотите, чтобы игрок мог проходить через него.

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

Основной новой частью здесь является contactTestBitMask, в котором говорится, что вы хотите получать уведомления, когда объект с категорией PhysicsCategory.Player находится в контакте с этим разделом препятствия. SpriteKit позволяет вам установить делегата, который будет получать эти уведомления.

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

func dieAndRestart () {print ("boom") player.physicsBody? .velocity.dy = 0 player.removeFromParent () // TODO: удалить препятствия setupPlayerAndObstacles ()}

Это просто сбросит скорость игрока, удалит его со сцены и воссоздаст игровые объекты. Вы добавите больше позже.

Затем добавьте следующее расширение, чтобы GameScene соответствовал протоколу SKPhysicsContactDelegate, в самом низу GameScene.swift , вне закрывающей скобки для класса:

расширение GameScene: SKPhysicsContactDelegate {func didBegin (_ contact: SKPhysicsContact) {если пусть nodeA = contact.bodyA.node как? SKShapeNode, пусть nodeB = contact.bodyB.node как? SKShapeNode {if nodeA.fillColor! = NodeB.fillColor {dieAndRestart ()}}}}

Наконец, добавьте эту строку в конец didMove (для :)

PhysicsWorld.contactDelegate = self

Поскольку вы устанавливаете GameScene в качестве contactDelegate of PhysicsWorld, didBegin (_ :) будет вызываться всякий раз, когда узел игрока перекрывает один из участков препятствий. Строка if let проверяет, чтобы убедиться, что оба физических тела имеют прикрепленный SKShapeNode. Затем вы проверяете fillColor двух узлов. Если цвета не совпадают, вы удаляете игрока и возвращаете его в исходное положение.

Сборка и запуск и дать ему шанс. Вы можете преодолеть препятствие?

Обратите внимание, что при возобновлении игры круговое препятствие не удаляется, а новое накладывается сверху. Вы скоро это исправите.

Соответствующие цвета проходят через

Добавить больше препятствий

Пришло время добавить еще несколько препятствий. Есть несколько изменений, необходимых для этого. Добавьте еще два свойства в начало GameScene.swift :

Вар препятствий: [SKNode] = [] пусть препятствиеSpacing: CGFloat = 800

Обратите внимание, что массив не содержит SKShapeNodes; вместо этого он содержит SKNodes, так как они являются узлами контейнера для препятствий.

Затем найдите строку в addCircleObstacle (), которая устанавливает позицию узла препятствий, и замените ее на:

препятствия.append (препятствие) препятствие.положение = CGPoint (x: size.width / 2, y: препятствиеSpacing * CGFloat (препятствий.count))

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

Текущие препятствия должны быть удалены после смерти игрока, поэтому замените строку // TODO: Удалить препятствия в dieAndRestart () на:

для узла в препятствиях {node.removeFromParent ()} tactcles.removeAll ()

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

Наконец, добавьте это в конец setupPlayerAndObstacles ():

addObstacle () addObstacle ()

Теперь должно быть три вызова addObstacle (). Постройте и запустите проект. Несмотря на то, что есть три препятствия, вы можете увидеть только два из них на экране. Регулировка вида по мере продвижения игрока вверх по экрану - ваша следующая задача.

Круги для всех!

Прокрутка экрана

SpriteKit предоставляет встроенное решение для прокрутки сцены, которое не помещается на одном экране - SKCameraNode. Устанавливая положение камеры, другие узлы сцены перемещаются автоматически. Добавьте свойство в начало GameScene.swift :

let cameraNode = SKCameraNode ()

Затем добавьте это в конец didMove (to :):

addChild (cameraNode) camera = cameraNode cameraNode.position = CGPoint (x: size.width / 2, y: size.height / 2)

Это создает экземпляр SKCameraNode, размещает его в центре экрана и устанавливает его как свойство камеры для сцены. Теперь изменение положения камеры будет перемещать все остальное в противоположном направлении. Чтобы реально отрегулировать положение камеры, вам необходимо периодически проверять положение игрока. Добавьте следующий метод после touchesBegan (_: with):

переопределить функцию func update (_ currentTime: TimeInterval) {if player.position.y> препятствиеSpacing * CGFloat (tactcles.count - 2) {print ("score") // TODO: обновить счет addObstacle ()} (player.position, from: self) if playerPositionInCamera.y> 0 &&! cameraNode.hasActions () {cameraNode.position.y = player.position.y} if playerPositionInCamera.y <-size.height / 2 {dieAndRestart () }}

SpriteKit вызывает update (_ :) каждого фрейма игры, поэтому это хорошее место для размещения кода, который должен постоянно проверяться на наличие определенных условий. В этом случае есть три вещи, которые вы ищете.

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

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

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

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

Чтобы перезагрузить камеру, добавьте следующую строку в конец dieAndRestart ():

cameraNode.position = CGPoint (x: size.width / 2, y: size.height / 2)

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

Прокрутка камеры.

Добавить другое препятствие

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

Добавьте новый метод в GameScene.swift ниже addCircleObstacle ():

func addSquareObstacle () {let path = UIBezierPath (округленныйRect: CGRect (x: -200, y: -200, ширина: 400, высота: 40), cornerRadius: 20) пусть препятствие = препятствиеByDuplicatingPath (путь, по часовой стрелке: ложь) препятствия. append (препятствие) препятствие.position = CGPoint (x: size.width / 2, y: препятствиеSpacing * CGFloat (препятствий.count)) addChild (препятствие) let rotateAction = SKAction.rotate (byAngle: -2.0 * CGFloat (M_PI), Продолжительность: 7.0) препятствие.run (SKAction.repeatForever (rotateAction))}

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

Затем замените addObstacle () следующим:

func addObstacle () {let choice = Int (arc4random_uniform (2)) переключение выбора {case 0: addCircleObstacle () case 1: addSquareObstacle () default: print ("что-то пошло не так")}}

Здесь вы генерируете случайное целое число, равное 0 или 1, и используете этот результат, чтобы решить, какое препятствие построить.

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

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

Не только все круги больше.

счет

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

let scoreLabel = SKLabelNode () var score = 0

Затем установите метку в конце didMove (to :):

ScoreLabel.position = CGPoint (x: -350, y: -900) ScoreLabel.fontColor = .white ScoreLabel.fontSize = 150 ScoreLabel.text = Строка (оценка) cameraNode.addChild (scoreLabel)

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

Затем замените строку оценки // TODO: Update в обновлении (_ :) на:

оценка + = 1 оценкаLabel.text = строка (оценка)

Наконец, добавьте следующее в конец dieAndRestart ():

счет = 0 счетLabel.text = строка (оценка)

Используя эти фрагменты кода, вы обновляете счет каждый раз, когда игрок преодолевает препятствие, и сбрасываете его до 0, когда игрок умирает.

Постройте и запустите, чтобы увидеть новый счетчик очков.

Постройте и запустите, чтобы увидеть новый счетчик очков

Я уверен, что вы можете победить это ...

Куда пойти отсюда?

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

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

Есть также много различных препятствий, которые вы можете добавить, такие как круги внутри кругов или знаки плюс. Будьте изобретательны - и если вы создаете новое препятствие, опубликуйте скриншот на форуме. Я хотел бы видеть это!

Для больше на SpriteKit, проверьте 2D Apple Games от учебников книга или некоторые другие наши Apple Game Frameworks учебные пособия. Надеемся, вам понравился этот урок!

Заметьте, как это в нижнем правом квадранте экрана?
Touch: установить <UITouch>, с событием: UIEvent?
PhysicsBody?
PhysicsBody?
Node как?
Node как?
Вы можете преодолеть препятствие?
Куда пойти отсюда?