我正在处理我的第一个 SpriteKit 项目,但在使碰撞起作用时遇到了问题。对象只是相互穿过。我认为只需要设置类别、碰撞和接触位掩码就可以了。我像这样定义我的两个对象:
final class Paddle: SKShapeNode {
init(isLeft: Bool) {
super.init()
...
path = CGPath(rect: rect, transform: nil)
let body = SKPhysicsBody(rectangleOf: rect.size)
body.category(.paddle, collidesWith: .ball, isDynamic: false)
physicsBody = body
}
}
final class Ball: SKShapeNode {
override init() {
super.init()
...
let rect = CGRect(x: 0, y: 0, width: radius * 2, height: radius * 2)
path = CGPath(ellipseIn: rect, transform: nil)
let body = SKPhysicsBody(circleOfRadius: radius)
body.category(.ball, collidesWith: .paddle)
body.linearDamping = 0
body.angularDamping = 0
body.restitution = 1.0
physicsBody = body
}
}
然后我添加了一个辅助扩展来设置常见的物理体属性:
extension SKPhysicsBody {
func category(_ category: ShapeType, collidesWith: ShapeType, isDynamic: Bool = true) {
categoryBitMask = category.rawValue
collisionBitMask = collidesWith.rawValue
contactTestBitMask = collidesWith.rawValue
fieldBitMask = 0
allowsRotation = false
affectedByGravity = false
friction = 0
restitution = 0
self.isDynamic = isDynamic
}
}