【问题标题】:SKLabelNode with Children not affected by gravity - not respecting zPositionSKLabelNode 与儿童不受重力影响 - 不尊重 zPosition
【发布时间】:2015-07-25 08:01:37
【问题描述】:

我有一个包装类来创建一个带有一些子节点的标签节点。这是该类的初始化:

let label = SKLabelNode(text: word)
let background = SKShapeNode(rectOfSize: size, cornerRadius: 0.5)
let mainNode = SKSpriteNode(color: color, size: background.frame.size)
label.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
label.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
label.addChild(background)
label.addChild(mainNode)
mainNode.zPosition = 1
background.zPosition = 2
label.zPosition = 5
self.node = label

在我的主场景中,我实例化了节点,设置了它的物理体并设置了场景的重力:

self.physicsWorld.gravity = CGVectorMake( 0, -10 );

let node = MyNode()
node.node.zPosition = 99
node.node.position.y = endOfScreenTop
  if let name = node.node.name as String!, let sprite = node.node.childNodeWithName(name) as? SKSpriteNode {
    node.node.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
    node.node.physicsBody!.mass = 1.0;
    node.node.physicsBody!.angularDamping = 0.0;
    node.node.physicsBody!.linearDamping = 0.0;
    node.node.physicsBody!.friction = 0.0;
    node.node.physicsBody!.affectedByGravity = true
    node.node.physicsBody!.dynamic = true
    node.node.physicsBody!.allowsRotation = false
 }
 addChild(node.node)

我有两个问题:

  • 标签出现在 SKSpriteNode 后面,尽管 zPosition 应该将它放在前面
  • 根本没有出现 SKShapeNode(这只是一个用于平滑角落的插图)
  • 所有节点都不受重力影响

PS。即使将以下内容更改为 true 也不会改变任何内容:

 skView.ignoresSiblingOrder = false

PS2。 MyNode 类具有这些属性

var node: SKLabelNode
var speed: CGFloat = 1.0
var word: String
var color: UIColor
var kind: Kind

【问题讨论】:

  • 当然我忘了从 init 复制最后一行,太好了.... self.node = label(我在底部添加了更多信息)

标签: ios sprite-kit sklabelnode


【解决方案1】:

假设skView.ignoresSiblingOrder = true在视图控制器中(默认设置),一些想法……

  1. ignoresSiblingOrder 设置为true 时,Sprite Kit 在确定绘制节点的顺序时会忽略兄弟关系。但是,它不会影响父兄弟绘制顺序。
  2. 在任一模式下,先绘制父节点,然后渲染子节点。通常,无论父级和子级的zPositions 是什么,子级都会出现在父级之上(如果它们位于同一位置)!例外情况是孩子的zPosition 小于零。在这种情况下,子级将出现在其父级下方(即使父级的 zPosition 小于子级)。
  3. 您似乎没有设置精灵节点的node.node.namename。如果未设置名称,if 条件将失败,物理体将不会附加到 node.node
  4. 形状的默认设置仅在其path(在本例中为矩形)周围绘制白色边框。您应该将其视为精灵节点周围的白色轮廓。设置background.fillColor = SKColor.greenColor() 将显示填充为绿色的SKShapeNode

【讨论】:

  • 非常感谢,现在一切正常。我删除了 SKSpriteNode,只保留了不使用 background.fillColor 的形状。我真的没想到ignoresSiblingOrder 在父兄弟绘制顺序中表现得那样。
  • ignoresSiblingOrder 在第一句和项目符号 1 中应该是 true。我错误地将其设置为 false。我已经更新了我的答案。对此感到抱歉。
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2015-05-12
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
相关资源
最近更新 更多