SKShapeNode Позиционирование

Я ковыряюсь в SpriteKit и обнаруживаю некоторую странность, например, я просто добавляю прямоугольный SKShapeNode, который должен быть полноэкранным на iPhone.

override func didMoveToView(view: SKView) {
    let _box            = SKShapeNode(rectOfSize: self.frame.size)
    _box.strokeColor    = SKColor.blueColor()
    _box.fillColor      = SKColor.blueColor()
    _box.position       = CGPointMake(200, 200)
    _box.name           = "box"
    self.addChild(_box)

    let _player         = SKShapeNode(circleOfRadius: 50)
    _player.position    = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
    _player.fillColor   = SKColor.redColor()
    _player.strokeColor = SKColor.redColor()
    _player.name        = "player"
    _player.physicsBody = SKPhysicsBody(circleOfRadius: 50)
    _player.physicsBody?.dynamic = true
    _player.physicsBody?.allowsRotation = false
    self.addChild(_player)

    let _ground         = SKShapeNode(rectOfSize: CGSizeMake(self.frame.width, 20))
    _ground.name        = "ground"
    _ground.position    = CGPointMake(0, 0)
    _ground.fillColor   = SKColor.greenColor()
    _ground.strokeColor = SKColor.greenColor()
    _ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.width, 20))
    _ground.physicsBody?.dynamic = false
    self.addChild(_ground)
}

Мои представления инициализируются таким образом, чтобы переопределить func viewDidLoad () {super.viewDidLoad ()}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        // Configure the view.
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }

}

Результирующая сцена выглядит так: снимок экрана

Все узлы смещены влево-вниз. В основном левый нижний угол прямоугольных фигур находится за пределами границ (я проверил это, поместив синюю фигуру в (200, 200) вместо (0, 0) - и края левого дна все еще выходили за рамки экрана.

Точка привязки для сцены установлена ​​на (0, 0), поэтому в основном мне кажется, что она устанавливает положение для центральной точки формы.

Как лучше всего определить положение левого нижнего угла узла вместо средней точки?


person Serhii Balbieko    schedule 05.11.2014    source источник


Ответы (2)


Если вы создаете фигуру, используя путь Безье или CGPath, вы можете указать положение ее «точки привязки», где исходная точка пути указывает нижний / левый угол пути. Например,

    UIBezierPath* bezierPath = [UIBezierPath bezierPathWithRect: CGRectMake(0, 0, 50, 50)];
    SKShapeNode *shape = [SKShapeNode node];
    shape.path = bezierPath.CGPath;
    shape.fillColor = [SKColor blueColor];

Кроме того, если вашей целью развертывания является iOS 8, вы можете создать узел формы с помощью

    SKShapeNode *shape = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)];
    shape.fillColor = [SKColor blueColor];
person 0x141E    schedule 05.11.2014
comment
Спасибо за объяснение! - person Serhii Balbieko; 06.11.2014

_box.position       = CGPointMake(self.size.width*.5, self.size.height*.5)

Это поместит центр вашего спрайта в центр экрана.

person meisenman    schedule 05.11.2014
comment
да, это очевидно, спасибо. но есть ли способ определить положение узла в левом нижнем углу, а не в средней точке? - person Serhii Balbieko; 05.11.2014
comment
Я обновил свой ответ, чтобы показать также метод anchorPoint. - person meisenman; 05.11.2014
comment
Насколько я понял - anchorPoint в основном влияет на положение текстуры на узле, а не на положение самого узла. а что касается SKShapeNode - у него вообще нет свойства anchorPoint - person Serhii Balbieko; 05.11.2014
comment
К сожалению, у SKSpriteNode есть свойство, из которого можно сделать квадрат, но я вижу, что вам нужны другие свойства SKShapeNode. Метод, описанный в моем ответе, на сегодняшний день самый простой. Вы можете просто использовать простую математику, чтобы расположить его, учитывая, где на самом деле будет располагаться нижний левый угол. - person meisenman; 05.11.2014