SpriteKit статический HUD с камерой на плеере

Моя проблема в том, что HUD не стоит на месте, а движется вместе с камерой.

Я пытаюсь создать версию Sokoban, используя код swift_boxxle, найденный на Github,

Я добавил новый SKNode под названием mazeWorld, узел камеры и узел HUD.

var mazeWorld: SKNode?
let cam = SKCameraNode()
var HUD: SKNode?

В моем didMoveToView я добавляю и mazeWorld и HUD на сцену.

override func didMoveToView(view: SKView) {
    HUD = SKNode()
    addChild(HUD!)

    mazeWorld = SKNode()
    addChild(mazeWorld!)

    self.camera = cam
    ...
    initMenu()
}

Я использую функцию обновления, чтобы установить положение камеры в положение игрока:

override func update(currentTime: CFTimeInterval) {
    cam.position = player.sprite.position
}

У меня есть другая функция для настройки меню

func initMenu() {
    menuReset.text = "[reset]"
    menuReset.fontSize = 20
    menuReset.fontColor = SKColor.whiteColor()
    menuReset.position = CGPoint(x: self.size.width/2, y: self.size.height/2 - 20)
    menuReset.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Left;
    ...
    HUD!.addChild(menuMain)
}

Образцы ходов


Обновить

Я добавил следующее:

    let label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.textAlignment = NSTextAlignment.Center
    label.text = "I'am a test label"
    label.textColor = UIColor.whiteColor()
    self.view!.addSubview(label)

С таким ответом

    var frame: CGRect = label.frame
    //align on top right
    let xPosition: CGFloat = CGRectGetWidth(view.frame) - CGRectGetWidth(frame)
    frame.origin = CGPointMake(ceil(xPosition), 0.0)
    label.frame = frame
    //autoresizing so it stays at top right (flexible left and flexible bottom margin)
    view.autoresizingMask = [.FlexibleLeftMargin, .FlexibleBottomMargin]    

3 ответа

Я не знаком с Boxxle или с тем, как он влияет на ваш рабочий процесс, но в контексте Sprite Kit: вы должны добавить узел HUD в качестве дочернего узла вашего узла SKCamera. Таким образом, он не преобразуется с остальными дочерними элементами сцены (т. Е. Узлом лабиринта).

Так cam.addChild(HUD!) вместо addChild(HUD!),

В качестве быстрой альтернативы, вы также можете рассмотреть возможность использования UILabel который не будет затронут сценой SpriteKit.

Если вы хотите придерживаться SKLabelNodeзатем в didSimulatePhysics метод, установите HUDрасположение к camПоложение плюс любое смещение, которое было с самого начала игры. Так что-то вроде:

override func didSimulatePhysics () { // I forget if this has a parameter
    HUD.position = cam.position;
}

Причина, по которой мы пойдем после физики, состоит в том, что она будет двигать кожу после того, как все остальное переместится, и если вы будете использовать физику, которая может повлиять на позицию игрока, все будет хорошо.

Ваша проблема в том, что вы перемещаете узел камеры по всей сцене, но на самом деле вы хотите настраивать только свой узел в мире лабиринта. Я не уверен, как это сделать, вам нужно исследовать эту часть

Другие вопросы по тегам