在SpriteKit(swift)中改变方向而不是速度

时间:2015-03-04 14:12:41

标签: iphone swift sprite-kit skphysicsbody skphysicscontact

在我的游戏中,我有2个精灵,一个球和一个球拍。我试图限制反射角度,这样它就不会碰到水平。我正在使用此代码检查联系角度:

            var impactX = contact.contactNormal.dx
            var impactY = contact.contactNormal.dy

            var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
            var angleCon = Double(radiansCon * 180) / M_PI
            //println("Bounce Angle:\(angleCon)")

            if(angleCon < 60 && angleCon > 0) {
                println("Adjust angle Positive")
            } else if (angleCon > -60 && angleCon < 0) {
                println("Adjust angle Negative")
            }

如果球在没有改变速度的情况下反弹,我该如何改变角度?

(我是精灵套件的新手,所以如果我遗漏任何细节请告诉我)

3 个答案:

答案 0 :(得分:1)

可能不是最好的方法,但它现在有效:

            var impactX = contact.contactNormal.dx
            var impactY = contact.contactNormal.dy

            var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
            var angleCon = Double(radiansCon * 180) / M_PI
            if(angleCon < 60 && angleCon > 0) {
                var newX = CGFloat(0.5)
                var newY = CGFloat(0.85)
                self.ball.body.applyImpulse(CGVectorMake(newX, newY))
            } else if (angleCon > -60 && angleCon < 0) {
                var newX = CGFloat(-0.5)
                var newY = CGFloat(0.85)
                self.ball.body.applyImpulse(CGVectorMake(newX, newY))
            }

答案 1 :(得分:1)

Ray Wenderlich的突围教程有一些有用的想法。首先,要意识到如果球太水平,dx速度已经发生变化 - 它太低了。在这种情况下,在x方向上轻轻一点。如果dy速度太低也是如此 - 现在它从一侧到另一侧弹跳而没有到达任何地方,所以在y方向上给它一个轻推。最后,检查球的整体速度 - 如果它太高,请将其减速。这个例子是在didBegin方法中调整球从桨叶反弹时调整的:

// Get the absolute value of dx and dy
let dxSpeed = fabs(CGFloat((ball.physicsBody?.velocity.dx)!))
let dySpeed = fabs(CGFloat((ball.physicsBody?.velocity.dy)!))

let speed = sqrt(dxSpeed + dySpeed)

if dxSpeed <= 250.0 {
    ball.physicsBody?.applyImpulse(CGVector(dx: -20.0, dy: 0.0))
}

if dySpeed <= 250.0 {
    ball.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 20.0))
}

if speed > maxSpeed {
    ball.physicsBody?.linearDamping = 0.1
} else {
    ball.physicsBody?.linearDamping = 0.0   
}

当然,这些数字必须根据球的特征进行调整。

答案 2 :(得分:0)

您可以使用精灵的zRotation属性并设置一个新角度:

yourBody.zRotation = yournewAngle