2014-02-19 9 views
2

При предварительной загрузке текстур с использованием функции preloadTextures spritekit она загружает сразу все текстуры в предоставленном массиве в память.Предварительная загрузка SKTexture

Если у вас нет возможности разделить уровни в вашей игре с «экранами загрузки», но у вас есть отдельные уровни с разными файлами изображений, чем между собой, как вы можете сохранить от хранения всех изображений в памяти на один раз, не жертвуя частотой кадров, когда spritekit загружает изображения, когда это необходимо?

+0

только загрузить текстуры, необходимые для текущего уровня? Не знаете, что вы хотите знать или пытаетесь сделать. – LearnCocos2D

ответ

1

Вы можете создать одноэлементный класс с методами загрузки и выгрузки ресурсов, соответствующих уровню, который вы сейчас играете. Например, если у вас есть текстуры a, b и c, которые должны быть загружены для первого уровня, а текстуры x, y и z для уровня 2, вы могли бы иметь метод -(void)loadLevelOneTextures; и -(void)loadLevelTwoTextures;, а также -(void)unloadLevelOneTextures; и -(void)unloadLevelTwoTextures;

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

//GameTextureLoader.h 
// 
@import SpriteKit; 
@import Foundation; 
@interface GameTextureLoader : NSObject 
@property (strong, nonatomic)NSMutableArray *levelOneTextures; 
@property (strong, nonatomic)NSMutableArray *levelTwoTextures; 
+ (GameTextureLoader *)sharedTextures; 
- (void)loadLevelOneTextures; 
- (void)unloadLevelOneTextures; 
- (void)loadLevelTwoTextures; 
- (void)unloadLevelTwoTextures; 

И реализация:

//GameTextureLoader.m 
// 
#import "GameTextureLoader.h" 
@implementation GameTextureLoader 
+ (GameTextureLoader *)sharedTextures{ 
    static dispatch_once_t onceToken; 
    static id sharedInstance; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 
- (instancetype)init{ 
    self = [super init]; 
    if (self) 
    { 
      self.levelOneTextures = [[NSMutableArray alloc] init]; 
      self.levelTwoTextures = [[NSMutableArray alloc] init]; 
     return self; 
    } 
    else{ 
     exit(1); 
    } 
} 
- (void)loadLevelOneTextures{ 
     //Order of images will determin order of textures 
    NSArray *levelOneImageNames = @[@"imageA", @"imageB", @"imageC"]; 
    for (NSString *image in levelOneImageNames){ 
     SKTexture *texture = [SKTexture textureWithImageNamed:image]; 
     [self.levelOneTextures addObject:texture]; 
    } 
} 
- (void)loadLevelTwoTextures{ 
     //Order of images will determin order of textures 
    NSArray *levelTwoImageNames = @[@"imageX", @"imageY", @"imageZ"]; 
    for (NSString *image in levelTwoImageNames){ 
     SKTexture *texture = [SKTexture textureWithImageNamed:image]; 
     [self.levelTwoTextures addObject:texture]; 
    } 
} 
- (void)unloadLevelOneTextures{ 
    [self.levelOneTextures removeAllObjects]; 
} 
- (void)unloadLevelTwoTextures{ 
    [self.levelTwoTextures removeAllObjects]; 
} 

Вы бы сделать это для каждого уровня у вас есть, а затем получить доступ к текстурам вы могли бы сделать что-то вроде этого. (Обязательно первый импорт GameTextureLoader.h)

GameTextureLoader *loader = [GameTextureLoader sharedTextures]; 
[loader loadLevelOneTextures]; 
SKSpriteNode *node = [SKSpriteNode spriteNodeWithTexture:loader.levelOneTextures[0]]; 
[self addChild:node]; 
+0

Чтобы сделать это еще лучше для производительности, используйте асинхронную очередь отправки при вызове текстур нагрузки. Если у вас есть вопросы о том, как это сделать, посмотрите, как отправить асинхронную задачу с GCD – Andrew97p

+1

Извините. Вам не нужно инициализировать эти mutablearrays в GameTextureLoader перед сохранением SKTexture? –

+0

@ElTomato Да, извините, я исправлю это. – Andrew97p

Смежные вопросы