Физика 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. Есть ли что-то очевидное, чего мне не хватает?