Мини-игра FlappyBird, реализованная на Swift

По мере того как Apple всё глубже продвигает Swift, Swift стал очень быстро набирать популярность. Более того, лаконичный и удобный синтаксис Swift и его мощные возможности делают так, что разработчикам, использующим Objective-C для разработки под iOS, также необходимо понимать и изучать Swift. В этой статье мы пропускаем сухой синтаксис Swift и сразу начинаем использовать Swift в небольшом игровом проекте. Основные выводы обобщены ниже:

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

Сначала мне нужно определить два макроса: один для имитации ускорения свободного падения G, а другой для удобного получения размера экрана устройства. Поскольку эта игра очень простая и на её разработку уходит всего несколько часов, нам нужно писать код только в одном файле: viewController.swift.

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

//用常量的形式代理OC中的宏定义
let G:Float=9.8
let SCREEN_SIZE = UIScreen.mainScreen().bounds

Нам нужно определить несколько переменных-членов, как показано ниже:

class ViewController: UIViewController {
    var timer:NSTimer?//背景移动的定时器
    var i:Int=0//背景移动的速度
    var timer2:NSTimer?//柱子和地面移动的定时器
    var timer3:NSTimer?//小鸟移动的定时器
    var bird:UIImageView?
    var t:Float=0.0//小鸟下落的速度
    var isDowm:Bool=false//标记小鸟是否在下落
    var isGameOver:Bool=false//标记是否游戏结束
}

В интернете есть много материалов о понимании ? и !. Проще говоря, при объявлении переменной, если она не инициализирована, система не присвоит переменной nil и выдаст ошибку. Роль ? заключается в том, чтобы сообщить системе, что если здесь она не инициализирована, то она равна nil. Аналогично, при использовании таких переменных также нужно добавить ? для разворачивания. Если добавить !, это принудительное разворачивание, которое можно понимать как заставить систему считать, что эта переменная определённо не nil.

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

Код для управления падением птицы выглядит следующим образом. Следует отметить: в Swift отсутствует понятие неявного преобразования. Например, если вы хотите использовать int a + float b, необходимо вручную преобразовать int в float: (Float)(a) + b

func birdMove(){
        if !isDowm{
            if bird?.frame.origin.y < SCREEN_SIZE.height-100{
                var rant:CGRect=bird!.frame
                rant.origin.y += (CGFloat)(G*(t*t/2))
                bird?.frame=rant
                t+=0.025
            }
        }else{
            if t<0.24{
                var rant = bird?.frame
                rant?.origin.y -= 4.9-(CGFloat)(G*t*t/2)
                bird?.frame=rant!
                t+=0.025
            }else{
                isDowm=false
            }
        }
    }

Скриншот игрового эффекта выглядит следующим образом:


Я считаю, что практика — необходимый путь к обучению. Надеюсь прогрессировать вместе с единомышленниками.

Адрес проекта на GitHub:https://github.com/ZYHshao/swiftFlappyBird

Дополнительное чтение

Вводный учебник по Swift:http://www.w3cschool.cc/w3cnote/apple-swift.html