SkSpriteNode在通用游戏中的位置

我正在使用Swift在纵向模式下为所有iOS设备创build通用游戏。 在GameViewController中,我创build了这样的场景:

let scene = GameScene(size:CGSize(width: 1536, height: 2048)) scene.scaleMode = .AspectFill 

背景图片的分辨率为1536×2048,所以上面的scaleMode在iPad上显示的是全尺寸,在iPhone 6上显示的是1152×2048的两边修剪。 在所有设备上都能正常工作,只需要一个背景图像。 问题是,如果我要求size.width或self.frame.size.width它总是返回1536,即使实际可见区域是例如1152。

我如何设置SkSpriteNode相对于可见区域的位置,以便在每个设备上从angular落起例如是50×50?

我如何设置SkSpriteNode相对于可见区域的位置,以便在每个设备上从angular落起例如是50×50?

“可见区域”就是这个观点。

所以你可以使你的位置相对于视图而不是场景 。 我其实在我的游戏中做了很多,这是普遍的,可以在OS X和iOS上运行。

在我的情况下,我通常这样做的用户界面,所以我可能有一个缩放的场景,但我想设置一些位置不是相对于缩放的场景,但相对于可见区域(即视图)。

为此,您可以编写一个将视图坐标转换为相应的场景坐标的函数。

这是我使用的function。 请注意,我从视图高度减去我所需的y位置,以便我可以将(0,0)视为左下angular的sprite-kit,而不是像UIKit那样的左上angular。

 func convert(point: CGPoint)->CGPoint { return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) } 

这是一个使用这个函数的例子:

 self.node.position = convert(CGPoint(x: 50, y: 50)) 

无论您的场景如何缩放和resize,这将始终强制节点的位置相对于视图(屏幕的可见部分)在(50,50)处。

我不认为这是最好的办法。 您应该根据SKView的大小创buildGameScene

 let scene = GameScene(size: self.skView.bounds.size) 

我不认为你应该为每个设备设置一个通用尺寸。 您需要让设备根据屏幕的分辨率设置场景尺寸。 然后,您需要根据设备创build不同的图像。 2x,3x,2x〜ipad等。

本教程是一个很好的开始: http : //www.raywenderlich.com/49695/sprite-kit-tutorial-making-a-universal-app-part-1