[英]Spritekit & Swift 3 - Change ball node speed after collision
我使用 didBegin(contact) 和位掩碼來確定哪個節點與什么碰撞。 我使用 applyImpulse() 設置了我的初始球速。 我的代碼是:
let minAngle : UInt32 = 181
let maxAngle : UInt32 = 359
let randomAngle = arc4random_uniform(maxAngle - minAngle) + minAngle
let dx:CGFloat = 3 * cos(CGFloat(randomAngle))
let dy:CGFloat = 3 * sin(CGFloat(randomAngle))
ball.physicsBody?.applyImpulse(CGVector(dx: dx, dy: dy))
我的 didBegin(contact) 方法代碼是:
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
let ballNode = self.childNode(withName: ballName)
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == drainBitmask {
endGame()
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(GameScene.showLeaderboard), userInfo: nil, repeats: false)
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target1Bitmask {
score += 20
self.vc.scoreLabel.text = "Score: \(score)"
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target2Bitmask {
score += 10
self.vc.scoreLabel.text = "Score: \(score)"
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target3Bitmask {
score += 30
self.vc.scoreLabel.text = "Score: \(score)"
}
然而,當我的球與目標 1,2 或 3 碰撞時,球速必須改變。 例如,當球與目標 1 碰撞時,我需要球速加倍。 據我了解,當您將Impulse應用於球時,dx和dy值代表方向和速度,那么如何將球速度加倍,同時仍保持碰撞中發生的真實反彈效果? 僅供參考,必須加倍的速度是碰撞瞬間的球速。
編輯 - 擴展
extension CGVector {
var speed: CGFloat {
return hypot(dx, dy)
}
static func > (lhs: CGVector, rhs: CGVector) -> Bool {
return lhs.speed > rhs.speed
}
static func < (lhs: CGVector, rhs: CGVector) -> Bool {
return lhs.speed < rhs.speed
}
static func * (vector: CGVector, scalar: CGFloat) -> CGVector {
return CGVector(dx: vector.dx * scalar, dy: vector.dy * scalar)
}
}
謝謝
在 SpriteKit 游戲循環中有許多“ udpate ”樣式的函數,您可以將代碼放入其中。
你可以讓你的物理行為像往常一樣,讓它做它自己的事。
然后,在稍后的更新中,在物理完成之后 - 例如。 didSimulatePhysics() 在系統計算所有物理對球的速度進行所需的修改后立即調用。
在 didSimulatePhysics 中,您可以使用一些標志來查看剛剛發生的事件。 在剛剛擊中球目標 1 的情況下,您現在可以將球的速度加倍,這將在球被渲染之前計算。
如果球擊中目標 2,則可能將速度減半等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.