【发布时间】:2016-10-04 14:51:21
【问题描述】:
我使用 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)
}
}
谢谢
【问题讨论】:
-
物理体上的速度加倍
-
这行得通吗?就像声明一个变量在碰撞时保持当前球速,然后简单地将其乘以 2?
-
你为什么要持有它
-
我认为这是将速度加倍的方法。如果我错了,请纠正我
-
如果 CGVector 不允许标量乘法,你可以重载 * 运算符:
func *= (inout vector: CGVector, scalar:CGFloat) { vector = vector * scalar }
标签: ios swift xcode sprite-kit skspritenode