分块地图生成(删除和添加列) 何时?
Tiled map generation (removing & adding columns) When?
我正在为 iOS 制作一款类似无尽跑酷游戏的游戏,现在我正在生成地图。
当地图以固定速度移动时它起作用,它是无穷无尽的并且是随机的。我正在使用一个数组来保存图块的列,如果数组的第一个对象不在屏幕上,我会删除它,然后在它的末尾生成一个新列。
我的问题是当我想提高地图的速度时,地图生成开始变慢,一段时间后地图本身变得更慢,我不明白为什么。
我创建了一个从 (40,0) 开始的助手 SKSpriteNode,我在改变它的位置的同时改变了地图的位置,当它小于或等于零时,我删除一列并生成一个其他。
起始 mapNode.mapSpeed 是 2.0f,我想随着时间的推移增加不同的值。
self.helperNode.position = CGPointMake(self.helperNode.position.x+self.mapNode.mapSpeed, self.helperNode.position.y);
self.mapNode.position = CGPointMake(self.mapNode.position.x-self.mapNode.mapSpeed, self.mapNode.position.y);
if (self.helperNode.position.x <= 0.0f) {
[self.mapNode generateNextColumn];
self.helperNode.position = CGPointMake(40.0f, 0.0f);
NSArray *array = self.mapNode.map[self.mapNode.rowCount];
SKSpriteNode *row = [self.mapNode buildNextRowFromArray:array];
row.position = CGPointMake((self.mapNode.rowCount*40)-20, 0);
[self.mapNode addChild:row];
NSString *string = [NSString stringWithFormat:@"row%li",self.mapNode.rowCount-(long)self.mapNode.children.count];
SKNode *removableRow = [self.mapNode childNodeWithName:string];
[removableRow removeFromParent];
}
频繁调用"create/remove node"效率很低。更何况,如果你必须通过字符串获取每一行的节点,那是非常低效的。
您在任何给定时间都有固定数量的活动精灵(图块),因此您应该预先分配精灵并将它们放入数组或字典中。
滚动过屏幕边界的每一列 sprite 都会更新它们的位置(和纹理),以便它们成为下一列出现在屏幕上。
我正在为 iOS 制作一款类似无尽跑酷游戏的游戏,现在我正在生成地图。
当地图以固定速度移动时它起作用,它是无穷无尽的并且是随机的。我正在使用一个数组来保存图块的列,如果数组的第一个对象不在屏幕上,我会删除它,然后在它的末尾生成一个新列。
我的问题是当我想提高地图的速度时,地图生成开始变慢,一段时间后地图本身变得更慢,我不明白为什么。
我创建了一个从 (40,0) 开始的助手 SKSpriteNode,我在改变它的位置的同时改变了地图的位置,当它小于或等于零时,我删除一列并生成一个其他。
起始 mapNode.mapSpeed 是 2.0f,我想随着时间的推移增加不同的值。
self.helperNode.position = CGPointMake(self.helperNode.position.x+self.mapNode.mapSpeed, self.helperNode.position.y);
self.mapNode.position = CGPointMake(self.mapNode.position.x-self.mapNode.mapSpeed, self.mapNode.position.y);
if (self.helperNode.position.x <= 0.0f) {
[self.mapNode generateNextColumn];
self.helperNode.position = CGPointMake(40.0f, 0.0f);
NSArray *array = self.mapNode.map[self.mapNode.rowCount];
SKSpriteNode *row = [self.mapNode buildNextRowFromArray:array];
row.position = CGPointMake((self.mapNode.rowCount*40)-20, 0);
[self.mapNode addChild:row];
NSString *string = [NSString stringWithFormat:@"row%li",self.mapNode.rowCount-(long)self.mapNode.children.count];
SKNode *removableRow = [self.mapNode childNodeWithName:string];
[removableRow removeFromParent];
}
频繁调用"create/remove node"效率很低。更何况,如果你必须通过字符串获取每一行的节点,那是非常低效的。
您在任何给定时间都有固定数量的活动精灵(图块),因此您应该预先分配精灵并将它们放入数组或字典中。
滚动过屏幕边界的每一列 sprite 都会更新它们的位置(和纹理),以便它们成为下一列出现在屏幕上。