JSTilemap: carga de mosaicos visibles

¿Alguien ha tenido éxito en cargar solo los mosaicos visibles usando JSTilemap? La razón por la que pido es porque el tamaño de mi map es demasiado grande para cargarlo a la vez y quisiera cargar segmentos individualmente o solo cargar dinámicamente los mosaicos actualmente visibles en la pantalla.

No quiero usar KoboldKit.

Editar: emocionante actualización. Steffan y Marcus están trabajando en un excelente kit de herramientas en TilemapKit.com. No puedo esperar para tirar el dinero a su manera.

Esto se ha hecho antes. Eche un vistazo aquí sobre cómo hacer que JSTileMap haga lo que está pidiendo.

https://github.com/fattjake/JSTileMap/commit/01b5bacc8c5ccc1099e020276d204ba439a6d06c

¡Espero que ayude!

Actualización desde algún time más tarde: la investigación inicial ha sugerido que este puede no ser el path a seguir, para permitir que spriteKit maneje las optimizaciones para usted. Vea esta pequeña discusión: https://github.com/slycrel/JSTileMap/issues/28

He usado un enfoque de map segmentado en el pasado. Esto funciona para los maps de desplazamiento lateral donde simplemente agrega otra pieza al lateral. También funciona para maps más grandes donde se requieren piezas laterales e inferiores o superiores.

Una ventaja adicional de usar este enfoque es la capacidad, si se desea, de aleatorizar las secciones del map cada vez que se carga un map nuevo. Esto elimina el "mismo map antiguo" para un nivel específico.

Para el ejemplo del código a continuación, estoy usando secciones de maps de idéntico tamaño con una anchura de 1280 colocada una al lado de la otra. Estos son los pasos involucrados:

Cree secciones de maps de idéntico tamaño en la aplicación Tiled. Entregue a cada sección del map un nombre único que termine en un número. Algo como esto: MyMap-0, MyMap-1, MyMap-2, etc.

Cree una matriz mutable que contenga las secciones de su map. Llamémosle mapSectionsArray .

Cree un ivar float llamado mapOffsetX y establezca su valor inicial a cero.

Si está buscando crear un map estático con 10 secciones, use este código:

 for (int i = 0; i < 10; i++) { NSString *myString = [NSString stringWithFormat:@"MyMap-%d.tmx",i]; JSTileMap *tiledMap = [JSTileMap mapNamed:myString]; tiledMap.position = CGPointMake(mapOffsetX, 0); tiledMap.zPosition = 100; [worldNode addChild:tiledMap]; [mapSectionsArray addObject:tiledMap]; mapOffsetX += 1280; } 

Si está buscando crear un map aleatorio con 10 secciones, use este código:

 // create an array with the total number of sections created. // in this example I have created 30 sections in total // I make sure not to load the same section twice NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", @"13", @"14",@"15", @"16", @"17", @"18", @"19", @"20", @"21", @"22", @"23", @"24", @"25", @"26", @"27", @"28", @"29", nil]; for (int i = 0; i < 10; i++) { int r1 = arc4random() % [myArray count]; NSString *myString = [NSString stringWithFormat:@"MyMap-%@.tmx",[myArray objectAtIndex:r1]]; JSTileMap *tiledMap = [JSTileMap mapNamed:myString]; tiledMap.position = CGPointMake(mapOffsetX, 0); tiledMap.zPosition = 100; [worldNode addChild:tiledMap]; [mapSectionsArray addObject:tiledMap]; mapOffsetX += 1280; [myArray removeObjectAtIndex:r1]; } 

Para cargar elementos en la capa de objects de un map, puede hacer esto:

 -(void)loadMapObjects { float xOffset; xOffset = 0; for (int i = 0; i < [mapSectionsArray count]; i++) { TMXObjectGroup *group = [[mapSectionsArray objectAtIndex:i] groupNamed:@"ObjectLayerName"]; NSArray *arrayObjects = [group objectsNamed:@"objectName"]; for (NSDictionary *dicObj in arrayObjects) { SKNode *myNode = [SKNode node.....]; CGFloat x = [dicObj[@"x"] floatValue]; CGFloat y = [dicObj[@"y"] floatValue]; myNode.position = CGPointMake(x+xOffset, y); [worldNode addChild:myNode]; } xOffset += 1280; } 

En el método de actualización, puede agregar o eliminar la sección de map seleccionada en function de la position de su jugador de esta manera:

 // the exact values are determined by your view's size // and map section's width left = player.position.x - 1500; right = player.position.x + 1500; up = player.position.y + 1000; down = player.position.y - 1000; for(JSTileMap *object in mapSectionsArray) { if((object.position.x > left) && (object.position.x < right) && (object.position.y > down) && (object.position.y < up)) { if(object.parent == nil) { [worldNode addChild:object]; } } else { if(object.parent != nil) { [object removeFromParent]; } } } 

Según la position del jugador, una sección de map se elimina o se agrega al padre de worldNode.

Otra optimization es eliminar también (de los padres) los objects con cuerpos físicos cuando no están a la vista. Esto podría o no ser factible según el layout y la lógica de tu juego.

Puede manejar esto en el método de actualización:

 left = player.position.x - 1500; right = player.position.x + 1500; up = player.position.y + 1000; down = player.position.y - 1000; for(SKSpriteNode *object in mapItemsArray) { if((object.position.x > left) && (object.position.x < right) && (object.position.y > down) && (object.position.y < up)) { if(object.parent == nil) { [worldNode addChild:object]; } } else { if(object.parent != nil) { [object removeFromParent]; } } }