Используйте один лист спрайтов для изображений в наборе спрайтов iOS

У меня есть лист спрайтов с изображениями анимации для моего спрайта. Как мне сделать эти изображения в SKTextureAtlas (чтобы я мог анимировать в SKAction), не разбивая отдельные файлы? Я видел и делал это раньше, но не использовал SpriteKit и/или SKTextures,

Возможно ли это даже без разделения файлов? Худший сценарий: мне нужно будет сделать отдельные изображения на листе.

В прошлом я только что сделал метод с размером спрайта и количеством полных спрайтов, которые были разделены изображениями в коде, а затем анимированными.


Заранее благодарим за помощь!

P.S. Я новичок в SpriteKit, но не для программирования игр или iOS

Ответ 1

Благодаря @LearnCocos2D парень за то, что указал мне на использование textureWithRect:inTexture:, я создал собственный метод init в моем пользовательском классе Entity : SKSpriteNode, который позволит использовать лист спрайтов со всеми изображениями на нем. Я попытался включить некоторые комментарии для объяснения кода. У меня эта версия просматривает x, так как моя анимация горизонтальна. Y можно изменить только с помощью вызванного метода. Не в методе с этой версией.

Обязательно поместите его в интерфейс!

Пример при инициализации alloc:

Entity *cookie = [[Entity alloc] initWithSpriteSheetNamed:@"cookie_sheet" withinNode:map sourceRect:CGRectMake(0, 0, 32, 32) andNumberOfSprites:6];

Метод в объекте: SKSpriteNode

- (id) initWithSpriteSheetNamed: (NSString *) spriteSheet withinNode: (SKSpriteNode *) scene sourceRect: (CGRect) source andNumberOfSprites: (int) numberOfSprites {

    // @param numberOfSprites - the number of sprite images to the left
    // @param scene - I add my sprite to a map node. Change it to a SKScene
    // if [self addChild:] is used.

    NSMutableArray *mAnimatingFrames = [NSMutableArray array];

    SKTexture  *ssTexture = [SKTexture textureWithImageNamed:spriteSheet];
    // Makes the sprite (ssTexture) stay pixelated:
    ssTexture.filteringMode = SKTextureFilteringNearest;

    float sx = source.origin.x;
    float sy = source.origin.y;
    float sWidth = source.size.width;
    float sHeight = source.size.height;

    // IMPORTANT: textureWithRect: uses 1 as 100% of the sprite.
    // This is why division from the original sprite is necessary.
    // Also why sx is incremented by a fraction.

    for (int i = 0; i < numberOfSprites; i++) {
        CGRect cutter = CGRectMake(sx, sy/ssTexture.size.width, sWidth/ssTexture.size.width, sHeight/ssTexture.size.height);
        SKTexture *temp = [SKTexture textureWithRect:cutter inTexture:ssTexture];
        [mAnimatingFrames addObject:temp];
        sx+=sWidth/ssTexture.size.width;
    }

    self = [Entity spriteNodeWithTexture:mAnimatingFrames[0]];

    animatingFrames = mAnimatingFrames;

    [scene addChild:self];

    return self;
}

Ответ 2

Вам нужно, чтобы каждый анимационный кадр был отдельным изображением. Затем вы можете использовать SKAction для анимации изображений, необязательно используя SKTextureAtlas.

Итак, вам нужно разделить существующий листок, если вы не написали пользовательский обработчик анимации, который вручную изменит текстуру rect анимированного спрайта. Вы можете создать меньшую текстуру из текстуры spritesheet, используя textureWithRect: inTexture:.