更好的方式来写这个比较
Better way to write this comparison
对于 "Better" 的使用,我深表歉意,但这正是我所需要的。
我正在编写一个 "river" 生成算法,我需要进行大量比较。我想知道是否有更好的方法来编写我必须进行的所有比较。
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" 是一个柏林高度图,我用它来确定我的 tileMap 中的降雨量。这些 if 语句正在检查 fullMap 中的 8 个相邻图块(满足高降雨量标准)并确定最低值,然后以河流的形式设置水图块。
这种方法非常低效,因为我将继续在这些 if 语句中写入 if 语句,以检查之后的每个相邻图块。这将是一大堆代码。有没有更好的方法来检查 tileMap 中特定图块周围的每个相邻图块以减少我的代码大小?
由于您正在查看数字 ±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
}
}
}
这类似于@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
}
}
}
对于 "Better" 的使用,我深表歉意,但这正是我所需要的。
我正在编写一个 "river" 生成算法,我需要进行大量比较。我想知道是否有更好的方法来编写我必须进行的所有比较。
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" 是一个柏林高度图,我用它来确定我的 tileMap 中的降雨量。这些 if 语句正在检查 fullMap 中的 8 个相邻图块(满足高降雨量标准)并确定最低值,然后以河流的形式设置水图块。
这种方法非常低效,因为我将继续在这些 if 语句中写入 if 语句,以检查之后的每个相邻图块。这将是一大堆代码。有没有更好的方法来检查 tileMap 中特定图块周围的每个相邻图块以减少我的代码大小?
由于您正在查看数字 ±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
}
}
}
这类似于@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
}
}
}