将SKShapeNode作为子级添加到SKSpriteNode

时间:2018-08-26 19:25:54

标签: sprite-kit skspritenode skshapenode

使用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作为第二个形状的原因。我想念什么?

1 个答案:

答案 0 :(得分:1)

因此,从您的代码中可以看到,您正在尝试创建一个shapeNode,然后将其放置在SKSpriteNode中。多数情况下您是正确的,只是定位代码做错了。

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

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

这就是我要做的:

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))
}