1

在我的游戏中,我有 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")
            }

如何在不改变速度的情况下改变球反弹时的角度?

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

4

3 回答 3

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))
            }
于 2015-03-04T17:36:10.830 回答
1

Ray Wenderlich 的 Breakout 教程有一些有用的想法。首先,意识到如果球太水平,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   
}

当然,数字必须根据您的球的特性进行调整。

于 2017-04-09T18:45:57.353 回答
0

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

yourBody.zRotation = yournewAngle
于 2015-03-04T14:21:42.677 回答