2016-08-24 5 views
0

私は最初のiOSアプリケーションを作成しようとしていて、現在問題が発生しています。SKSpriteKit衝突後に一定の速度を維持する

私の試合では、ボールがバウンスすると、同じ高さと速度で跳ね返りたいと思います。現在、それだけで問題ありません。しかし、六角形を回転させて角度をつけると、速度が失われ、同じ高さに跳ね返ることはありません。

私の質問は次のとおりです。衝突時にボールが同じ速度を維持するようにするにはどうすればよいですか?

はここに私のボールノードのためのコードです:

func createBallNode(ballColor: String) -> SKSpriteNode { 
    let ball = SKSpriteNode(imageNamed: ballColor) 
    ball.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+30) 
    ball.zPosition = 1 

    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2) 
    ball.physicsBody?.affectedByGravity = true 
    ball.physicsBody?.restitution = 1 
    ball.physicsBody?.linearDamping = 0 
    ball.physicsBody?.friction = 0 

    ball.physicsBody?.categoryBitMask = ColliderType.Ball.rawValue 
    ball.physicsBody?.contactTestBitMask = ColliderType.Rect.rawValue 
    ball.physicsBody?.collisionBitMask = ColliderType.Rect.rawValue 

    let centerX = ball.position.x 
    let range = SKRange(lowerLimit: centerX, upperLimit: centerX) 

    let constraint = SKConstraint.positionX(range) 
    ball.constraints = [constraint] 

    return ball 
} 

以下は、ビジュアル形式で問題を説明するGIFです: enter image description here

答えて

1

問題があるボールは角度で衝突した場合に、その全速度は新しい速度ベクトルの垂直成分と水平成分との間で分割される。あなたがボールの水平位置の動きを制限したので、水平方向の速度が失われ、ボールが高く飛び跳ねることはありません。

可能な解決策の1つは、シーンのdidSimulatePhysicsをオーバーライドし、ボールの速度が目的の高さに達するのに十分でないかどうかを確認することです。そうでない場合は、速度を上げてください。

let neededVelocity = sqrt(2 * physicsWorld.gravity.dy * (intendedHeight - ball.posiiton.y)) 
if ball.physicsBody.velocity.dy < neededVelocity && ball.physicsBody.velocity.dy > 0 { 
    ball.physicsBody.velocity = CGVector(dx: 0, dy: neededVelocity) 
} 
+0

「intentedHeight」はどの値になりますか?だから高さが画面の真ん中になければならないのですが、どうすればいいですか? –

+0

@JimmyLeeこれはちょうど六角形の中心になります。それがシーンの中心でもある場合は、let letHeight = view.frame.midYを使用できます。 – nathan

+0

残念ながら、これは私の問題を解決するのに役立たなかった:/ –

関連する問題