準(zhǔn)備開個(gè)系列文章了袁,一步一個(gè)腳印把學(xué)習(xí)SpriteKit 小游戲開發(fā)的點(diǎn)滴記錄下來掏缎。廢話不多說,我們開始吧。
初步入門系列都是參考該github执赡,感謝網(wǎng)友分享
目標(biāo)
- 顯示 "你好甚亭!"文案圖標(biāo)
- 點(diǎn)擊屏幕對(duì)文案做一個(gè)放大漸變消失的動(dòng)畫膊夹,同時(shí)改變背景色
- 場(chǎng)景切換
簡(jiǎn)單介紹
-
可以通過點(diǎn)擊xcode里面help菜單层释,打開dev documentation來查看,如下圖所示
正文
核心代碼如下笑陈,注意查看注釋
import SpriteKit
class HelloScene: SKScene {
override func didMove(to view: SKView) {
backgroundColor = .orange
scaleMode = .aspectFit
// 將精靈添加到場(chǎng)景里
addChild(createLabelSprite())
}
func createLabelSprite() -> SKLabelNode {
let lbHello = SKLabelNode(fontNamed: "Chalkduster")
lbHello.text = "你好际度!"
lbHello.name = "LabelNode"
lbHello.fontSize = 48
// position設(shè)置很重要,若不設(shè)置 系統(tǒng)會(huì)默認(rèn)設(shè)置成(0, 0),也就是左下角涵妥,無(wú)法正常顯示
lbHello.position = view?.center ?? .zero
return lbHello
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// 通過name獲取某個(gè)子節(jié)點(diǎn)乖菱,可選綁定處理下,保證node不為空的情況下妹笆,做后續(xù)的處理
let node = childNode(withName: "LabelNode")
if let helloNode = node {
// 防止點(diǎn)擊事件重復(fù)觸發(fā)
helloNode.name = ""
let moveUp = SKAction.moveBy(x: 0, y: 100, duration: 0.5)
let zoom = SKAction.scaleX(to: 2, duration: 0.25)
let pause = SKAction.wait(forDuration: 0.5)
let fade = SKAction.fadeOut(withDuration: 0.5)
let remove = SKAction.removeFromParent()
let actionSeq = SKAction.sequence([moveUp, zoom, pause, fade, remove])
helloNode.run(actionSeq) {
// 執(zhí)行完以上動(dòng)畫之后块请,轉(zhuǎn)到ShipScene場(chǎng)景
let shipScene = ShipScene(size: self.size)
let transition = SKTransition.doorsOpenHorizontal(withDuration: 2)
// 呈現(xiàn)shipScene場(chǎng)景后,當(dāng)前HelloScene場(chǎng)景會(huì)被銷毀
self.view?.presentScene(shipScene, transition: transition)
}
let bgColorChange = SKAction.colorize(with: .purple, colorBlendFactor: 1, duration: 2)
run(bgColorChange)
}
}
}
敲完代碼運(yùn)行拳缠,發(fā)現(xiàn)是這樣的,是的文字變形了贸弥。問題出在哪呢窟坐?
細(xì)心的你肯定發(fā)現(xiàn)了,問題就出在如下這句代碼,將scaleX
改成scale
即可哲鸳。
let zoom = SKAction.scaleX(to: 2, duration: 0.25)
最終效果
很簡(jiǎn)單的一個(gè)例子臣疑,最終呈現(xiàn)的效果如下: