1

我的 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。如果这能解决问题,我会通知您。

谢谢!

4

0 回答 0