2017-02-21 8 views
0

私は、落下するオブジェクトの上に置いて左右に動かしながら、プラットフォームをコントロールするゲームを作ろうとしています。しかし、プラットフォームは、その上に落ちるアイテムとは独立して動くようです。たとえば、ブロックが自分のプラットフォームの上にある場合、プラットフォームを左右に動かすと、ブロックはそのままのままで、プラットフォームだけがブロックの下を移動します。これは、ブロックがプラットフォームと一緒に動いていないので、何も積み重ねることが不可能になります。私はバランスをシミュレートするために使用する必要があるSpriteKitの物理プロパティを確認できません。私はブロックがプラットフォームに衝突するときの跳ね返りと、それがブロックをプラットフォームに「固執する」のに役立つかどうかを見るための摩擦特性を取り戻そうとしましたが、どちらも役に立たないようです。タイプゲームの積み重ねとバランスをとるために必要なSpriteKitの物理プロパティ

私のプラットフォームは、動的ではありませんでしたので、私は

助けるようだ
platform.physicsBody!.isDynamic = true 
platform.physicsBody!.affectedByGravity = false 
platform.physicsBody!.allowsRotation = false 

を設定しようとしましたか?プラットフォームはまだ私が持っていないブロックと衝突するときに動き回る。

EDIT:

これは私がプラットフォームを動かしてる方法です。ユーザーは指でドラッグしてプラットフォームの親を移動します。これはプラットフォームの親を動かすので、プラットフォームも一緒に移動します。

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
       let location = touch.locationInNode(self) 
       platformParent.position.x = location.x 
     } 
    } 
+0

これを試してみてください - 落下するブロックが最終的に確定した後、そのプラットフォームの子にします。その後、プラットフォームと共に移動する必要がありますが、それでも他のブロックがその上に落ちるような影響を受けます。代わりに、プラットフォーム上に置かれたときに「固まっている」場合は、SKPhysicsジョイントを使用してその場所に固定します。 –

答えて

0

プラットフォームを動的にする必要があります。そのため、解決する必要があるのはどのように配置するかです。あなたのユースケースに応じて、正しいものに多くのオプションがあります。これらを見てみてください:

  • は、位置制約を作成:SKConstraint.positionY
  • は、プラットフォームと固体基準オブジェクトとの間の摺動ジョイントを作成する:SKPhysicsJointSliding
  • は劇的に落下物にプラットフォームの相対的な量を増加させます
  • 各フレームを手動で(質量が比較的静止している場合に役立ちます)、またはスプリングジョイントのようなものを使用してプラットフォームの位置を修正してください。
0

摩擦は、ブロックがプラットフォームまたは他のブロック(積み重ねられたとき)から滑り落ちるのを防ぎます。物理的ボディの係数プロパティがゼロでない場合、通常の力が存在する場合(この場合、F =質量x重さ)、少なくとも1つのボディが力で移動されるか、 。 moveToまたはmoveByアクションでプラットフォームまたはブロックを移動すると、摩擦は機能しません。以下は、SpriteKitで摩擦を使用する方法の実装例です。

enter image description here

まず、世界の重力プロパティを設定します。これはデフォルトの設定です。

physicsWorld.gravity = CGVector(dx:0, dy:-9.8) 

次に、プラットフォームの摩擦係数を設定します。ブロックごとに同じ操作を行います。

platform.physicsBody?.friction = 1.0 

ブロックの質量プロパティを設定して重量を制限します。

block.physicsBody?.mass = 0.0001 

プラットフォームがブロックの重さから垂直に移動しないようにするためのプラットフォームの制約。

let range = SKRange(constantValue: -self.size.height * 0.45) 
let constraint = SKConstraint.positionY(range) 

platform.constraints = [constraint] 

最後に、物理学を使用して、プラットフォームの端から端までを移動:

var moveTo:CGPoint? 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let point = touch.location(in:self) 
     moveTo = point 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let point = touch.location(in:self) 
     moveTo = point 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    moveTo = nil 
    platform.physicsBody?.velocity = CGVector.zero 
} 

override func update(_ currentTime: TimeInterval) { 
    if let moveTo = moveTo { 
     let dx = moveTo.x - platform.position.x 
     let vector = CGVector(dx: 2*dx, dy: 0) 
     platform.physicsBody?.velocity = vector 
    } 
} 
+0

範囲の制約を理解しているかどうかわかりませんが、負の数なので範囲が画面外になることはありませんか?また、私のプラットフォームのアンカーポイントは一定のY値にとどまっているようですが、ブロックがヒットしたときにはまだ傾斜しています(アンカーポイントを中心に回転します)。最後に、私のプラットフォームは親の子であり、touchesMovedのx位置を変更することで親を移動させます。したがって、プラットフォームも一緒に移動します。これは動作しますか?遅い応答に申し訳ありません、そしてそのような詳細な答えに感謝します。 – Brejuro

+0

私はプラットフォームをどのように動かすかで私の質問を編集しました。 – Brejuro

+0

Xcode 8では、デフォルトシーンのアンカーポイントがビューの中心になるため、シーンの上半分は正、下半分は負です。プラットフォームが回転しないようにするには、 'platform.physicsBody?.allowsRotation = false'を設定します。また、 'x'の位置を直接変更してプラットフォームを動かすと、プラットフォームはシーン内の他のボディと正しく相互作用しません。身体に力を加えるか、身体の速度プロパティを設定して、プラットフォームを動かす必要があります。 – 0x141E

関連する問題