title: SpriteKit physics in Swift - Ball slides against wall instead of reflecting
body: <p>I have been creating my own very simple test game based on Breakout while learning SpriteKit (using iOS Games by Tutorials by Ray Wenderlich et al.) to see if I can apply concepts that I have learned. I have decided to simplify my code by using an .sks file to create the sprite nodes and replacing my manual bounds checking and collision with physics bodies.</p>
  
  <p>However, my ball keeps running parallel to walls/other rectangles (as in, simply sliding up and down them) any time it collides with them at a steep angle. Here is the relevant code--I have moved the physics body properties into code to make them more visible:</p>
  
  <pre><code>import SpriteKit
  
  struct PhysicsCategory {
    static let None:        UInt32 = 0      //  0
    static let Edge:        UInt32 = 0b1    //  1
    static let Paddle:      UInt32 = 0b10   //  2
    static let Ball:        UInt32 = 0b100  //  4
  }
  
  var paddle: SKSpriteNode!
  var ball: SKSpriteNode!
  
  class GameScene: SKScene, SKPhysicsContactDelegate {
  
    override func didMoveToView(view: SKView) {
  
      physicsWorld.gravity = CGVector.zeroVector
  
      let edge = SKNode()
      edge.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame)
      edge.physicsBody!.usesPreciseCollisionDetection = true
      edge.physicsBody!.categoryBitMask = PhysicsCategory.Edge
      edge.physicsBody!.friction = 0
      edge.physicsBody!.restitution = 1
      edge.physicsBody!.angularDamping = 0
      edge.physicsBody!.linearDamping = 0
      edge.physicsBody!.dynamic = false
      addChild(edge)
  
      ball = childNodeWithName("ball") as SKSpriteNode
      ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size))
      ball.physicsBody!.usesPreciseCollisionDetection = true
      ball.physicsBody!.categoryBitMask = PhysicsCategory.Ball
      ball.physicsBody!.collisionBitMask = PhysicsCategory.Edge | PhysicsCategory.Paddle
      ball.physicsBody!.allowsRotation = false
      ball.physicsBody!.friction = 0
      ball.physicsBody!.restitution = 1
      ball.physicsBody!.angularDamping = 0
      ball.physicsBody!.linearDamping = 0
  
      physicsWorld.contactDelegate = self
  }
  </code></pre>
  
  <p>Forgot to mention this before, but I added a simple touchesBegan function to debug the bounces - it just adjusts the velocity to point the ball at the touch point:</p>
  
  <pre><code>override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let moveToward = touch.locationInNode(self)
    let targetVector = (moveToward - ball.position).normalized() * 300.0
    ball.physicsBody!.velocity = CGVector(point: targetVector)
  }
  </code></pre>
  
  <p>The normalized() function just reduces the ball/touch position delta to a unit vector, and there is an override of the minus operator that allows for CGPoint subtraction.</p>
  
  <p>The ball/edge collisions <strong>should always reflect the ball at a precisely opposite angle</strong> but for some reason the ball really seems to have a thing for right angles. I can of course implement some workaround to reflect the ball's angle manually, but the point is that I want to do this all using the built in physics functionality in SpriteKit. Is there something obvious that I am missing?</p>