将 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))
}
我正在尝试使用 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))
}