我怎样才能正确地让 SKLabelNode 跟随物理的身体?

Posted

技术标签:

【中文标题】我怎样才能正确地让 SKLabelNode 跟随物理的身体?【英文标题】:How can I properly make a SKLabelNode follow a body with Physics? 【发布时间】:2020-01-15 23:42:46 【问题描述】:

我创建了一个行为非常简单的类:这个类的每个对象都是一个顶部有名字的正方形,它们会在屏幕上随机浮动。

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),文本也会跟随正方形的物理特性旋转。

我是使用 SpriteKit 的新手,我确定我错过了一些东西。谁能帮我理解一下?

【问题讨论】:

【参考方案1】:

只要让你的文本节点做相反的角度。如果您的形状向左旋转 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

【讨论】:

以上是关于我怎样才能正确地让 SKLabelNode 跟随物理的身体?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能正确地进行非主动/主动约束?

我怎样才能正确转换这个?

GLUT - 啥是 imageloader.h,我怎样才能得到正确的?

我怎样才能正确地重写网址?

我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?

KIVY:我怎样才能得到正确的课程?