通用2D游戏资产和绝对节点定位

dam*_*hec 12 iphone objective-c ipad ios sprite-kit

我有一个关于通用游戏资产和in (iOS 8+)绝对定位的问题.SKNodesSprite Kit

我将通过以下示例尝试提出我的问题:

想象一下,一个2D自上而下的游戏SKSpriteNode它代表的房子.一所房子有多个孩子SKSpriteNode,代表椅子,书桌,沙发等.

我有3个版本的房屋资产:

  • 1x - 200 x 200px (非视网膜iPad),
  • 2x - 400 x 400px (Retina iPhone和iPad),
  • 3x - 600 x 600px (iPhone 6 Plus).

重要:子节点(椅子,桌子等)位置在.plist文件中定义.像这样的东西(JSON表示):

children: [
    {
        position = {20,20};
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

由于位置是以点而非像素定义的,因此根据设备屏幕比例,所有内容都会按预期定位.对于1x设备,位置保持不变{20,20},对于2x位置是{40,40},对于3x位置是{60,60}.

问题:

问题是,为了在所有设备上实现类似的外观和感觉200x200px,400x400px资产对于iPad设备来说小的.

问题:

如何成功地呈现/导入资产的方式使我能够在不破坏子节点定位的情况下在所有设备/屏幕尺寸上实现类似(如果不是相同)的外观和感觉?

我的需要:

拿1:

我可以简单地将400x400px非视网膜iPad设备上的现有资产和600x600pxRetina iPad设备上的资产用于家庭节点,但子节点的定位将被破坏.这是因为孩子的位置值不会改变,{20,20}并且{40,40}对于iPad设备而言仍然是,而资产会更大.这将导致相对于房屋节点的不准确的子位置.

拿2:

我还可以分别使用iPad设备SKScene的普通200x200px400x400px大小资产来缩放尺寸(缩放效果).这样可以保持子节点的定位工作,但场景/资产的渲染质量不是很好.此外,这感觉就像一个黑客,我们不希望这样.

拿3:

我还可以使用两倍于iPad设备的大资产,并在运行时将子节点位置加倍.在这种情况下,我将使用400x400px非视网膜iPad设备的800x800px资产和视网膜iPad设备的新资产.虽然这看起来很棒并且保持子节点定位工作,但在运行时期间修复子节点位置似乎是一个非常大的hack:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    position.x *= 2.0f;
    position.y *= 2.0f;
}
Run Code Online (Sandbox Code Playgroud)

感谢您抽出宝贵时间阅读问题!

Epi*_*yte 6

我可以简单地将非视网膜iPad设备上的现有400x400px资产和Retina iPad设备上的600x600px资产用于家庭节点,但子节点的定位将被破坏.这是因为儿童位置值不会改变,并且对于iPad设备分别仍然是{20,20}和{40,40},而资产会更大.这将导致相对于房屋节点的不准确的子位置.

您可以简单地将房屋节点(不是场景)缩放到更大的尺寸.您需要做的就是将您房屋的比例设置为在较大的设备上看起来很好的值.事实上,我们可以根据屏幕尺寸设置一个公式,而不是检查iPad.类似下面的代码应该工作.请注意,它假设您的房子完全定位在iPhone 4上,并且它将一直扩展到所有更大的屏幕.请注意,您确实可以选择任意大小作为基本情况,但选择最小的屏幕并按比例放大是最简单的.只需确保提供更大的纹理,以便在缩放时纹理不会变得模糊.

[house setScale:self.scene.size.width/320.0];
Run Code Online (Sandbox Code Playgroud)

要么

您可以使用两个节点.用于保持"实际"位置的根节点,然后是用于显示图像的图像节点子节点.这样您就可以将位置数据与显示的数据分开.您可以根据需要调整子映像节点的大小和位置,而不会弄乱根节点的实际位置.您甚至可以在JSON中包含此额外的图像节点数据.


我还可以分别为iPad设备使用普通的200x200px和400x400px大小的资源来缩放SKScene尺寸(缩放效果).这样可以保持子节点的定位工作,但场景/资产的渲染质量不是很好.此外,这感觉就像一个黑客,我们不希望这样.

如果您的应用程序可以在某种程度上处理不同的宽高比,则此选项绝对可以使用.例如,如果场景缩放比设备屏幕大,则可以允许滚动场景.由于您将纹理缩放到大于预期大小,因此会出现质量损失.您需要提供更大的纹理,以便在缩放时保持高质量.在这种情况下,您可能只需使用600x600图像(或者甚至更大),然后使用缩放进行缩放.例如,在我的用于OS XI的RTS Sprite-Kit游戏中缩放整个场景,以便在所有设备上获得相同的外观.而且我没有失去任何质量,因为我确保提供非常大的纹理,因此在缩放时不会有质量损失.


我还可以使用两倍于iPad设备的大资产,并在运行时将子节点位置加倍.在这种情况下,我会为非视网膜iPad设备使用400x400px资产,为视网膜iPad设备使用新的800x800px资产.虽然这看起来很棒并且保持子节点定位工作,但在运行时期间修复子节点位置似乎是一个非常大的hack:

这也可以,特别是如果您的iPad需要自定义布局.但是,如果可能,请避免专门针对iPad进行检查,而是使用屏幕大小来创建布局规则,以便您的节点在所有屏幕尺寸上动态调整(请参阅上面的代码行).如果您的iPad布局与iPhone非常不同,有时这是不可能的,在这种情况下,您将别无选择,只能检查iPad.


所有这三种解决方案都很好.我不认为他们中的任何一个"hacky".它们都可以用于不同的目的.您需要找到最适合游戏的解决方案.

我还建议你在下面看到我的两个答案.不确定,但它们可以帮助您理解Sprite Kit中的通用定位和缩放.

/sf/answers/1767943761/

/sf/answers/2041985711/

祝你的游戏好运,如果你有任何问题,请告诉我.