将节点定位在屏幕下方(Spritekit)

时间:2017-08-08 18:52:46

标签: swift xcode sprite-kit

您好我正在尝试在屏幕底部生成子弹向上移动,但是我现在的代码会在屏幕顶部生成子弹。我试过把高度设为负值,没有任何反应。这是我正在使用的代码,谢谢。

let randomBulletPosition = GKRandomDistribution(lowestValue: -300, highestValue: 300)
    let position = CGFloat(randomBulletPosition.nextInt())
    bullet.position = CGPoint(x: position, y: self.frame.size.height + bullet.size.height)

1 个答案:

答案 0 :(得分:1)

一些不错的转换会对您有所帮助。

现在,不要一直这样做,这应该是一个完成类型的交易,就像在lazy属性中一样。

首先,我们想要了解我们的观点

let viewBottom = CGPoint(x:scene!.view!.midX,y:scene!.view!.frame.maxY)  //In a UIView, 0,0 is the top left corner, so we look to bottom middle

其次,我们想将位置转换为场景

let sceneBottom = scene!.view!.convert(viewBottom, to:scene!)

最后,我们希望转换为您需要它的任何节点。 (如果你想把它放在场景上,这是可选的)

let nodeBottom = scene!.convert(sceneBottom,to:node)

代码应如下所示:

let viewBottom = CGPoint(x:scene!.view!.midX,y:scene!.view!.frame.maxY)  
let sceneBottom = scene!.view!.convert(viewBottom!, to:scene!)
let nodeBottom = scene!.convert(sceneBottom,to:node)

当然,这有点难看。

谢天谢地,我们有convertPoint和convert(_from :)来清理一点

let sceneBottom = scene.convertPoint(from:viewBottom)

这意味着我们可以将代码清理成这样:

let sceneBottom = scene.convertPoint(from:CGPoint(x:scene!.view!.midX,y:scene!.view!.frame.maxY))
let nodeBottom = node.convert(sceneBottom,from:scene!)

然后我们可以将它作为1行:

let nodeBottom = node.convert(scene.convertPoint(from:CGPoint(x:scene!.view!.midX,y:scene!.view!.frame.maxY),from:scene!)

只要该节点可用于该类,我们就可以使其变得懒惰:

lazy var nodeBottom = self.node.convert(self.scene!.convertPoint(CGPoint(x:self.scene!.view!.midX,y:self.scene!.view!.frame.maxY),from:self.scene!)

这意味着第一次调用nodeBottom时,它会为您执行这些计算并将其存储到内存中。在此之后,每次都会保留该号码。

现在您知道屏幕底部在您要使用的坐标系中的位置,您可以将x值分配给随机产生的任何内容,并且可以减去(node.height *(1 - 节点) .anchorPoint.y))从场景中完全隐藏您的节点。

现在请记住,如果你的节点在不同的父节点之间移动,这个懒惰的节点将不会更新。

另请注意,我打开所有选项!,您可能想要使用?并检查它是否存在。