1

我有一个带有一堆图块的图集,我正在尝试使用 SKTexture 和 SKTextureAtlas 将它们加载到内存中,但它不起作用。我使用以下代码加载它们:

NSString *atlasName = [NSString stringWithFormat:@"Tiles"];
SKTextureAtlas *tileAtlas = [SKTextureAtlas atlasNamed:atlasName];
NSInteger numberOfTiles = tileAtlas.textureNames.count;
backgroundTiles = [[NSMutableArray alloc] initWithCapacity:numberOfTiles];
for (int y = 0; y < 5; y++) {
    for (int x = 0; x < 9; x++) {
        int tileNumber = y*9 + x + 1;
        NSString *textureName = [NSString stringWithFormat:@"tile%d.png",tileNumber];
        SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[tileAtlas textureNamed:textureName]];
        CGPoint position = CGPointMake((0.5 + x)*_tileSize - _levelWidth/2,(0.5 - y - 1)*_tileSize + _levelHeight/2);

        tileNode.position = position;
        tileNode.zPosition = -1.0f;
        tileNode.blendMode = SKBlendModeReplace;

        [(NSMutableArray *)backgroundTiles addObject:tileNode];
    }
}

然后我使用这段代码将它们添加到我的场景中:

- (void)addBackgroundTiles
{
    for (SKNode *tileNode in [self backgroundTiles]) {
        [self addChild: tileNode];
    }
}

问题是它没有为图块加载正确的纹理或根本找不到纹理。我最终得到的是这个(忽略蓝色圆圈):http: //i.stack.imgur.com/g39BF.png

这是我的瓷砖图集:http ://snk.to/f-ctp5yhpz

编辑:我正在使用 NameChanger(www.mrrsoftware.com/MRRSoftware/NameChanger.html) 重命名我的所有图块,是那个程序弄乱了我的 png 吗?据我所知,在我重命名它们后它们的顺序是正确的。

4

2 回答 2

0

解决方案

编辑我的答案以指出解决方案在此答案下方的评论中。

事实证明,该问题是由于在图像文件在 Xcode 之外重命名后 Xcode 没有重建图集(可能是由提到的文件更改 OP)引起的。

通过清理和重建项目,重新构建了所有纹理图集,并且 OP 代码开始工作。


原始答案

有两件事要仔细检查:

  1. 您的 .atlas 是作为文件夹还是组添加到您的项目中?它必须是一个文件夹(Xcode 中的蓝色图标,而不是黄色)。
  2. 将 Tiles.atlas 添加到项目后,还必须在 Xcode 设置中启用图集生成。

有关类似问题,请参见此处:如何为 SpriteKit 创建图集。我链接到有关将纹理图集纳入您的项目的 Apple 文档,其中包含有关启用图集生成的详细分步说明。

于 2014-03-02T11:04:47.693 回答
0

为什么要使用双 for 循环?您是否将 backgroundTiles 数组保存为属性?

我最近发生了这种情况,唯一有效的解决方法是: [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:@"someTile.png"]];textureWithImageNamed 总是得到正确的。

所以试试:

SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:textureName]];
于 2014-03-01T19:29:12.330 回答