将 SKShapeNode 作为子级添加到 SKSpriteNode

Posted

技术标签:

【中文标题】将 SKShapeNode 作为子级添加到 SKSpriteNode【英文标题】:Adding SKShapeNode as Child to SKSpriteNode 【发布时间】:2018-08-26 19:25:53 【问题描述】:

使用 SpriteKit,我正在尝试创建一个矩形作为背景,第二个矩形是背景大小的 25%,并将其放置在背景的底部。 (所以下面的 25% 是蓝色,上面的 75% 是深灰色)

这是我的设置:

screenWidth = size.width   //312
screenHeight = size.height //390

func createSky()
    let sky = SKSpriteNode(color: SKColor.darkGray, size: CGSize(width: screenWidth, height: screenHeight))
    print("Sky: ", sky.frame)
    addChild(sky)


func createGround()
    let ground = SKShapeNode.init(rectOf: CGSize(width: screenWidth, height: screenHeight / 4))
    ground.fillColor = SKColor.blue
    print("Ground: ", ground.frame )
    sky.addChild(ground)

出于某种原因,ground.frame 正在打印Ground: (-157.35, -50.1, 314.7, 100.2)。为什么是这样?最后两位不应该是312、97.5吗?

我尝试了各种 .positions.anchorPositions,但我仍然无法让 SKShapeNode 正确地位于 SKSpriteNode 中。

最终形状会更复杂,这就是为什么我不使用 Sprite 作为第二个。我错过了什么?

【问题讨论】:

你确定屏幕宽度是 312 吗?这是一个奇怪的尺寸 【参考方案1】:

所以从您的代码来看,您正在尝试创建一个 shapeNode,然后将其放置在您的 SKSpriteNode 中。大部分你做对了,你只是定位代码不正确。

当您将子节点添加到节点时,该子节点会将父节点用作其参考点。因此,如果您告诉子节点为 -50 X 和 150 Y,则该子节点将距其父节点的中心点为 -50 X 和 150 Y。

当我做子节点(尤其是那些与父节点有很多相似之处的节点)时,我喜欢参考父节点的定位、宽度和高度。我不知道这是否是不好的做法,但这是我两年来所做的。

这就是我的做法:

var sky = SKSpriteNode()
var ground = SKShapeNode()

func createSky() 
    sky = SKSpriteNode(color: SKColor.darkGray, size: CGSize(width: self.frame.size.wdith, height: self.frame.size.height))
    // self.frame.size.width/self.frame.size.height calls its info from the ViewController, which is tied directly to your screen size (unless otherwise changed) 
    sky.position = CGPoint(x: 0,y: 0)
    self.addChild(sky)


func createGround() 
    ground = SKShapeNode((rectOf: CGSize(width: sky.width, height: sky.height * 0.25))
    ground.position = CGPoint(x: 0, y: sky.position.y - (ground.size.height / 1.5))

【讨论】:

那太好了。谢谢你。我一定对 SpriteKit 的坐标感到困惑。感谢发帖。

以上是关于将 SKShapeNode 作为子级添加到 SKSpriteNode的主要内容,如果未能解决你的问题,请参考以下文章

将发射器节点添加到 sks 文件并使用它 - XCode 6.0 + swift

如何动态地将组件作为子组件添加到指令中?

添加的 View 将 RecyclerView 作为父级,但视图不是真正的子级

绕过子类中的Initialization:Swift和SpriteKit

如何将SKScene添加到SCNNode平面?

SKShapeNode 检测两条线的交点