Sprite kit 将SKShapeNode作为子级添加到SKSpriteNode

Sprite kit 将SKShapeNode作为子级添加到SKSpriteNode,sprite-kit,skspritenode,skshapenode,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: screenWi

使用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.1314.7100.2)
。为什么会这样?最后两个数字不应该是31297.5吗

我尝试了各种
.positions
.anchorPositions
,但我仍然无法使SKShapeNode正确位于SKSpriteNode内


最终形状会更复杂,这就是为什么我不使用第二个精灵的原因。我遗漏了什么?

因此,从代码中可以看出,您试图创建一个shapeNode,然后将其放置在SkSpritNode中。大多数情况下,你都是对的,只是你的定位代码不正确

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

当我做子节点(特别是那些与父节点有很多相似之处的节点)时,我喜欢参考父节点的位置、宽度和高度。我不知道这是否是一种不好的做法,但我已经做了两年了

我会这样做:

var sky=SKSpriteNode()
var地面=SKShapeNode()
func createSky(){
sky=SKSpriteNode(颜色:SKColor.darkGray,大小:CGSize(宽度:self.frame.size.wdith,高度:self.frame.size.height))
//self.frame.size.width/self.frame.size.height从ViewController调用其信息,该信息直接绑定到屏幕大小(除非另有更改)
sky.position=CGPoint(x:0,y:0)
self.addChild(天空)
}
func createGround(){
地面=SKShapeNode((矩形:CGSize(宽度:sky.width,高度:sky.height*0.25))
ground.position=CGPoint(x:0,y:sky.position.y-(ground.size.height/1.5))
}

因此,从代码中可以看出,您试图创建一个shapeNode,然后将其放置在SKSpriteNode中。大多数情况下,您都做对了,只是定位代码不正确

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

当我做子节点(特别是那些与父节点有很多相似之处的节点)时,我喜欢参考父节点的位置、宽度和高度。我不知道这是否是一种不好的做法,但我已经做了两年了

我会这样做:

var sky=SKSpriteNode()
var地面=SKShapeNode()
func createSky(){
sky=SKSpriteNode(颜色:SKColor.darkGray,大小:CGSize(宽度:self.frame.size.wdith,高度:self.frame.size.height))
//self.frame.size.width/self.frame.size.height从ViewController调用其信息,该信息直接绑定到屏幕大小(除非另有更改)
sky.position=CGPoint(x:0,y:0)
self.addChild(天空)
}
func createGround(){
地面=SKShapeNode((矩形:CGSize(宽度:sky.width,高度:sky.height*0.25))
ground.position=CGPoint(x:0,y:sky.position.y-(ground.size.height/1.5))
}

你确定屏幕宽度是312吗?这是一个奇怪的尺寸吗?你确定屏幕宽度是312吗?这是一个奇怪的尺寸,非常棒。谢谢。我一定是被SpriteKit的坐标弄糊涂了。谢谢你的发帖。太棒了。谢谢。我一定是被SpriteKit的坐标弄糊涂了。谢谢你邮寄。