2017-03-07 3 views
1

私はプレーヤーによって制御されるSKShapeNodeを持っています。私はこのノードを親ノードの内部に保持したい。私はエッジを作成し、SKPhysicsBodyと衝突ビットマスクを使用して、自分のノードが親の外に移動するのを防ぎます。プレーヤー制御ノードが衝突を無視する

各フレームの位置を更新してノードを移動しようとすると、エッジを無視するだけです。ここで使用される関数は次のとおりです。

func move(direction: MoveDirection, withTimeInterval timeInterval: TimeInterval) { 

    var x, y: CGFloat 

    switch direction { 
    case .North: 
     x = 0 
     y = movementSpeed * CGFloat(timeInterval) 

    case .South: 
     x = 0 
     y = -movementSpeed * CGFloat(timeInterval) 

    case .East: 
     x = movementSpeed * CGFloat(timeInterval) 
     y = 0 

    case .West: 
     x = -movementSpeed * CGFloat(timeInterval) 
     y = 0 
    } 

    let sprite = spriteComponent.sprite 
    sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

} 

移動は素晴らしい作品が、ノードはどこにでも行くことができるとちょうど(私はので、私はそれらを見ることができる上skView.showPhysicsを有効)エッジを気にしません。

しかし、私はラインを交換する場合:

sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

によって:

sprite.physicsBody?.applyForce(CGVector(dx: x, dy: y)) 

衝突はうまく動作します。

私たちが衝突させたい場合、物理を使ってオブジェクトを動かさなければならないように感じます。しかし、私はAppleの文書でこの制限について何も見ていませんでした。それでこの動作は期待されていますか?それとも私は何かが恋しい?

ボーナスポイント:アップルが提供するTaskBotゲームで

、プレイヤーの位置がある(またはらしい)node.positionを設定することで変更(コードは少し...複雑なので、実際に確認されていません)。誰かが私にヒントを与えることができれば?

ありがとうございました!

答えて

1

手動SKSpriteNodeを移動する場合は、「何があってそこにこのノードを入れていない」と言って、物理エンジンをオーバーライドしているので、何の衝突はありません。

あなたは物理エンジンが確実に衝突を生成したい場合は、力や衝動を経由して、あなたのオブジェクトを移動するだけで物理エンジンを使用する必要があります。

手動でノードを衝突を生成する位置に移動すると、物理エンジンはノードを移動しようとしますが、ノードを移動しようとすると結果が予測できなくなります。

+0

SKActionにも同じ問題があります。いくつかのテストに基づいて、アクション時間が短すぎると衝突しません(私はupdate()timeIntervalをアクション期間として使用しました)。私の場合の問題は、update()で呼び出されるmove関数です。私がkeyDown()で直接呼び出すと、衝突はうまくいきます。しかし、そこにあるイベントでは、高い移動速度を設定すると、衝突が再び失敗し始めます。簡単に言えば、物理学(力、衝動など)を使って物理学の本体を移動させる – Heyfara

+0

実際には、すべての手動の​​位置の変化は、何らかの形で物理システムに干渉します。 1つまたは3つの他に固執することは常に最良の選択肢ですが、それはルールではありません。それでも複数の方法で同時にノードの位置に影響を与えないようにする必要がある場合は、 – Whirlwind

+0

ええ - 脳の障害。私は私の答えを編集します。 –

関連する問題