Spritekit& Swift 3 - 碰撞后更改球节点速度

时间:2016-10-04 14:51:21

标签: ios swift xcode sprite-kit skspritenode

我使用didBegin(contact)和bitmasks来确定哪个节点与什么相撞。我使用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(联系)方法代码是:

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)
}

}

由于

1 个答案:

答案 0 :(得分:1)

在SpriteKit游戏循环中有许多&#34; udpate&#34;样式函数,你可以把代码放入。

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

然后,在稍后的更新中,在物理完成之后 - 例如。 didSimulatePhysics()在系统计算完所有物理学之后立即调用球的速度。

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

如果球击中目标2,可能会使速度减半等