Sprite Kit Textures Acting Funny

Posted

技术标签:

【中文标题】Sprite Kit Textures Acting Funny【英文标题】: 【发布时间】:2013-11-08 15:35:57 【问题描述】:

好吧,这个让我尖叫到墙上……所以请耐心等待。

我开始在 Xcode 中使用 SpriteKit 模板编写一个简单的游戏。

我将两个 PNG 添加到名为 Stage01.atlas 的文件夹中,并将其拖到项目中。不记得我选择了哪个选项,因为它在项目导航器中显示为蓝色文件夹图标(可能是因为它有扩展名?)。

接下来,我使用实例化了几个精灵

[[SKSpriteNode alloc] initWithImageNamed:@"My_Image_Name_Without_The_@2x_Or_Extension"];

起初,它不起作用,因为我忘记在构建设置中启用纹理图集。然后,它就像一个魅力,但是......

接下来,我在图集中添加了第三个 PNG 以显示一种新的精灵。

新的精灵不见了。

我尝试全新安装:从设备中删除应用,清理,构建。

现在所有的精灵都被渲染为一个带有后边框的白色四边形,内部有一个大的红色“X”。我还收到以下控制台消息:

SKTexture: Error loading image resource: "My_Image_Name_Without_The_@2x_Or_Extension"

我尝试删除 .atlas 文件夹并重新添加它,作为 “为任何添加的文件夹创建组”“为任何添加的文件夹创建文件夹引用” (这可能会导致资源被放置在子文件夹而不是包根目录中,因此它通常对 UIImage 等很重要),无济于事

我用这个替换了精灵创建代码:

SKTexture* texture = [SKTexture textureWithImageNamed:name];
SKSpriteNode* body = [[SKSpriteNode alloc] initWithTexture:texture];

...并放置断点以查看纹理是否为nil不是

那么,什么给了?

旁注:与模板捆绑在一起的“宇宙飞船”纹理渲染良好。

旁注 2:有人创建了标签“spritekit”(所以不允许我使用它,因为它已经存在,但它不是作为建议提出的)。

【问题讨论】:

第三张图片是在 XCODE 中还是在 finder 中添加到图集的? 这有关系吗?如果我添加为“文件夹引用”,则在 finder 中添加文件会使其也自动出现在 Xcode 中。现在我在几个设备和模拟器中尝试使用干净/干净的构建文件夹,删除应用程序等,结果参差不齐...... 只是一种预感,我想我之前在xcode中修改的时候遇到了麻烦,需要再次测试才能确定 您是否尝试过从设备/模拟器中删除应用程序?此外,如果您使用 .atlas 文件夹中的子文件夹,请不要使用路径。即,如果图像在“Stage01.atlas/images/image.png”中,您仍会将其加载为“image”或“image.png”,而不是“images/image.png”。 我不知道地图集中的子路径,我现在想不出它的用途......我的意思是,除了将你的精灵组织成地图集之外,你还需要什么? 【参考方案1】:

要使用纹理图集纹理,您首先需要加载纹理图集:

SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"Stage01"];

然后你可以从它的纹理创建精灵:

SKTexture* texture = [atlas textureNamed:@"My_Image_..."];
SKSpriteNode* body = [SKSpriteNode spriteNodeWithTexture:texture];

最初这可行的事实可能是因为图像是在没有生成 .atlas 的情况下添加的,即使您随后从项目中删除图像,它们仍将保留在部署的应用程序包中,因为 Xcode 不会从中删除资源一个应用程序包。所以 Sprite Kit 最初使用的是非图集图像,并不是找不到它们,它不会自动在纹理图集中查找它们,也不会自动加载图集。

【讨论】:

我遇到了这个问题。事实证明,即使在文件系统或 xamarin 中重命名了图集,它也会保留原始名称。我回到 Photoshop 并使用正确的名称重新创建了文件,这很好。为了测试这一点,我在运行时查看了 TextureNames 数组。 我已经好几个星期了,我遇到了同样的问题,添加了一个新的 png,它得到了尺寸,但不是正确的图像。就好像它将尺寸千篇一律地切割到现有图像上。但是,当我按照您上面的步骤进行操作时 - 一切都乱了套,我的图像都不起作用,除了最大的图像。我已经尝试清理、删除派生数据和所有内容。一些图像加载“旧方式”,我已将每个 SKSpriteNode 调用转换为上述方法,甚至恢复到以前的源代码控制也无法恢复。下一步 - 删除纹理图集和希望! 无论我尝试重新添加 .atlas 文件夹(重命名它,尝试在项目和目标级别添加它),清理,重建,只有我的一些图像工作,大多数没有.通过重新添加不带 .atlas 扩展名的文件夹,我设法重新启动并运行 - 这使我能够编程,希望当我尝试使用纹理图集使应用程序性能更高时,事情会神奇地自我纠正! (我在版本 6.0.1 (6A317)) 当我说“一切都乱了套”时——基本上所有图像都采用了我最大的图像的形式——但似乎是从那个大图像中剪下的图像。一切都在闪烁——好像我没有红色的“X”。此行为发生在模拟器和设备上。你知道这是否是一个已知问题,因为我在其他地方找不到任何提及! @LearnCocos2D 这个建议是最新的吗,因为 -Apple 说“Sprite Kit 首先搜索具有指定文件名的图像文件。如果找不到,它会在内置于应用程序包。这意味着您无需进行任何编码更改即可在游戏中支持此功能。“请参阅developer.apple.com/library/ios/documentation/GraphicsAnimation/…

以上是关于Sprite Kit Textures Acting Funny的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 场景未呈现

Sprite-kit:检测左右触摸

Sprite-kit 主要角色选择器

如何在 sprite kit 中引用多个同名的 sprite?

如何在 Sprite-kit 中画一条线

Sprite-Kit 为单个接触注册多个碰撞