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

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

Как сделать игру похожей на переключатель цвета с помощью 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 учебные пособия. Надеемся, вам понравился этот урок!

Похожие

Лучшие советы и рекомендации LG V30, которые помогут вам получить больше от вашего телефона
... добавить дополнительные ярлыки приложений, помимо « Камера» и « Телефон» . Вы также можете изменить эффект прокрутки экрана или включить анимацию погоды , которая показывает дождь или снег, когда на улице погода становится плохой. Как изменить кнопки навигации Вы найдете стандартные кнопки навигации Android, приложения « Назад» , « Домой» и « Последние», которые отображаются в нижней части экрана на LG V30, но
Как заблокировать / разблокировать телефон Android с помощью голоса, используя Google Assistant
Реклама Голосовая разблокировка телефона с помощью Google Assistant - это просто! И он может многое сделать - на самом деле некоторые его функции удивительны. От проверки трафика до воспроизведения музыки и видео, помощник может сделать вашу жизнь более удобной. Еще один полезный трюк, который вы можете добавить в свой арсенал Google Assistant, - использовать его для разблокировки и блокировки телефона Android с помощью голоса. Вот как это сделать.
Ваш телефон прослушивает, и это не паранойя
Примечание. Эта статья была обновлена ​​13 июня, чтобы пояснить, что такие приложения, как Facebook, не имеют автоматического доступа к вашим данным. Пару лет назад произошло нечто странное. Мы с другом сидели в баре, айфоны в карманах, обсуждали наши недавние поездки в Японию и то, как мы хотели бы вернуться. Уже на следующий день мы оба получили всплывающую рекламу в Facebook о дешевых обратных рейсах в Токио. Казалось, просто жуткое совпадение, но потом
Модульное тестирование и TDD в Node.js - Часть 1
... как правило, метод или функцию, изолированно . Главное, что нужно помнить, это аспект изоляции . В этой статье мы начнем с написания модульных тестов для функции, которая просто принимает некоторые данные, возвращает некоторые результаты и не имеет никаких зависимостей. Затем мы рассмотрим два типа тестовых двойников, заглушек и шпионов, используя библиотеку Sinon. Наконец, мы рассмотрим, как тестировать асинхронный код в Mocha. Давайте начнем!
Создание веб-сервисов с помощью PHP и SOAP, часть 1
Как разработчики приложений, способность разрабатывать программное обеспечение и сервисы для широкого спектра платформ является необходимым навыком, но не все используют один и тот же язык или платформу, и написание кода для их поддержки неосуществимо. Если бы существовал стандарт, который позволял нам писать код один раз и позволял другим легко взаимодействовать с ним из своего программного обеспечения. Ну, к счастью, есть ... и его зовут SOAP. (Раньше SOAP был аббревиатурой, обозначающей
CryptoKitties Как потратить миллион долларов на виртуальных котов
Декабрь представили лишь несколько дней назад, но она уже успела оказаться в центре внимания цифрового мира. Продукт американо-канадской студии AxiomZen называют новейшей разработкой, связанной с криптовалюта и технологии блокчейну, пишет
Вот что такое «боке» и как iPhone 7 Plus притворяется
На этой фотографии, сделанной iPhone 7 Plus, изображены яркие «шарики боке», явный признак этого драматического эффекта в игре. Apple Без сомнения, одной из основных функций, которые Apple объявила в своих новых iPhone, являются серьезные обновления до iPhone 7 Plus 'возможности захвата изображения и видео, частично благодаря новой системе с двумя камерами. Но одно слово, которое используется для описания одной
Как системный администратор , вы можете проверить и контролировать состояние ваших систем Linux, когда они находятся под на...
Как системный администратор , вы можете проверить и контролировать состояние ваших систем Linux, когда они находятся под нагрузкой высокой нагрузки. Это может быть хорошим способом для системных администраторов и программистов: тонко настроить деятельность в системе. контролировать интерфейсы ядра операционной системы. проверить свой Аппаратные компоненты
... как анимация и другой графический контент, который постепенно прекращает активную разработку. Flash по-прежнему и...
... как анимация и другой графический контент, который постепенно прекращает активную разработку. Flash по-прежнему используется на некоторых платформах, таких как OWL, и требует его включения в большинстве браузеров, чтобы правильно отображать контент. Следующие шаги покажут вам, как включить Flash для определенного веб-сайта в каждом из основных браузеров для просмотра содержимого. Как включить Flash в Microsoft Edge: Перейдите на сайт, на котором
Как попросить участников покрыть комиссию за обработку некоммерческой карты
Элейн Пофельдт - журналист, чьи статьи о предпринимательстве и карьере были опубликованы в журналах «Fortune», «Работающая мать», «Деньги» и во многих других публикациях. Она - бывший старший редактор журнала Fortune Small Business и сама предприниматель, а также соучредитель 200kfreelancer.com, сайта для независимых профессионалов. Она пишет «Ваш бизнес кредит», еженедельную колонку о малом бизнесе и кредите, для CreditCards.com.
Как установить веб-сервер Windows на свой компьютер с XAMPP
... добавить пароль к этой учетной записи. Вы можете перейти по ссылкам, чтобы настроить безопасность вашей системы. Первая опция устанавливает корневой пароль MySQL, а вторая - пароль для всего вашего веб-каталога. Наконец, если вы планируете получить доступ к вашему серверу за пределами вашего дома, вам нужно будет войти в свой маршрутизатор и перенаправить порт 80 на локальный компьютер. Это гораздо проще сделать, если вы настроены на статический IP-адрес. Установка

Комментарии

Антивирусная программа говорила что-то о подозрительной загрузке (то есть неправильно понимает файл патча как вредоносный, потому что часть его кода выглядит как кусок вируса)?
Антивирусная программа говорила что-то о подозрительной загрузке (то есть неправильно понимает файл патча как вредоносный, потому что часть его кода выглядит как кусок вируса)? Или он настроен на то, чтобы вообще ничего не говорить и просто удалять то, что он считает опасным, сам по себе (настройка, которая является бессмысленной чепухой)? Привет, Полимахос
Но что мы можем сделать, если мечтаем о цвете?
Но что мы можем сделать, если мечтаем о цвете? С какими добавками вписать его в яркий и нейтральный интерьер? Интерьер легче всего изменить с помощью текстиля и правильно подобранных аксессуаров. Если у нас нейтральный фон, мы можем легко выполнить быструю метаморфозу. Чтобы добавить комнату цвета, достаточно достать несколько подушек, одеял, узорчатого коврика. Добавьте к этому несколько энергичных графиков и каплю цвета в виде ваз, цветных
Как это круто?
Как это круто? Помните, что вам нужно использовать правильное расширение корпоративного домена для всего, что вы делаете. Например, если мой сервер называется MyServer, а домен моей компании - Apple.com , вам необходимо пропинговать MyServer.Apple.com . Опять же, если вы не знаете этих деталей, обратитесь в свой ИТ-отдел и запросите у них веб-адрес вашего сервера OWA (Outlook Web Access). Они также могут помочь вам определить любые другие шаги,
Как ускорить ваш iPhone 7 Plus?
Как ускорить ваш iPhone 7 Plus? Ниже перечислены некоторые рекомендуемые обходные пути и полезные советы, которые помогут ускорить работу вашего iPhone 7 Plus, который замедляется из-за низкого или недостаточного объема памяти или снижения производительности. Шаг 1. Управление внутренней памятью Это хорошая практика, чтобы держать в курсе, что использует большую часть внутренней памяти вашего iPhone. Таким образом, вы можете управлять своим устройством
Так как же избежать ошибок и делать все правильно?
Так как же избежать ошибок и делать все правильно? Легко, просто следуйте этим 10 рекомендациям. Сожмите видео как можно больше Нет ничего хуже, чем посещать веб-сайт и останавливать и запускать фоновое видео, так как оно пытается буферизоваться до конца. Это отвлекает и создает ощущение, что весь сайт загружается медленно, даже если остальные уже загружены. Чтобы избежать этого, нам действительно нужно сжать видео до минимального битрейта, который, по нашему
Вы хотите удалить свою учетную запись со страниц этой социальной сети, но не знаете, как это сделать?
Вы хотите удалить свою учетную запись со страниц этой социальной сети, но не знаете, как это сделать? Не волнуйся, я здесь, чтобы помочь тебе. Если вы хотите узнать, как избавиться от ASK fm , все, что вам нужно сделать, это занять пять минут свободного времени и следовать инструкциям, которые я собираюсь дать вам. В кратчайшие сроки вы можете попрощаться со своим профилем и забыть об услуге. Вопросы, которые вы отправляли другим пользователям ASK, будут автоматически преобразованы
Как доехать до [название места]?
Как доехать до [название места]?" "Показать карту: [название места]" "Показать пробки" "Скрыть пробки" "Показать альтернативные маршруты" "Что это за дорога?" "Где следующий поворот?" "Какое время прибытия?" "Найди заправку" "Найди ресторан" "Избегай шоссе" В голосового управления телефоном еще много возможностей, кроме управления навигацией, ты можешь даже написать SMS, позвонить своим друзьям или близким. 2.
Ваша машина не используется большую часть года?
Ваша машина не используется большую часть года? И поэтому вы должны нести стоимость полной политики ответственности. Вполне возможно, что это скоро изменится из-за временного изъятия легковых автомобилей и мотоциклов. Это не означает, однако, что вам не придется платить за OC. К сожалению, этот вариант может повлиять на дальнейшее повышение страховых цен для всех водителей. Временный вывод легкового автомобиля или мотоцикла был ликвидирован 20 лет назад - в 1997 году. С тех пор, независимо
Как вы думаете, сколько это может стоить?
Как вы думаете, сколько это может стоить? Я думаю, что вряд ли кто-то догадывается, что эта 70-метровая велосипедная дорожка стоит внимания !!! 3 миллиона евро !!! Другими словами, почти 43 000 евро за 1 метр ... Давайте конвертируем это в наш злотый - евро за 4,4 злотых ... у меня отвисла челюсть (и, вероятно, не только у меня) - 190 тысяч. "Наряды" PLN / m шириной 3,5 м (приблизительно 54,300 PLN / м2). Это какой-то абсурд и космическое недоразумение. Но тогда, может быть, в Нидерландах,
Немногие генерируют большую часть трафика или оно распределено более равномерно?
Есть ли способ избежать этого типа атаки? Конечно, не будь глупым. Там нет трюков дублирования элементов Steam. Бесплатные вещи не ждут вас. Будьте осторожны и избегайте таких как чума - это может быть намного больше, чем ваша учетная запись Steam и игры, которые вы в конечном итоге проигрываете. Конечно, это не всегда может быть через другой сайт. Мошенничество с программным обеспечением может появляться в Steam с использованием взломанного аккаунта. Вы будете добавлены законной учетной
Как вы делитесь данными или манипулируете данными, не воссоздавая их?
Как вы делитесь данными или манипулируете данными, не воссоздавая их? В этом быстро меняющемся мире, в котором мы живем, речь идет о производительности и экономии времени. В результате мы обнаружили, что MindView это не просто инструмент для составления карт разума, это настоящий инструмент для повышения производительности.

Заметьте, как это в нижнем правом квадранте экрана?
Touch: установить <UITouch>, с событием: UIEvent?
PhysicsBody?
PhysicsBody?
Node как?
Node как?
Вы можете преодолеть препятствие?
Куда пойти отсюда?
Антивирусная программа говорила что-то о подозрительной загрузке (то есть неправильно понимает файл патча как вредоносный, потому что часть его кода выглядит как кусок вируса)?
Или он настроен на то, чтобы вообще ничего не говорить и просто удалять то, что он считает опасным, сам по себе (настройка, которая является бессмысленной чепухой)?