SkSpriteNode在通用游戏中的位置
Posted
技术标签:
【中文标题】SkSpriteNode在通用游戏中的位置【英文标题】:SkSpriteNode position in universal game 【发布时间】:2015-03-20 07:57:02 【问题描述】:我正在使用 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?
【问题讨论】:
【参考方案1】:如何设置 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),无论您的场景如何缩放和调整大小。
【讨论】:
所以你在 GameViewController 中使用了这个函数,这也是你添加 UI 的地方? @shargath 糟糕,它应该说视图,而不是场景视图。我现在编辑它。我在场景类中使用这种方法。我的用户界面完全在 sprite-kit 中完成。 太好了,因为我的整个 UI 也是在 spriteKit 中完成的,所以场景类对我有用 :) @shargath 我再次编辑了答案,给你一个使用方法的例子。 嗨,你能告诉我Objective-C的版本吗?我试着像你写的那样使用它,但由于某种原因它不能工作。在 iPad 2 上,我正确地看到了精灵,但在 iPhone 5 上也一样,根本不显示精灵: ....self.inventory.position = [self convert:CGPointMake(-20, 600)]; -(CGPoint) 转换:(CGPoint) 点 return [self.view convertPoint:CGPointMake(point.x, self.view.frame.size.height - point.y) toScene:self];【参考方案2】:我不认为这真的是最好的方法。您应该根据 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
【讨论】:
其实我使用的方法是在 raywenderlich.com 的书籍 iOS 游戏教程中......以上是关于SkSpriteNode在通用游戏中的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何使任何模拟器/设备的 SKSpriteNode 位置相同?
如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?