写这种比较的更好方法

时间:2018-01-18 15:36:32

标签: swift algorithm sktilemapnode

我为" 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中某个图块周围的每个相邻图块,以减小代码的大小?

2 个答案:

答案 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
        }
    }
}
相关问题