最近開始學習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)有哪些地方寫錯了,我會在以后的博文中修改。