Физика SpriteKit в Swift - мяч скользит по стене вместо отражения

Я создавал свою очень простую тестовую игру, основанную на Breakout, во время изучения SpriteKit (с использованием iOS Games by Tutorials от Ray Wenderlich и др.), Чтобы посмотреть, смогу ли я применить концепции, которые я изучил. Я решил упростить свой код, используя файл .sks для создания узлов спрайтов и заменив мою ручную проверку границ и столкновение с физическими телами.

Тем не менее, мой мяч продолжает идти параллельно стенам / другим прямоугольникам (например, просто скользя вверх и вниз по ним) каждый раз, когда сталкивается с ними под крутым углом. Вот соответствующий код - я переместил физические свойства тела в код, чтобы сделать их более заметными:

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
}

Забыл упомянуть об этом раньше, но я добавил простую функцию touchesBegan для отладки отскоков - она ​​просто регулирует скорость, чтобы направить мяч в точку касания:

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)
}

Функция normalized () просто уменьшает дельту положения шара / касания до единичного вектора, и существует переопределение оператора минус, которое позволяет вычитать CGPoint.

Столкновение шара с краемдолжен всегда отражать мяч под точно противоположным углом но по какой-то причине, кажется, мяч действительно имеет правильные углы. Конечно, я могу применить обходной путь, чтобы вручную отразить угол мяча, но суть в том, что я хочу сделать все это, используя встроенную физическую функциональность в SpriteKit. Есть ли что-то очевидное, чего мне не хватает?

Ответы на вопрос(4)

Ваш ответ на вопрос