通用游戏中的SkSpriteNode位置

时间:2015-03-20 07:57:03

标签: ios swift sprite-kit

我使用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,它总是返回1536,即使实际可见区域是例如1152。

如何设置SkSpriteNode相对于可见区域的位置,以便它例如从每个设备的角落50x50?

2 个答案:

答案 0 :(得分:10)

  

如何设置SkSpriteNode相对于可见区域的位置,所以   从每个设备的角落来看,例如50x50?

"可见区域"只是视图。

因此,您可以相对于视图,而不是场景。我实际上在我的游戏中做了很多,这是通用的,可以在OS X和iOS上运行。

在我的情况下,我通常会为用户界面执行此操作,因此我可能会有缩放的场景,但我想设置一些不是相对于缩放的场景而是相对于可见区域(即视图)的位置。

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

这是我使用的功能。请注意,我从视图高度中减去了我想要的y位置,这样我就可以将(0,0)视为像左下角那样的sprite-kit,而不是像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),无论场景的缩放和大小如何。

答案 1 :(得分:1)

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

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

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

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