2017-02-07 19 views
2

私は物理ボディを持つスプライトを持っています。 このスプライトを移動するには、update()関数でスプライトの速度を150単位に設定し、-150を左に移動します。 (添付のコードを参照してください)Spritekit/Swiftの最初のスプライトの物理ボディに2番目のスプライトを合わせる

私は最初のスプライトに従いたいと思っている2番目の物理学のボディを持っています。この第2の物理学のボディの座標は、最初のものの底部にあり、右に20ポイントです。

私は2番目のフィジックスボディが常にオフセットの最初のものに従うことを望みます。

私のコードほとんどがでも動作しますが、第1のボディと第2のボディの距離がわずかに変化することに気付きました。右に動くと、それらの間の距離は少し圧縮されます。左に動くと、それらの間の距離は少し増加します。こちらのビデオをご覧ください:https://www.youtube.com/watch?v=K9FhIdMwp7kここ

は、私が使用しているコードです:

override func update(_ currentTime: TimeInterval) { 

    switch playerDirection { 
    case "stopped": 
     playerSpeed = 0.0 
    case "right": 
     playerSpeed = 150.0 
    case "left": 
     playerSpeed = -150.0 
    default: 
     print("default") 
    } 

    // ball is the first sprite and footBall is the second sprite: 

    ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

    footBall.position = CGPoint(x: (ball.position.x + 20), y: ball.position.y - (ball.size.height/2) + 4) 

    myCam.position = CGPoint(x: round(ball.position.x), y: self.size.height/2) 

...私は成功せず、()のオーバーライドFUNCのdidSimulatePhysicsを使って遊んでてきた

、また、 。

私は、ベロシティを使用してプレーヤーを移動し、代わりに直接ball.position.x(ball = player)とfootBall.position.xをインクリメントする別のテストを行いました。整列した。しかし、私がこのルートをとると、ゲームの物理が他の場所でどのように働くかを変えなければならないでしょう。無視したいのですが。

ありがとうございます。

答えて

0

私はこの問題を回避するためにSKPhysicsジョイントを使用しました。ここに私の作業コードです(この時点でのテストなので、まだちょっとずさんは、それは原則的に動作します):

//add a nice player 
    ball = SKSpriteNode(texture:spriteArray2[0]) 
    ball.size = CGSize(width: 150, height: 48) 
    //ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
    ball.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 48)) 
    ball.zPosition = 1 
    ball.physicsBody?.affectedByGravity = true 
    ball.position = CGPoint(x: 80.0, y: 200.0) 
    ball.physicsBody?.categoryBitMask = 1 
    ball.physicsBody?.collisionBitMask = UInt32(2 | 32 | 256) //2 = floors, 32 and 256= doors. 
    ball.physicsBody?.contactTestBitMask = 0 
    ball.physicsBody?.isDynamic = true 
    ball.physicsBody?.restitution = 0.0 
    ball.physicsBody?.allowsRotation = false 
    ball.physicsBody?.mass = 60.0 
    ball.physicsBody?.friction = 0.00 
    addChild(ball) 

    //add a nice ball for when jumping 
    footBall = SKSpriteNode(color: SKColor.blue, size: CGSize(width: 24, height: 16)) 
    footBall.position = ball.position 
    footBall.name = "footBall" 
    footBall.zPosition = 1 
    footBall.physicsBody = SKPhysicsBody(circleOfRadius: 4) 
    footBall.physicsBody?.affectedByGravity = false 
    footBall.physicsBody?.categoryBitMask = 16 
    footBall.physicsBody?.collisionBitMask = 2 // floors 
    footBall.physicsBody?.contactTestBitMask = UInt32(32 | 64 | 128 | 256) // the doors bear snake 
    footBall.physicsBody?.isDynamic = true 
    footBall.physicsBody?.restitution = 0.0 
    //footBall.physicsBody?.allowsRotation = false 
    //footBall.physicsBody?.mass = 60.0 
    //footBall.physicsBody?.friction = 0.00 
    addChild(footBall) 

    let myCGPoint = ball.position // sets joint position 

    let myJoint = SKPhysicsJointFixed.joint(withBodyA: ball.physicsBody!, bodyB: footBall.physicsBody!, anchor: myCGPoint) 

    scene?.physicsWorld.add(myJoint) 

...

は、私がようにプレーヤーのために速度を設定し、更新ループでダウン:必要に応じて

私の元のコードで
ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

、私の更新ループでIはまた、位置をボール(プレーヤ)と一致するサッカーの位置を調整するが、改訂されたコードでは、ジョイントされたことにより、使用するためフットボールのボールを動かす力または速度を変更するか、footBallのx位置を変更します。フットボールは乗り物のためにちょうどタッグしています。

最初、この新しいメソッドは正しく機能しませんでしたが、その理由は「footBall.physicsBody?.allowsRotation = false」がfootBallのプロパティとして指定できないという理由が試行錯誤で発見されました。しかし、この行のコメントを外すことでうまく動作します。

この演習のポイントは、ジャンプ中にプレーヤーの足が伸ばされたときのジャンプテストポイントとしてfootBallを使用することです。したがって、フットボールはメインプレイヤーの体のわずかに前方にあります。それから私はジャンプのために必要に応じてこのフットボールを動的にオンまたはオフにします。

やや関連する「フットセンサー」で、次のページは以下のとおりです。 http://gamedevwithoutacause.com/?p=1076 http://www.iforce2d.net/b2dtut/jumpability

0

2番目のノードを1番目のノードの子として追加すると、要件を満たしますか?交換し

scene.addChild(ball) 
scene.addChild(footBall) 

::それは代わりに、同じレベルの両方を有するのであり、あなたにオフセットとしてサッカーの位置を

scene.addChild(ball) 
ball.addChild(footBall) 

だけ設定が必要です。その後、任意の

footBall.position = CGPoint(x: 20, y: - (ball.size.height/2) + 4) 

ボールが移動する時間footBallも子ノードのように移動するので、footBallの手動位置更新コードを削除することができます。

+0

そういったことは、別のスプライトにスプライトを追加するための素晴らしい作品が、それは物理学の体では動作しません。私はSKPhysicsJoint https://developer.apple.com/reference/spritekit/skphysicsjointを使用して私の問題に許容可能な解決策を見つけました。しかし、私は元の投稿に可変の "圧縮/拡張"のギャップがあった理由はまだ分かりません。おそらく、私はいつかそれが起こった理由を理解するでしょう。 –

+0

ありがとうございました:) –

関連する問題