0

我正在使用 TextureAtlas 中的纹理加载动画。

但是动画没有出现在屏幕上。

我只在我 NSLog 纹理时出现!看起来像一个错误。

有人做过类似的经历吗?

SKTextureAtlas *atlas = [SKTextureAtlas atlasWithRetinaCorrection:spriteSheetName_];
if ([atlas.textureNames count] == 0) return;
NSArray *r = [self getSprites:WEAPON_FIREANIMATION ofDict:atlas.textureNames];
if ([r count] == 0)return;


SKSpriteNode *firstSprite = (SKSpriteNode*)[self childNodeWithName:tFIRSTSPRITE];
[firstSprite removeActionForKey:aFIRE_ANIM];

NSMutableArray *walkAnimFrames = [NSMutableArray array];
int k =0;
if (self.weaponAnimDuration == 0)
{
    k = (self.weaponShootInterval / 0.1f)/[r count];
} else
{
    k = (self.weaponAnimDuration / 0.1f)/[r count];
}
for (int i = 0; i<k; i++)
{
    for (NSString *sname in r)
    {
        [walkAnimFrames addObject:[SKTexture textureWithImageNamed:sname]];
    }

}
NSLog(@"%@",walkAnimFrames);

SKAction *weaponAnim = [SKAction animateWithTextures:walkAnimFrames timePerFrame:0.1f];
[firstSprite runAction:weaponAnim withKey:aFIRE_ANIM];

#import "SKTextureAtlas+MySKTextureAtlas.h"
@implementation SKTextureAtlas (MySKTextureAtlas)

+(SKTextureAtlas*)atlasWithRetinaCorrection:(NSString*)name
{
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00)
    {
        name = [NSString stringWithFormat:@"%@@2x",name];
    }

    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"atlasc"];
    if (path == Nil) return Nil;

    return [SKTextureAtlas atlasNamed:name];
}

@implementation NSArray (Tools)


-(NSArray*)animationTextureFrames
{
    NSMutableArray *rr = [NSMutableArray new];
    for (NSString *name in self)
    {
        SKTexture *tex = [SKTexture textureWithImageNamed:name];
        [rr addObject:tex];
    }
    return rr;
}
4

5 回答 5

3

我发现了错误!

我必须预加载纹理。

 [SKTexture preloadTextures:explosionTextures withCompletionHandler:^(void){}];
于 2013-10-08T13:37:37.490 回答
1

这就是我的工作方式,还没有任何问题。

    NSMutableArray *textures = [NSMutableArray arrayWithCapacity:5];
    for (int i = 1; i < 5; i++) {
        NSString *textureName = [NSString stringWithFormat:@"rocket%d", i];
        SKTexture *texture = [SKTexture textureWithImageNamed:textureName];
        [textures addObject:texture];
    }

    self.rocketAnimation = [SKAction animateWithTextures:textures timePerFrame:0.1];
    // add animation to my sprite
    [self.projectile runAction:[SKAction repeatActionForever:self.rocketAnimation]];
    // add spite to screen etc...
    [self addChild:self.projectile];
于 2013-10-04T03:56:31.280 回答
1

看到这篇文章,当图像使用纹理图集有很多透明空间时,会出现一个错误。

SKTexture 返回错误的大小?

于 2013-10-18T06:45:19.833 回答
0

与大多数其他操作相比,NSLog 非常慢。只需插入该调用就会显着暂停应用程序的主线程。我猜你的纹理加载正在将任务发送到 GPU。如果没有 NSLog 调用,GPU 可能没有足够的时间来完成任务。也许你可以预加载纹理。

于 2013-10-07T16:02:37.133 回答
0

转到您的项目并按照以下步骤操作:- 1> 转到构建设置,2> 搜索启用纹理图集生成并选择

于 2014-03-28T06:34:55.650 回答