我的 xCode 项目具有以下内容....
应用委托
游戏视图控制器
开幕现场
主菜单场景
游戏场景
当游戏开始时,AppDelegate 会创建一个包含我将使用的所有纹理的数组...
[self.texturesArray addObject:[SKTexture textureWithImageNamed:@"Background05.jpg"]];
大约有 120 种纹理。
然后我使用...预加载它们
[SKTexture preloadTextures:self.texturesArray withCompletionHandler:^{
NSLog(@"************ Finished Preloading Textures in AppDelegate.m *************");
[[STGD sharedGD].currentScene presentMainMenuScene];
}];
然后我展示了OpeningScene,它一直等到上面的完成处理程序告诉它展示主菜单。
这就是问题所在...
在主菜单 (animateWithTextures) 中使用了一种预加载纹理的动画。有时,某些帧会丢失,并显示为带有红色 X 的白框,通常表示找不到文件。如果发生这种情况,那么以下情况也总是会发生...切换到游戏场景使用相同的动画(尽管在 GameScene 中它的尺寸更大)并且相同的帧将丢失并显示红色 X。在之间来回切换MainMenuScene 和 GameScene (每次重新创建每个场景)和相同的帧将消失,直到我重新启动应用程序。
我知道纹理是在代码中正确创建的,因为大多数时候它工作正常。但是大约 15 次发布会导致一些动画纹理丢失。每次它发生时,它永远不会是相同的帧,甚至是相同数量的帧。如果这意味着什么,它们也不是相邻的帧:P
在我开始使用预加载之前,我不相信这曾经发生过。但是如果没有预加载,我的初始 fps 就是垃圾。
感谢任何见解!谢谢!
更新:
这是我在 Star.m 中填充纹理数组的方法。Star 对象用于 MainMenuScene 和 GameScene
self.animationSlides = [NSMutableArray arrayWithCapacity:45];
for (int i = 0; i < 45; i++)
{
NSString *fileName;
if (i < 10)
fileName = [NSString stringWithFormat:@"Star03-03-0%i.png", i];
else
fileName = [NSString stringWithFormat:@"Star03-03-%i.png", i];
[self.animationSlides addObject:[SKTexture textureWithImageNamed:fileName]];
}
然后我在 Star.m 中创建一个精灵...
self.animationSprite = [SKSpriteNode spriteNodeWithImageNamed:@"Star03-03-00.png"];
然后在 Star.m 中对其进行动画处理...
[self.animationSprite runAction:[SKAction repeatActionForever:[SKAction animateWithTextures:self.animationSlides timePerFrame:0.0666]]];
我只在设备上测试,没有模拟器。我已经从我的设备中删除了该应用程序并在重新安装之前执行了 Product -> Clean。如果这能解决问题,我会通知您。
谢谢!