Добавление SKShapeNode в качестве дочернего к SKSpriteNode - PullRequest
0 голосов
/ 26 августа 2018

Используя 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 для второго. Чего мне не хватает?

1 Ответ

0 голосов
/ 29 августа 2018

Итак, как выглядит ваш код, вы пытаетесь создать 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))
}
...