我有一堆瓷砖,我正在尝试使用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的程序?在我重新命名之后,我可以看到它们的顺序正确。答案 0 :(得分:0)
为什么双循环? 您是否将backgroundTiles数组保存为属性?
我最近发生了这种情况,唯一有效的修复方法是:
[SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:@"someTile.png"]];
textureWithImageNamed总是正确的。
所以试试:
SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:textureName]];
答案 1 :(得分:0)
编辑我的回答,指出解决方案在此答案的下方评论中。
事实证明,问题是由于Xcode在Xcode之外重命名图像文件之后没有重建地图集(可能是由于文件改变了OP提到的)。
通过清理和重建项目,所有纹理地图集再次构建,OPs代码开始工作。
要仔细检查两件事:
请点击此处查看类似问题:How to create atlas for SpriteKit。我链接到Apple documentation on incorporating texture atlases into your projects,其中有关于启用图集生成的详细分步说明。