昨天讓人物可以一直踩著平台往上跳躍,但是人物只要踩空就會進入一直往下掉的無限輪迴,因此我們今天要來實作遊戲失敗的判定機制
首先,我們替失敗線新增一個SKSpriteNode
let gameOverLine = SKSpriteNode(color: .red, size: CGSize(width: 700, height: 10))
並且在bitmasks的enum中加入case gameOverLine
因為接下來也要去判定人物及失敗線的接觸
所以要設定player的contactTestBitMask為
player.physicsBody?.contactTestBitMask = bitmasks.platform.rawValue | bitmasks.gameOverLine.rawValue
再來就是失敗線的一些屬性宣告,為了美觀,所以我們把失敗線的透明度設為0
gameOverLine.alpha = 0
gameOverLine.position = CGPoint(x: player.position.x, y: player.position.y - 200)
gameOverLine.zPosition = 10
gameOverLine.physicsBody = SKPhysicsBody(rectangleOf: gameOverLine.size)
gameOverLine.physicsBody?.affectedByGravity = false
gameOverLine.physicsBody?.allowsRotation = false
gameOverLine.physicsBody?.categoryBitMask = bitmasks.gameOverLine.rawValue
gameOverLine.physicsBody?.collisionBitMask = 0
gameOverLine.physicsBody?.contactTestBitMask = bitmasks.platform.rawValue | bitmasks.player.rawValue
addChild(gameOverLine)
接著我們在func update中加入下面程式碼,讓失敗線的y座標固定在人物的y座標-600
if player.physicsBody!.velocity.dy > 0{
gameOverLine.position.y = player.position.y - 600
}
還有在func didBegin中,宣告平台接觸到失敗線就被移除還有人物接觸到失敗線就判定失敗的規則
if contactA.categoryBitMask == bitmasks.platform.rawValue && contactB.categoryBitMask == bitmasks.gameOverLine.rawValue{
contactA.node?.removeFromParent()
}
if contactA.categoryBitMask == bitmasks.player.rawValue && contactB.categoryBitMask == bitmasks.gameOverLine.rawValue{
gameOver()
}
遊戲失敗的function,就是一個簡單的轉場
func gameOver(){
let gameOverScene = GameOverScene(size: self.size)
let transition = SKTransition.crossFade(withDuration: 0.5)
view?.presentScene(gameOverScene,transition: transition)
}
遊戲失敗畫面會有一個可以重來的按鈕,按了會重新回到遊戲畫面
如此一來就完成遊戲失敗的判定啦!
明天我們會來實作分數及最佳分數的功能,也順便來説説這30天來的心得吧!