我为" Better"的使用道歉。但那是我认真对待的。
我正在写一条"河流"生成算法,我需要做一堆比较。我想知道是否有更好的方法来编写我必须进行的所有比较。
if Rain.value(atPosition: vector_float2(Float(columns),Float(rows))) == 1.0 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows + 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows - 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns),Float(rows - 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows - 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows + 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
if Rain.value(atPosition: vector_float2(Float(columns),Float(rows + 1))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
}
}
基本上" Rain"是一个perlin HeightMap,我用它来确定我的tileMap中的降雨量。这些if语句检查fullMap中的8个相邻切片(符合高降雨量的标准)并确定最低值,然后以河流形式设置水瓦片。
这种方法非常低效,因为我将继续在这些if语句中编写if语句,以便在此之后检查每个相邻的tile。这将是一大堆代码。有没有更好的方法来检查tileMap中某个图块周围的每个相邻图块,以减小代码的大小?
答案 0 :(得分:1)
由于您正在查看数字±1,因此可以使用两个范围循环:
outerLoop:
for dc in -1...1 {
for dr in -1...1 {
if dr == 0 && dc == 0 {
continue
}
if Rain.value(atPosition: vector_float2(Float(columns+dc),Float(rows+dr))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
break outerLoop
}
}
}
答案 1 :(得分:1)
这类似于@dasblinkenlight的回答。
如果您最终在代码中执行此操作,则可能需要创建一个adjacentOffsets
数组并循环遍历这些数组:
let adjacentOffsets = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
if Rain.value(atPosition: vector_float2(Float(columns),Float(rows))) == 1.0 {
for (dc, dr) in adjacentOffsets {
if Rain.value(atPosition: vector_float2(Float(columns+dc),Float(rows+dr))) == 0.9 {
fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
break
}
}
}