[原創]Swift+Sprite Kit中文教程第一篇

本教程適用於入門開發者,我將會告訴你如何最快開發出小遊戲,但所使用的未必是最佳方案。本教程將使用純swift+storyboard進行開發,因此最好有一點點這兩種技術的基礎。node

新建項目:

1.左側選iOS,右側選Game
2.語言Swift,技術Spritekit。swift

清理乾淨

刪除GameScene.sks文件,目前我建議使用純代碼實現。
打開GameViewController.swift,刪除extension SKNode擴展,大概十幾行,這個是用來加載sks文件的。
而後進入viewDidLoad方法,將if let scene = ...這行改成let scene = GameScene(size:CGSizeMake(1334, 750))。咱們不使用sks文件來加載場景,而是直接用GameScene類初始化了一個場景實例。segmentfault

建立精靈

進入GameScene.swift文件,幹掉didMoveToView和touchesBegan裏的全部代碼。註釋寫的比較清楚了,前者是一個view首次加載好並放到屏幕上的瞬間,會調用到的一個函數,在這裏,你能夠放全部你準備展現在玩家面前的內容(加載遊戲內容)。後者是玩家點擊屏幕的時候,會調用的一個函數(處理玩家操做)。如下簡稱load和touch
首先,在load中加入以下代碼:app

var plane = SKSpriteNode(imageNamed: "Spaceship")//能夠在Assets中找到默認飛船圖片
plane.position = CGPointMake(size.width * 0.5,size.height * 0.5)//self是指當前場景,左下角爲座標原點
addChild(plane) //添加精靈到場景中

能夠運行一下,咱們會發現屏幕中央多了一個飛機。ide

座標系相關內容請參考這裏函數

使用紋理

遊戲中會用到不少素材,若是有多個相同的精靈,能夠共用一套紋理,這樣能夠提升遊戲運行效率。
在load中,初始化plane以前,添加以下代碼:
var planeTexture = SKTexture(imageNamed: "Spaceship")
var plane = SKSpriteNode(imageNamed: "Spaceship")修改成var plane = SKSpriteNode(texture: planeTexture)
很簡單吧,這樣咱們就使用了紋理技術來建立一個精靈。spa

紋理縮放

飛機好像太大了點,咱們進入到Assets圖片集裏,選擇spaceShip,將1x裏的圖拖拽到2x裏,這樣表示圖片是支持retina2x的,在遊戲中使用時長寬會被自動縮小一半,以顯示出很是好的效果。
可是,運行一下會發現,好像飛機仍是有點大,下面咱們說一下如何縮放(你也能夠試試將圖片放在3x裏,這是6+的屏幕規格)。code

plane.xScale是橫軸縮放值
plane.yScale是縱軸縮放值
plane.setScale()同時設置橫軸縱軸

下面,在addChild調用以前,設置:plane.setScale(0.5),好了,你會發現飛機長寬被縮小了一半。orm

處理操做

咱們要開始控制飛機飛行了。由於支持多點觸摸,因此觸摸時屏幕會收到一個觸摸點集合(即便只有一個點),裏面包含每一個觸摸點的數據。不過咱們暫時只關心單點觸摸,也就是隻處理集合中的第一個點的數據。
首先,在集合中取出一個點,在touch中加入:
let location:CGPoint! = touches.first?.locationInNode(self)
這就從場景節點中取出了玩家所觸摸的位置座標,而後咱們找出這個座標所在位置的某個node,這樣就能夠判斷咱們是否點擊到了飛機。爲了方便判斷,咱們在addChild以前,設置飛機的名字爲plane,給它貼上一個標籤
plane.name = "plane"
而後,回到touch方法中,繼續在下面加入:blog

var node = self.nodeAtPoint(location)
if node.name == "plane"{
    //you choose the plane
}

而後,咱們須要兩個新的函數,touchesMove和touchesEnded,前者在觸摸並移動時觸發,後者在觸摸操做結束以後觸發。同時,須要在類裏添加一個成員屬性isTouched,類型是bool,而後在update函數中,實時修改飛機座標。最終代碼以下:

class GameScene: SKScene {
    var planeTexture = SKTexture(imageNamed: "Spaceship")//能夠在Images.xcassets中找到默認飛船圖片
    var plane:SKSpriteNode!
    var isTouched = false
    
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        plane = SKSpriteNode(texture: planeTexture)
        
        plane.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.5)//self是指當前場景,左下角爲座標原點
        plane.setScale(0.5)
        plane.name = "plane"
        self.addChild(plane)
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* Called when a touch begins */
        
        var location:CGPoint! = touches.anyObject()?.locationInNode(self)
        var node = self.nodeAtPoint(location)
        
        if node.name == "plane" {
            isTouched = true// 手指點擊到飛機
        }
        
    }
    
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if isTouched {
            var location:CGPoint! = touches.anyObject()?.locationInNode(self)
            plane.position = CGPointMake(location.x, location.y)
        }
        
    }
    
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        isTouched = false
    }
    
    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

GameViewController的viewDidLoad代碼以下:

override func viewDidLoad() {
    super.viewDidLoad()

    let scene = GameScene(size: CGSizeMake(750, 1334))
    // Configure the view.
    let skView = self.view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true
    
    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = true
    
    /* Set the scale mode to scale to fit the window */
    scene.scaleMode = .AspectFill
    
    skView.presentScene(scene)
}

如今,你能夠在模擬器裏,四處拖拽飛機進行移動了。

下一篇

相關文章
相關標籤/搜索