SKFieldNode с круглой областью, влияющей на тела только тогда, когда центр находится внутри области

Итак, из документации SKFieldNode в свойстве региона:

Узел поля применяет свой эффект ко всем физическим телам, частично или полностью находящимся внутри его области. Значение по умолчанию — область бесконечного размера.

Отсюда я понимаю, что как только часть физического тела, прикрепленная к узлу, войдет в 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))
        }
    }
}

(Я добавил узел формы к полю, чтобы увидеть, где заканчивается его область, и добавил центр к шару, чтобы было ясно, когда он работает, что поле действует только тогда, когда центр находится в области.)

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

Я не знаю, неправильно ли я интерпретирую документацию, или есть какое-то другое свойство, которое я должен установить для поля, чтобы оно действовало на любое физическое тело, которое частично находится в пределах его области.


person David Arteaga    schedule 23.10.2015    source источник


Ответы (1)


Обходной путь, позволяющий ball воздействовать на field при их немедленном касании, заключается в увеличении области (радиуса) field. Что-то вроде:

field.region = SKRegion(radius: shapeRadius + ballRadius)

введите здесь описание изображения

person WangYudong    schedule 24.10.2015
comment
Да, я думал об этом, но, извините, я забыл упомянуть об этом в вопросе, я буду использовать его для мячей разных размеров, а не только одного размера. - person David Arteaga; 24.10.2015