有没有人成功地使用JSTilemap只加载了可见的磁贴?我问的原因是因为我的地图太大了,不能一次加载,我想单独加载片段,或者只动态加载屏幕上当前可见的那些瓦片。
我不想使用KoboldKit。
编辑:激动人心的更新。Steffan和Marcus正在TilemapKit.com上开发一个外观很棒的工具包。迫不及待地想往他们那扔钱。
发布于 2014-05-09 14:09:15
这之前已经做过了。在这里看看如何让JSTileMap做你所要求的事情。
https://github.com/fattjake/JSTileMap/commit/01b5bacc8c5ccc1099e020276d204ba439a6d06c
希望这能有所帮助!
一段时间后的更新:初步研究表明,这可能不是让spriteKit为您处理优化的方法。请看这个小讨论:https://github.com/slycrel/JSTileMap/issues/28
发布于 2015-04-11 21:26:54
我在过去使用过分段映射方法。这适用于侧向滚动地图,您只需在侧边添加另一块。它也适用于需要侧边和底部或顶部部分的较大地图。
使用这种方法的另一个好处是,如果需要,可以在每次加载新地图时随机化地图部分。这消除了特定级别的“相同的旧映射”。
对于下面的代码示例,我使用的是大小相同的地图部分,宽度为1280,并排放置。以下是涉及的步骤:
在平铺应用程序中创建大小相同的地图节。为每个映射部分指定一个以数字结尾的唯一名称。例如: MyMap-0、MyMap-1、MyMap-2等等。
创建一个可变的数组,它将保存你的地图部分。让我们称它为mapSectionsArray。
创建一个名为mapOffsetX的浮点ivar,并将其初始值设置为零。
如果您希望创建一个包含10个部分的静态映射,请使用以下代码:
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;
}如果您希望创建一个包含10个部分的随机地图,请使用以下代码:
// 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];
}要在地图的对象层中加载项目,可以执行以下操作:
-(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;
}在update方法中,您可以根据球员的位置添加或删除选定的地图部分,如下所示:
// 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];
}
}
}根据玩家的位置,地图部分将被移除或添加到worldNode父对象中。
另一种优化方法是,当具有物理体的对象不在视图中时,也将其从父对象中移除。这可能是可行的,也可能是不可行的,这取决于游戏的设计和逻辑。
您可以在update方法中处理此问题:
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];
}
}
}https://stackoverflow.com/questions/23461568
复制相似问题