iOS游戲開發(fā)筆記之Actions(一)

最近開始學習Raywenderlich的 2D Apple Games by Tutorials 2.0,在第三章接觸到了SpriteKit里的動作類SKAction,通過這個類可以非常方便的實現(xiàn)一些簡單的動作,目前實現(xiàn)了6個簡單的動作:
**? Move actions **
**? Sequence actions **
**? Wait-for-duration actions **
**? Run-block actions **
**? Reversing actions **
? Repeating actions
在開始之前,首先定義一個SKSpriteNode對象:

let enemy =SKSpriteNode(imageNamed:"enemy")
enemy.position=CGPoint(x:size.width+ enemy.size.width/2, y:size.height/2) //設置對象的位置
addChild(enemy)

第一個是最基礎的移動,分為兩種移動方法:
? moveTo(x:duration:) and moveTo(y:duration:)
? moveBy(x:y:duration:)
區(qū)別是:moveTo是將對象移動到x,y的坐標位置;而moveBy是在當前對象坐標的基礎上對橫坐標和縱坐標分別移動x和y個單位,以下兩行代碼實現(xiàn)了一模一樣的功能:
moveTo:

let actionMove = SKAction.move(to: CGPoint(x: -enemy.size.width/2,y: enemy.position.y), duration: 5.0)

moveBy:

let actionMove =SKAction.moveBy(x: -size.width/2- enemy.size.width/2,y:playableRect.height/2- enemy.size.height/2, duration:1.0)

都是將對象從屏幕的中間最下面移動到屏幕左側的中間;

第二個是集成一系列動作:
動作1:

let actionMidMove =SKAction.moveBy(x: -size.width/2- enemy.size.width/2,y: -playableRect.height/2+ enemy.size.height/2, duration:2.0)

動作2:

let actionMove =SKAction.moveBy(x: -size.width/2- enemy.size.width/2,y:playableRect.height/2- enemy.size.height/2, duration:1.0)

集成:

let sequence =SKAction.sequence([actionMidMove,actionMove])

讓動作動起來:

enemy.run(sequence)

第三個是暫停動作:

let wait =SKAction.wait(forDuration:1)//停留1秒

需要注意的是要讓暫停動作“動起來”,所以將wait加入sequence,第一個動作和第二個動作之間將暫停1秒鐘

let sequence =SKAction.sequence([actionMidMove,wait,actionMove])

第四個是對動作的一個封裝:

let logMessage =SKAction.run() {//用打印舉例,可以自定義更多動作
print("XXXX")
}

可以將更多功能封裝到logMessage中,以print示例

第五個是反方向動作:
需要注意的是,SKAction中提供的反向函數(shù)只對moveBy定義的動作有效!
先定義一個動作:

let actionMove =SKAction.moveBy(x: -size.width/2- enemy.size.width/2,y:playableRect.height/2- enemy.size.height/2, duration:1.0)

反向動作:

let reverseMove = actionMove.reversed()

需要注意:當我們用集成動作集成反向動作時,最好不要這樣寫:

let sequence = SKAction.sequence([ actionMove, reverseMove ])

有多個動作時會出錯,應該這樣:

let halfSequence = SKAction.sequence([actionMove]) 
let sequence = SKAction.sequence( [halfSequence, halfSequence.reversed()])

第六個是重復動作:
這個比較簡單,需要定義一個重復的動作,然后把需要重復的動作加入:

let repeatAction = SKAction.repeatForever(sequence) 
enemy.run(repeatAction)

之前的enemy.run(sequence)就可以刪掉了。

以上就是我對這6個動作方法做的一個簡單的學習總結,如果在之后的學習中發(fā)現(xiàn)有哪些地方寫錯了,我會在以后的博文中修改。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容