Как правильно заставить SKLabelNode следовать телу с помощью физики? - PullRequest
1 голос
/ 16 января 2020

Я создал класс, поведение которого действительно простое: каждый объект этого класса будет квадратом с именем вверху, и они будут случайным образом перемещаться по экрану.

class XSquare: SKNode {

    private var squareShape: SKSpriteNode
    private var text: SKLabelNode

    init() {
        // Sets up the square
        squareShape = SKSpriteNode(color: .red, size: CGSize(width: 100, height: 100))

        // Sets up the text
        text = SKLabelNode(text: "Here goes the name")
        text.position = CGPoint(x: 0, y: 100)

        // Calls the super initializator
        super.init()

        // Sets up the square
        squareShape.physicsBody = SKPhysicsBody(rectangleOf: squareShape.size)
        squareShape.physicsBody?.categoryBitMask = squareBitMask
        squareShape.physicsBody?.collisionBitMask = wallBitMask
        squareShape.physicsBody?.velocity = CGVector(dx: 10, dy: 10)
        squareShape.physicsBody?.angularVelocity = CGFloat(5)
        squareShape.physicsBody?.allowsRotation = true
        squareShape.physicsBody?.pinned = false
        squareShape.physicsBody?.affectedByGravity = false

        addChild(squareShape)
        addChild(text)
    }
}

Причина, по которой я использовал SKNode для этого класса, потому что я хотел предоставить небольшой текст прямо в верхней части каждого квадрата (индикатор имени). Все выглядит хорошо, но когда я запускаю код, имя остается неизменным, в то время как квадраты перемещаются случайным образом по экрану (вероятно, потому, что я перемещаю квадрат не с SKAction, а с PhysicsBody). С другой стороны, если я использую squareShape.addChild(text), текст также будет вращаться в соответствии с физикой квадрата.

Я новичок ie, использующий SpriteKit, и я уверен, что что-то упустил. Может ли кто-нибудь помочь мне понять?

1 Ответ

1 голос
/ 17 января 2020

Просто сделайте, чтобы ваш текстовый узел делал противоположный угол. Если ваша фигура поворачивается на 10 градусов влево, вы поворачиваете текст на 10 градусов вправо.

Теперь имейте в виду, что предполагается, что обе точки привязки закреплены в центре. Вы можете рассмотреть второй SKNode, который вы помещаете между вашей формой и вашим текстом, если вы хотите, чтобы текст был где-то еще. Затем вы повернули бы новый узел вместо текста.

Вот пример того, как это сделать.

class XSquare: SKNode {

    private var squareShape: SKSpriteNode
    private var text: SKLabelNode

    init() {
        // Sets up the square
        squareShape = SKSpriteNode(color: .red, size: CGSize(width: 100, height: 100))

        // Sets up the text
        text = SKLabelNode(text: "Here goes the name")
        text.position = CGPoint(x: 0, y: 100)

        // Calls the super initializator
        super.init()

        // Sets up the square
        squareShape.physicsBody = SKPhysicsBody(rectangleOf: squareShape.size)
        squareShape.physicsBody?.categoryBitMask = squareBitMask
        squareShape.physicsBody?.collisionBitMask = wallBitMask
        squareShape.physicsBody?.velocity = CGVector(dx: 10, dy: 10)
        squareShape.physicsBody?.angularVelocity = CGFloat(5)
        squareShape.physicsBody?.allowsRotation = true
        squareShape.physicsBody?.pinned = false
        squareShape.physicsBody?.affectedByGravity = false

        addChild(squareShape)
        squareShape.addChild(text)
    }
}

func didFinishUpdate(){
     text.zRotation = -squareShape.zRotation
}
...