鵝廠程式猿:使用Swift+SpriteKit編寫2048

edithfang發表於2014-07-05

作者:cyan 騰訊 TEG 移動應用部工程師

6 月 3 日,蘋果 WWDC14 大會召開後,鵝廠的程式猿們不能淡定了。接連出現各種討論蘋果新動向的帖子,這不,一位程式猿 GG 本著心動不如行動的態度,埋頭用 Swift 和 SpriteKit 寫了 2048 的程式,被 QGQM 們稱讚“深圳速度”和“碉堡了”。
不懂程式碼的小編,此次僅扮演大自然的搬運工的角色,純屬複製貼上,只為了讓程式猿們好好欣賞程式碼之美。

WWDC2014 上最讓開發者興奮不已的就是新公開的 4000 個 API 和 Swift 程式語言了吧。有了他們我們可以在蘋果提供的生態系統中更方便的做更多事情,碼農做應該做第一個吃螃蟹的人,去擁抱變化,所以我在 swift 釋出後興奮不已,夜不能寐的把他過了一遍。

對待一門新技術我的流程是:

1) 把它大體上瀏覽一遍;
2) 用它做一個簡單東西取悅一下自己;
3) 深入到他的一些細節裡面;
4) 做更多複雜的東西。

最後效果是這個樣子的:


這篇文章不會去講一些 Swift 的語法細節,只是大概提到一下 Swift 一些另類的地方以及如何把 Swift 跟原有的 CocoaTouch 框架結合起來開發一個新紀元的 iOS app。關於語法的介紹在蘋果開發者網站上是非常詳細的,請參考這本 The Swift Programming Languange,也可以看一些網上的翻譯教程。然後在開發者觀望找到一些如何把 Swift 和 CocoaTouch 結合起來的的 sample code,就可以開工了。

首先用 Xcode6 新建一個 Game 專案,語言選 Swift:


注意這裡選 SpriteKit,SceneKit 是一個全新的框架,他和 Metal 融合起來,是 OpenGL 之外的另一個選擇。

然後在入口 controller 刪除多餘的程式碼(示例程式碼是一個 3D 的方塊),載入主遊戲場景。


大體流程是:

MainScene 是主遊戲場景,實現了介面佈局和手勢操作的響應。
Chessboard 封裝了對棋盤上發生的事情,例如移動以及合併。
ChessNode 封裝了棋子的特徵,以及一些動畫效果。

所以流程分幾步走:

1、在 MainScene 實現佈局,這一點幾乎和之前 oc 的版本完全一樣。

objc 版本


Swift 版本



從這裡可以看到 objc 和 swift 的一些區別,中括號語法全部變成了點語法,從語法層面上看,你能看到 JavaScript/Python/Java 的一些影子,這個見仁見智。之前的一些框架已經被完全的用 swift 重寫了(從這一點還是可以看出蘋果的誠意的)。

有 objc 經驗的開發者能猜到如何從 objc 轉換到 swift 上來,對於熟悉 script 型別語言的開發者也可以很快的上手,可以完全不用 objc 寫出 iOS/Mac 應用,但熟悉 Cocoa 框架是不可避免的。

但值得一提的是 Xcode6 目前的狀況非常糟糕,程式碼提示能力很堪憂,所以有些介面只能追蹤到各個 swift 類裡面去看,這一點如果蘋果不解決是非常可怕的。

2、接下來我們就用類似的方法實現了 ChessNode 裡面的全部邏輯。

objc 版本在上一個帖子看(小編注:點選文章最後的“閱讀原文”即可檢視前一篇文章)

Swift 版本


3、下面實現 Chessboard 裡面關於手勢的操作,只是提到和之前那個專案截然不同的一點,那就是棋子儲存結構變了。

以我目前的瞭解來看,swift 似乎沒有陣列的支援,集合類 array 的底層實現不得而知,不過我猜它可能是鏈式結構實現的,因為當緯度是 2 的時候檢索起來已經有壓力了,所以我覺得他應該不是可以隨機訪問的(不能O(1))。

這裡做了一個改動就是把每個棋子起一個名字再放到棋盤中,取的時候用名字拿出來,雖然不及之前那種實現來的方便,不過也不是特別麻煩。

要獲得第i行第j列的棋子的時候從父節點裡面拿到:

處理棋子的邏輯在此:


自此,objc 版本完全移植到了 swift,swift 之旅第一站到此結束。

總結:Swift 是一個很值得嚐鮮的東西,他有很多語法糖,或者說短期內他就是 objc 的一個語法糖。現在學習他確實是一個比較合適的契機,也許很多 web 開發者也是這麼想的。他並不完善,可以看到有很多東西他還是不能完全的在自己的體系內完成,即便他把整個 CocoaTouch 都做了一次重新封裝。在可預見的短期內會掀起一個學習的熱潮,會成為其他平臺開發者瞭解蘋果的一個機會。長期內是否會打敗 objc 其實要看蘋果的熱情,如果蘋果推動他就成功,否則就是曇花一現,objc 不也是一樣的情況麼?不過我覺得蘋果做這麼一件事情不會是玩玩而已,具體情況就拭目以待吧,反正多學點東西也並不吃虧。

本文轉載自:djt.qq.com
相關閱讀
評論(0)

相關文章