我怎样才能正确地让 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,我怎样才能得到正确的?