2016-08-14 6 views
4

私は、ボールを水平方向や他の角度ではなく、&に跳ね返させたいiOSアプリケーションを作成しています。残念なことに、私がゲームをデザインすることに決めた方法は、いくつかの問題を引き起こしました。基本的にはSKSpriteKitを使用して、ボールを垂直にのみ跳ね返し、水平には跳ねない方法はありますか?

enter image description here

:ここでは一種の私の問題が何であるかを示しGIFがある私は五角形を回転させるためにクリックしたときに私はそれがアップとダウンしたいとき、時々、それは角度でボールを打ちます。ここで

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

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

    ball.physicsBody = SKPhysicsBody(circleOfRadius: 25) 
    ball.physicsBody?.affectedByGravity = true 
    ball.physicsBody?.restitution = 0.99 
    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 

    return ball 
} 

がありますとにかく私はいつも特定の行(垂直)に移動するようにボールをデザインすることができますか?誰にでもボールのデザイン提案や多分それを動かす方法がありますか(SKActions、例:gravityを使うのではなくmoveTo)。

私に知らせてください。ありがとう!

+0

ノードのx座標を 'positionX'' SKConstraint'で制限することができます。 [リンク](https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKConstraint_Ref/#//apple_ref/occ/clm/SKConstraint/positionX :) – 0x141E

+0

@ 0x141Eどうすればそれは私のシナリオのための機能ですか?私はそれを正しく得ることができません.... –

答えて

2

ノードのx座標を固定値に制限するには、最小値と最大値を同じ値に設定してSKRangeを定義します。範囲から

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

、あなたは上記のことを追加した場合、ノードのconstraints配列

ball.constraints = [constraint] 

に制約を追加。これは、既存のコードで動作するはずです、positionX制約

let constraint = SKConstraint.positionX(range) 

最後を定義しますreturn ballステートメント

+0

これはうまくいきました。ありがとうございました! –

2

ボールが不規則に跳ねます。なぜなら、あなたが五角形の辺を動かすと、ボールは少し小さな辺に触れ、その軌跡を変えるからです。それは重力が働く方法です。

あなたは、ボールあなたの方法をバウンスこのようSKAction Sを使用する場合:

let up = SKAction.moveBy(CGVector(dx: 0, dy: 40), duration: 0.3) 
    let down = SKAction.moveBy(CGVector(dx: 0, dy: -40), duration: 0.3) 
    let upAndDown = SKAction.sequence([up, down]) 
    let foreverUpDown = SKAction.repeatActionForever(upAndDown) 

をそして、ちょうどボールにrunActionを呼び出します。

+0

ええ、確かに現実的な物理シミュレーションの必要はありません。明らかに傷つけることさえあります。しかし、接触検知はまだ必要です(SKActionsでうまく動作し、これらの2つを組み合わせて使用​​する正当な方法です)。 – Whirlwind

+0

私の現在のコードのどの部分をこれに置き換える必要がありますか?すべての中間の "物理学物"のもの? –

+0

@JimmyLeeボールを上下に動かすには、このアクションを適用する必要があります。 collisionBitMaskを0に設定する必要があります。次に、contactTestBitマスクを定義して、許可されていない連絡先を検出する必要があります。以上です。 – Whirlwind

関連する問題