将 SKShapeNode 作为子节点添加到 SKSpriteNode

Adding SKShapeNode as Child to SKSpriteNode

我正在尝试使用 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)。为什么是这样?最后2个数字不应该是312、97.5吗?

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

最终 Shape 会更复杂,这就是为什么我不在第二个中使用 Sprite 的原因。我错过了什么?

从您的代码来看,您正在尝试创建一个 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))
}