gpt4 book ai didi

ios - Spritekit 和 Swift 3 - 碰撞后改变球头速度

转载 作者:可可西里 更新时间:2023-11-01 02:13:51 25 4
gpt4 key购买 nike

我使用 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 碰撞时,我需要将球速加倍。据我了解,当您将脉冲应用于球时,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,可能将速度减半,等等。

关于ios - Spritekit 和 Swift 3 - 碰撞后改变球头速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39855456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com