我的问题是HUD不会停留在相同位置,但也会随相机一起移动。
我尝试使用Github上的swift_boxxle代码创建一个Sokoban版本,
我添加了一个名为mazeWorld的新SKNode,一个摄像机节点和一个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]
答案 0 :(得分:2)
我不熟悉Boxxle或它如何影响您的工作流程,但在Sprite Kit的上下文中: 您应该将HUD节点添加为SKCamera节点的子节点。这样,它不会与场景的其余部分(即迷宫节点)一起转换。
所以cam.addChild(HUD!)
代替addChild(HUD!)
。
答案 1 :(得分:1)
作为快速替换,您可能还需要考虑使用不受SpriteKit场景影响的UILabel
。
如果您想在SKLabelNode
方法中坚持didSimulatePhysics
s,请将HUD
的位置设置为cam
的位置以及它与游戏开始。如下所示:
override func didSimulatePhysics () { // I forget if this has a parameter
HUD.position = cam.position;
}
我们在物理完成之后继续这样做是因为它会在其他所有移动之后移动hud,并且让你使用可能影响玩家位置的物理,一切都将是好。
答案 2 :(得分:0)
您的问题是您正在整个场景中移动摄像机节点,但实际上您只想调整迷宫世界节点。我不知道怎么做,你需要研究这部分