本教程適用於入門開發者,我將會告訴你如何最快開發出小遊戲,但所使用的未必是最佳方案。本教程將使用純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) }
如今,你能夠在模擬器裏,四處拖拽飛機進行移動了。