您好我正在尝试在屏幕底部生成子弹向上移动,但是我现在的代码会在屏幕顶部生成子弹。我试过把高度设为负值,没有任何反应。这是我正在使用的代码,谢谢。
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)
答案 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))从场景中完全隐藏您的节点。
现在请记住,如果你的节点在不同的父节点之间移动,这个懒惰的节点将不会更新。
另请注意,我打开所有选项!,您可能想要使用?并检查它是否存在。