0

我的游戏在启动时有轻微的“闪烁”,因为我试图在 appDidFinishLoading 中加载大量游戏资源(几个 CCScene 和纹理)。我发现尝试异步加载纹理或 CCScenes 会导致绘图问题(纹理只是一个黑色方块)。在 cocos2d 中初始化游戏资产(不仅仅是纹理)的正确方法是什么?

4

1 回答 1

0

为了将来阅读本文的任何人的利益,有一件事情可能会让您感到困惑:如果将 [CCTextureCache addImage:filename] 放在异步线程中,它就不起作用。相反,您必须使用 [CCTextureCache addImageAsync:target:selector]。它让我暂时无法找到正确的解决方案:制作一个“正在加载”的 CCScene,它只会在其 init 函数中添加一个与您的启动图像相匹配的背景图像。然后,在 onEnter 中,使用 NSOperationQueue 执行加载。NSOperationQueue 很好,因为您可以在操作之间分配依赖关系,并根据需要使用完成块(更新进度条等)。这是一篇关于使用它们的有用文章:http: //nshipster.com/nsoperation/

示例实现:

-(void)onEnter
{
    [super onEnter];

    NSOperationQueue *queue = [NSOperationQueue new];

    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadTextures) object:nil];
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadAudio)    object:nil];
    NSInvocationOperation *operation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(displayGame)  object:nil];

    [operation3 addDependency:operation1];
    [operation3 addDependency:operation2];

    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}

最后,需要注意的一件事:当您以这种方式异步加载资源时,您可能会有一些“空白”纹理。确保您在此类操作中初始化的任何场景都将其纹理缓存在上一个操作中。此外,由于某种原因,如果您使用如下方法声明纯色精灵,则必须使用已异步缓存的虚拟纹理(类似于白色 1x1 png),否则将无法正常工作。

+(CCSprite *)createCCSpriteWithColor:(ccColor3B)color andSize:(CGSize)size
{   
    CCSprite *sprite = [CCSprite node]; // Does not work asynchronously
    CCSprite *sprite = [CCSprite spriteWithFile:@"blank.png"]; // Works asynchronously, if texture has been cached asynchronously

    [sprite setTextureRect:CGRectMake(0, 0, size.width, size.height)];
    [sprite setColor:color];
    return sprite;
}
于 2013-09-05T13:49:35.070 回答