dealing with textureAtlas and spritekit all about preloading texture atlas and remove them when you not need them anymore
spritekit is a cool 2d framework designed by apple with support fast 2d graphics rendering one of the killer feature of sprite kit is texture atlas a
what is a texture atlas
https://developer.apple.com/library/ios/recipes/xcode_help-texture_atlas/_index.html
working with texture atlas in sprite kit is very easy.
example
//fetch all texture from textureAtlas and add them their respective dictionary
what is a texture atlas
https://developer.apple.com/library/ios/recipes/xcode_help-texture_atlas/_index.html
working with texture atlas in sprite kit is very easy.
example
#import "GameScene.h"
@implementation GameScene
{
UIImage *defaultImg;
int MCrow;
int MCcoloum;
float imgWidth;
float imgHeight;
NSArray *atlasArray;
NSMutableArray *fetchedAtlas;
NSDictionary *dict1;
NSDictionary *dict2;
NSDictionary *dict3;
NSDictionary *dict4;
NSDictionary *dict5;
NSDictionary *dict6;
NSDictionary *dict7;
SKSpriteNode *node;
}
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
MCrow=3;
MCcoloum=3;
/*
loading all texture atlas in memory after ten second
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self drawAllTextures];
});
}
-(void)drawAllTextures
{
/*
all my texture atlas
*/
atlasArray=@[@"yellowseahorse",@"stingray",@"tiger",@"shark",@"mathlab",@"zipline",@"hurdies"];
//and empty array thats holds a group of textureAtlas
fetchedAtlas=[[NSMutableArray alloc] init];
for(int i=0;i<[atlasArray count];i++)
{
//add texture atlas to a NSMutableArray
[fetchedAtlas addObject:[self getAtlas:atlasArray[i]]];
}
//preload texture atlas
[SKTextureAtlas preloadTextureAtlases:fetchedAtlas withCompletionHandler:^{
dict1=[self fetchTexturesFromAtlas:fetchedAtlas[0]];
dict2=[self fetchTexturesFromAtlas:fetchedAtlas[1]];
dict3=[self fetchTexturesFromAtlas:fetchedAtlas[2]];
dict4=[self fetchTexturesFromAtlas:fetchedAtlas[3]];
dict5=[self fetchTexturesFromAtlas:fetchedAtlas[4]];
dict6=[self fetchTexturesFromAtlas:fetchedAtlas[5]];
dict7=[self fetchTexturesFromAtlas:fetchedAtlas[6]];
}];
}
-(NSMutableDictionary*)fetchTexturesFromAtlas:(SKTextureAtlas*)atlas
{
NSMutableDictionary *SKTextureDictionary=[[NSMutableDictionary alloc] init];
for(int i=0;i<[atlas.textureNames count];i++)
{
SKTexture *texture=[self createTextureFromAtlas:atlas texture:atlas.textureNames[i]];
NSArray *fullname=[atlas.textureNames[i] componentsSeparatedByString:@"."];
[SKTextureDictionary setObject:texture forKey:fullname[0]];
}
return SKTextureDictionary;
}
-(SKTexture*)createTextureFromAtlas:(SKTextureAtlas *)atlas texture:(NSString*)textureName
{
SKTexture *spriteTexture=[atlas textureNamed:textureName];
return spriteTexture;
}
//fetch texture atlas from memory
-(SKTextureAtlas*)getAtlas:(NSString*)name
{
return [SKTextureAtlas atlasNamed:name];
}
//
-(void)drawObjects
{
for (NSString* key in dict1) {
node=[SKSpriteNode spriteNodeWithTexture:[dict1 objectForKey:key]];
node.position=CGPointMake(400, 400);
[self addChild:node];
}
for (NSString* key in dict2) {
node=[SKSpriteNode spriteNodeWithTexture:[dict2 objectForKey:key]];
node.position=CGPointMake(300, 300);
[self addChild:node];
}
for (NSString* key in dict3) {
node=[SKSpriteNode spriteNodeWithTexture:[dict3 objectForKey:key]];
node.position=CGPointMake(100, 100);
[self addChild:node];
}
}
-(void)removeAllAtlas
{
//remove all reference of texture atlas and all textures
dict1=nil;
dict2=nil;
dict3=nil;
dict4=nil;
dict5=nil;
dict6=nil;
dict7=nil;
[fetchedAtlas removeAllObjects];
[self removeAllChildren];
fetchedAtlas=nil;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
[self drawObjects];
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self removeAllAtlas];
});
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
}
@end
Comments
Post a Comment