Sprite Kit纹理的尺寸/分辨率

5

我刚开始使用Sprite Kit,在加载纹理精灵时遇到了问题。

我在Xcode中使用Sprite Kit模板创建了一个新项目,并想添加一个简单的精灵,使用一张图片文件作为纹理。以下是我在场景的init方法中使用的代码:

SKSpriteNode *myNode = [SKSpriteNode spriteNodeWithImageNamed:@"my_image_file"];
myNode.position = CGPointMake(100, 100);
[self addChild:myNode];

我没有在图像名称中添加扩展名,所以我的文件名为"my_image_file.png",但我省略了末尾的".png"。我还将场景创建移动到viewWillLayoutSubviews方法中,这是许多教程建议的。
我在模拟器(使用retina iPhone作为设备)中运行了项目,令我惊讶的是,精灵的大小是我期望的两倍,并且像素也很大。看起来就像我正在使用非retina iPhone。据我所知,Apple Adventure示例应用程序使用相同的命名约定,那里的精灵显示得很好。
我将文件重命名为"my_image_file@2x.png",一切正常,精灵显示出我期望在retina显示屏上看到的效果。由于我有很多图像文件,我更喜欢不重命名它们,在Apple Adventure应用程序中没有使用@2x后缀也可以正常工作。
如果我显式定义SKSpriteNode上的纹理大小,它也能正常工作:
+ (instancetype)spriteNodeWithTexture:(SKTexture *)texture size:(CGSize)size

我在每次运行之间清理了项目并从模拟器中删除了应用,因此我认为这不是卡住或丢失图像文件的问题。我还尝试搜索互联网以了解Sprite Kit纹理文件命名约定的工作方式,但我找不到任何有关此问题的文档。能否有人简要解释一下它是如何工作的,或者至少向我展示一个不涉及重命名所有我的图像文件或显式为所有我的精灵定义大小的解决方案?谢谢,utr
2个回答

1
如果您使用资源目录,则不需要重命名所有文件。如果使用Xcode SpriteKit模板创建项目,只需单击Images.xcassets,然后将图像拖放到适当的位置即可。您也可以通过新建文件->资源->资源目录手动创建资源目录。

谢谢,它完美地运作了!但我还是不太明白 Apple Adventure 应用程序是如何工作的。它只使用资源目录来处理应用图标和启动图像。 - utrutr
它使用纹理图集来制作地图和角色。 - quaertym
我也使用纹理集,但它并没有帮助。在纹理集中有选项可以让Xcode知道其中的图像是否作为Retina分辨率纹理使用吗? - utrutr
看起来 Adventure 只使用视网膜图片。你应该将视网膜(@2x)图片和普通分辨率图片放在同一个图集中。然后只需使用其基本名称引用精灵。 - quaertym
这与整个目的背道而驰。我只使用视网膜图像,因此我不希望每个图像都有普通和视网膜分辨率版本。我想复制Adventure应用程序所做的:仅具有视网膜图像,没有任何后缀,并且仍然可以通过引用图像名称(无扩展名)来使用它们。 - utrutr
冒险将场景的大小扩大了2倍。我猜这就是为什么精灵看起来正常的原因。 - quaertym

0

我自己也在寻找答案,看起来特别是冒险游戏示例会像这样处理视网膜大小:

// On iPhone/iPod touch we want to see a similar amount of the scene as on iPad.
// So, we set the size of the scene to be double the size of the view, which is
// the whole screen, 3.5- or 4- inch. This effectively scales the scene to 50%.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
   viewSize.height *= 2;
   viewSize.width *= 2;
}

我很想听到任何人对这段代码进行评论,并且是否确实与仅使用未带@2x后缀的Retina图片有关。


由于存在3x设备,请使用[UIScreen mainScreen].scale作为乘数。 - DDPWNAGE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接