簡體   English   中英

Spritekit & Swift 3 - 碰撞后改變球節點速度

[英]Spritekit & Swift 3 - Change ball node speed after collision

我使用 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)
}

}

謝謝

在 SpriteKit 游戲循環中有許多“ udpate ”樣式的函數,您可以將代碼放入其中。

你可以讓你的物理行為像往常一樣,讓它做它自己的事。

然后,在稍后的更新中,在物理完成之后 - 例如。 didSimulatePhysics() 在系統計算所有物理對球的速度進行所需的修改后立即調用。

在 didSimulatePhysics 中,您可以使用一些標志來查看剛剛發生的事件。 在剛剛擊中球目標 1 的情況下,您現在可以將球的速度加倍,這將在球被渲染之前計算。

如果球擊中目標 2,則可能將速度減半等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM