我有一个关于通用游戏资产和绝对定位 of a SKNodes in Sprite Kit (iOS 8+)的问题。
我将尝试通过下面的例子来说明我的问题
想象一下,一个2D自上而下的游戏,一个代表房子的SKSpriteNode。一所房子有多个儿童SKSpriteNode,代表椅子、书桌、沙发等。
我有三个版本的房屋资产:
1x - 200 x 200px (非视网膜iPads),2x - 400 x 400px (Retina iPhones和iPads)3x - 600 x 600px (iPhone 6 Plus)。重要:儿童节点(椅子、书桌等)位置在.plist文件中定义。如下所示(JSON表示):
children: [
{
position = {20,20};
},
...
]因为位置是以点而不是像素来定义的,所以根据设备屏幕的比例,所有的东西都会按预期的方式定位。对于1x设备,位置保持为{20,20},对于2x位置为{40,40},对于3x,位置为{60,60}。
问题
问题是,200x200px和400x400px资产是为iPad设备提供小规模的方式,为了在所有设备上实现类似的外观和感觉。
问题
如何成功地显示/导入资产,使我能够在所有设备/屏幕大小上实现相似(如果不是相同的话)外观和感觉,而不破坏子节点的位置?
我的拍摄:
采取1
我只需在非视网膜400x400px设备上使用现有的iPad资产,在Retina iPad设备上使用600x600px资产作为家庭节点,但是子节点的定位就会中断。这是因为子位置值不会改变,对于{20,20}设备仍然是{40,40}和iPad设备,而资产将更大。这将产生相对于房屋节点的不准确的子位置。
采取2
我还可以缩放SKScene大小(缩放效果),同时分别为iPad设备使用正常的200x200px和400x400px大小的资产。这样做可以使子节点的定位工作正常,但是场景/资产的呈现质量并不理想。而且,这感觉像一次黑客袭击,我们不想那样。
采取3
对于iPad设备,我还可以使用两倍的大资产,并在运行时将子节点的位置加倍。在这种情况下,我将使用一个400x400px资产用于非视网膜iPad设备,一个新的800x800px资产用于视网膜iPad设备。虽然这看起来很棒,并使子节点的位置保持工作,但在运行时,它似乎是一个很大的黑客修复子节点位置,如下所示:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
position.x *= 2.0f;
position.y *= 2.0f;
}谢谢你抽出时间阅读这个问题!
发布于 2015-06-13 14:58:31
我只需在非视网膜iPad设备上使用现有的400x400px资产,在Retina iPad设备上使用600x600px资产作为房屋节点,但是子节点的定位会变得不正常。这是因为iPad设备的子位置值不会改变,仍然是{20,20}和{40,40},而资产将更大。这将产生相对于房屋节点的不准确的子位置。
您可以简单地缩放您的家庭节点(而不是场景)到一个更大的大小。你所需要做的就是把你的房子的刻度设置成一个在更大的设备上看起来很好的值。事实上,我们可以找出一个公式,根据屏幕的大小来设置比例,而不是检查iPad。下面的代码应该可以工作。请注意,它假定您的房子位于iPhone 4上,并且它将始终扩展到所有较大的屏幕。请注意,您确实可以选择任意大小的任意大小作为您的基本情况,但选择最小的屏幕和扩展是最简单的。只要确保提供更大的纹理,这样纹理就不会在缩放时变得模糊。
[house setScale:self.scene.size.width/320.0];或
你可以用两个节点。用于保持“实际”位置的根节点,以及用于显示图像的图像节点子节点。这将允许您将位置数据与正在显示的位置数据分开。您可以根据需要调整子图像节点的大小和位置,而不会干扰根节点的实际位置。您甚至可以在JSON中包含这些额外的图像节点数据。
我还可以缩放SKScene大小(缩放效果),同时使用普通的200x200px和400x400px大小的资产分别用于iPad设备。这样做可以使子节点的定位工作正常,但是场景/资产的呈现质量并不理想。而且,这感觉像一次黑客袭击,我们不想那样。
如果您的应用程序可以以某种方式处理不同的高宽比,则此选项绝对可以工作。例如,如果场景比设备屏幕大,您可以允许滚动场景。质量上的损失是因为你在缩放比预期尺寸更大的纹理。你需要提供更大的纹理,以保持高质量时,缩放。在这种情况下,您可能只需使用您的600x600图像(甚至更大),并让它缩放。例如,在我的RTS雪碧-套件的OS游戏中,我放大了整个场景,所以我在所有设备上都有相同的外观。我不会失去任何质量,因为我确保提供非常大的纹理,所以在质量没有损失时,缩放。
对于iPad设备,我还可以使用两倍的大资产,并在运行时将子节点的位置加倍。在本例中,我将为非视网膜iPad设备使用400x400px资产,对于视网膜iPad设备使用新的800x800px资产。虽然这看起来很棒,并使子节点的位置保持工作,但在运行时,它似乎是一个很大的黑客修复子节点位置,如下所示:
这也可以工作,特别是当您的iPad需要自定义布局时。但是,如果可能的话,避免专门检查iPad,而是使用屏幕大小来创建布局规则,这样您的节点就可以在所有屏幕大小上一致地进行动态调整(参见上面的代码行)。有时,如果您的iPad布局与iPhone有很大的不同,这是不可能的,在这种情况下,您将别无选择,只能检查iPad。
所有这三个解决方案都是好的。我不认为他们中的任何一个“无趣”。他们都为了不同的目的而工作。你需要找到最适合你的游戏的解决方案。
我还建议你看看下面我的两个答案。不确定,但它们可以帮助您了解普适定位和缩放雪碧套件。
https://stackoverflow.com/a/25256339/2158465
https://stackoverflow.com/a/29171224/2158465
祝你玩游戏好运,如果你有任何问题,请告诉我。
发布于 2015-06-15 13:38:10
做你想做的事是不容易的。一种方法是在设备上使用固定的屏幕大小。从iPhone 5到iPhone 6+,它们的屏幕都使用16:9的高宽比。而iPad和iPhones 4s和更早版本,都使用4:3屏幕高宽比。
在显示GameScene之前,您可以确定屏幕的纵横比,然后为16:9设置一个固定的视图大小:
GameScene *startGame = [[GameScene alloc] initWithSize:CGSizeMake(736, 414)];
startGame.scaleMode = SKSceneScaleModeAspectFit;或者这个4:3
GameScene *startGame = [[GameScene alloc] initWithSize:CGSizeMake(1024, 768)];
startGame.scaleMode = SKSceneScaleModeAspectFit;确切的数值并不重要,只有比率。
知道确切的屏幕大小将允许您以更精确的方式放置对象,而不管是iPhone 5屏幕还是6+屏幕。
发布于 2015-06-13 09:35:42
使用图像资产,还可以指定图像的iPad版本。
然而,实际上并没有一种方法可以在应用程序中添加一些额外的逻辑,根据您在iPad上运行与否以及手动调整位置进行分支。
不过,我们可以讨论如何最好地结合这一点:我不是这个“如果我不是这个设备”的粉丝,在整个代码中都会检查。为一个接口习语创建一个抽象超类和两个子类,每个子类处理布局(或任何您想称之为的布局)。您将只需要检查一次(实例化这些代码时),而多态性将处理其余部分。
https://stackoverflow.com/questions/29741710
复制相似问题