SkSpriteNode在通用游戏中的位置
SkSpriteNode position in universal game
我正在使用 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 它总是 returns 1536,即使实际可见区域是例如1152.
如何设置 SkSpriteNode 相对于可见区域的位置,使其在每台设备上距离角落 50x50?
我不认为这真的是最好的方法。您应该根据 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
How can I set SkSpriteNode's position relative to visible area, so
that it'll be for example 50x50 from the corner on every device?
"visible area" 只是观点。
所以你可以让你的位置相对于视图,而不是场景。我实际上在我的游戏中经常这样做,它是通用的并且可以在 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),无论您的场景如何缩放和调整大小。
我正在使用 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 它总是 returns 1536,即使实际可见区域是例如1152.
如何设置 SkSpriteNode 相对于可见区域的位置,使其在每台设备上距离角落 50x50?
我不认为这真的是最好的方法。您应该根据 SKView 的大小
创建 GameScenelet 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
How can I set SkSpriteNode's position relative to visible area, so that it'll be for example 50x50 from the corner on every device?
"visible area" 只是观点。
所以你可以让你的位置相对于视图,而不是场景。我实际上在我的游戏中经常这样做,它是通用的并且可以在 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),无论您的场景如何缩放和调整大小。