【问题标题】:Spritekit & Swift 3 - Change ball node speed after collisionSpritekit 和 Swift 3 - 碰撞后改变球头速度
【发布时间】: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


【解决方案1】:

在 SpriteKit 游戏循环中有许多“udpate”风格的函数,您可以将代码放入其中。

你可以让你的物理行为像往常一样,让它做它的事情。

然后,在以后的更新中,在物理完成之后 - 例如。 didSimulatePhysics() 在系统计算完所有物理后立即调用,对球的速度进行所需的修改。

在 didSimulatePhysics 中,您可以使用一些标志来查看刚刚发生的事件。在刚刚击中球目标 1 的情况下,您现在可以将球的速度加倍,这将在球被渲染之前计算出来。

如果球击中目标 2,则可能将速度减半,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多