我正在使用Swift在纵向模式下为所有iOS设备创建通用游戏。在GameViewController中,我正在创建如下场景:
let scene = GameScene(size:CGSize(width: 1536, height: 2048)) scene.scaleMode = .AspectFill
背景图片的分辨率为1536x2048,因此在iPad上使用scaleMode以上时,它将以完整尺寸显示,在iPhone 6上,则以修剪过的侧面显示1152x2048。在所有设备上都能正常工作,并且只需要一张背景图像。问题是,如果我要求size.width或self.frame.size.width,即使实际可见区域为例如1152,它也始终返回1536。
我该如何设置SkSpriteNode相对于可见区域的位置,以使其在每个设备的角落都为50x50?
“可见区域”只是视图。
因此,您可以相对于 视图 而不是 场景进行位置调整 。实际上,我在游戏中做了很多事情,这是通用的,并且可以在OS X和iOS上运行。
就我而言,我通常是针对用户界面执行此操作,因此我可能具有缩放的场景,但是我想设置一些相对于缩放的场景而不是相对于可见区域(即视图)的位置。
为此,您可以编写一个将视图坐标转换为相应场景坐标的函数。
这是我使用的功能。请注意,我从视线的高度中减去了所需的y位置,以便可以像sprite-kit一样将(0,0)当作左下角,而不是像UIKit那样对待左上角。
func convert(point: CGPoint)->CGPoint { return self.view!.convert(CGPoint(x: point.x, y:self.view!.frame.height-point.y), to: self) }
这是使用此功能的示例:
self.node.position = convert(CGPoint(x: 50, y: 50))
不管场景如何缩放和大小,这始终将强制节点相对于视图(屏幕的可见部分)的位置为(50,50)。