Я использую didBegin (контакт) вместе с битмасками, чтобы определить, с каким узлом сталкивается что-то. Я установил свою начальную скорость шара, используя applyImpulse(). Мой код для этого:Spritekit & Swift 3 - Изменение скорости шарового узла после столкновения
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 (контакт) код метода:
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 представляют собой направление и скорость, так как я могу удвоить скорость шара, сохраняя при этом реалистичный эффект отскока, возникающий при столкновении? FYI скорость, которую необходимо удвоить, - это скорость шара в момент столкновения.
EDIT - РАСШИРЕНИЕ
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)
}
}
Благодаря
двойной скорости на теле физики – Knight0fDragon
будет работать? Как объявление переменной, удерживающей текущую скорость шара во время столкновения, а затем просто умножить ее на 2? –
Зачем вы его держите – Knight0fDragon