SpriteKit 静态 HUD,播放器上带有摄像头

Ale*_*ley 1 hud sprite-kit sknode

我的问题是 HUD 没有保持在同一位置,而是随相机移动。

我正在尝试使用 Github 上找到的swift_boxxle代码创建一个 Sokoban 版本,

我添加了一个名为 mazeWorld 的新 SKNode、一个相机节点和一个 HUD 节点。

var mazeWorld: SKNode?
let cam = SKCameraNode()
var HUD: SKNode?
Run Code Online (Sandbox Code Playgroud)

在我的 didMoveToView 中,我将 mazeWorld 和 HUD 添加到场景中。

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

    mazeWorld = SKNode()
    addChild(mazeWorld!)

    self.camera = cam
    ...
    initMenu()
}
Run Code Online (Sandbox Code Playgroud)

我正在使用更新函数将相机位置设置为玩家位置:

override func update(currentTime: CFTimeInterval) {
    cam.position = player.sprite.position
}
Run Code Online (Sandbox Code Playgroud)

我还有另一个功能来设置菜单

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)
}
Run Code Online (Sandbox Code Playgroud)

动作示例


更新

我添加了以下内容:

    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)
Run Code Online (Sandbox Code Playgroud)

有了这样的答案

    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]    
Run Code Online (Sandbox Code Playgroud)

Clo*_*ddy 6

我不熟悉 Boxxle 或它如何影响您的工作流程,但在 Sprite Kit 的上下文中:您应该将 HUD 节点添加为 SKCamera 节点的子节点。这样,它就不会与场景的其余子节点(即迷宫节点)一起变换。

所以cam.addChild(HUD!)代替 addChild(HUD!).