私はプレーヤーによって制御される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を設定することで変更(コードは少し...複雑なので、実際に確認されていません)。誰かが私にヒントを与えることができれば?
ありがとうございました!
SKActionにも同じ問題があります。いくつかのテストに基づいて、アクション時間が短すぎると衝突しません(私はupdate()timeIntervalをアクション期間として使用しました)。私の場合の問題は、update()で呼び出されるmove関数です。私がkeyDown()で直接呼び出すと、衝突はうまくいきます。しかし、そこにあるイベントでは、高い移動速度を設定すると、衝突が再び失敗し始めます。簡単に言えば、物理学(力、衝動など)を使って物理学の本体を移動させる – Heyfara
実際には、すべての手動の位置の変化は、何らかの形で物理システムに干渉します。 1つまたは3つの他に固執することは常に最良の選択肢ですが、それはルールではありません。それでも複数の方法で同時にノードの位置に影響を与えないようにする必要がある場合は、 – Whirlwind
ええ - 脳の障害。私は私の答えを編集します。 –