SKFieldNode с круглой областью, затрагивающей тела, только когда центр находится внутри области
Итак, из документации SKFieldNode, под свойством region:
Узел поля применяет свой эффект ко всем физическим телам, которые частично или полностью находятся внутри его области. Значением по умолчанию является область бесконечного размера.
Из этого я понимаю, что как только часть физического тела, прикрепленного к узлу, входит в SKRegion на узле поля ("частично или полностью внутри области"), поле начинает действовать на тело.
Поэтому я начал использовать поля, но столкнулся с тем фактом, что они начинают действовать на физическое тело только тогда, когда центр тела находится внутри области, а не какой-либо части тела.
Вот код, который я написал:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
backgroundColor = SKColor.whiteColor()
self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
let field = SKFieldNode.springField()
field.position = view.center
let shape = SKShapeNode(circleOfRadius: size.height / 3)
shape.fillColor = SKColor.grayColor()
field.region = SKRegion(path: shape.path!)
field.addChild(shape)
addChild(field)
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
for touch in touches {
let location = touch.locationInNode(self)
let ball = SKShapeNode(circleOfRadius: size.height / 10)
ball.position = location
ball.strokeColor = SKColor.blackColor()
ball.physicsBody = SKPhysicsBody(circleOfRadius: size.height / 10)
let center = SKShapeNode(circleOfRadius: 1)
center.strokeColor = SKColor.blackColor()
ball.addChild(center)
self.addChild(ball)
ball.physicsBody!.applyImpulse(CGVectorMake(60, 60))
}
}
}
(Я добавил узел формы в поле, чтобы увидеть, где заканчивается его область, и добавил центр к шару, чтобы было ясно, когда он работает, поле действует только тогда, когда центр находится в области.)
Когда я запускаю его, поле начинает действовать на шары только тогда, когда их центр находится внутри региона. Мне кажется, что это не то, что должно происходить на основе документации. Я не изменил никаких свойств узла поля перед его добавлением, поэтому ожидал стандартного поведения.
Я не знаю, что я неправильно истолковываю документацию, или я должен установить какое-то другое свойство в поле, чтобы оно могло воздействовать на любое физическое тело, которое частично находится в пределах его области.
1 ответ
Обход, чтобы позволить ball
быть под влиянием field
когда они коснулись сразу, это увеличить область (радиус) field
, Что-то вроде:
field.region = SKRegion(radius: shapeRadius + ballRadius)