Безопасный способ проверки координат в быстром и интеллектуальном способе представления наложенной карты зрения - PullRequest
0 голосов
/ 07 августа 2020

У меня есть карта координат [[Int]], которую я использую, чтобы определить, был ли игрок уже в каком-либо месте, и дает обзор этого места.

examle Image

In order to make it look nicer, I want to have a dissolved border at the edges of the black spots. see example 2:

изображение с красивыми границами

для этого я проверяю свой массив зрения на 9 полей вокруг области, и если определенное c созвездие имеет черный цвет, оно выберет соответствующее изображение для отображения.

   func getTileImage(index: Int) -> String {
        let tileCoordinates = convertInto2D(index: index)
        var tile : [Bool] = [false,false,false,false,false,false,false,false,false,false]
        
        if (tileCoordinates.x >= 1) && (tileCoordinates.y >= 1)  { if visionMap[tileCoordinates.x - 1][tileCoordinates.y - 1] == 0 { tile[1] = true } }
        if (tileCoordinates.x >= 1) && (tileCoordinates.y >= 0)  { if visionMap[tileCoordinates.x - 1][tileCoordinates.y - 0] == 0 { tile[2] = true } }
        if (tileCoordinates.x >= 1) && (tileCoordinates.y < 19) { if visionMap[tileCoordinates.x - 1][tileCoordinates.y + 1] == 0 { tile[3] = true } }
        if (tileCoordinates.x >= 0) && (tileCoordinates.y >= 1)  { if visionMap[tileCoordinates.x - 0][tileCoordinates.y - 1] == 0  { tile[4] = true } }
        if visionMap[tileCoordinates.x - 0][tileCoordinates.y - 0] == 0  { tile[5] = true }
        if (tileCoordinates.x >= 0) && (tileCoordinates.y < 19) { if visionMap[tileCoordinates.x - 0][tileCoordinates.y + 1] == 0  { tile[6] = true } }
        if (tileCoordinates.x < 14) && (tileCoordinates.y >= 1) { if visionMap[tileCoordinates.x + 1][tileCoordinates.y - 1] == 0  { tile[7] = true } }
        if (tileCoordinates.x < 14) && (tileCoordinates.y >= 0) { if visionMap[tileCoordinates.x + 1][tileCoordinates.y - 0] == 0  { tile[8] = true } }
        if (tileCoordinates.x < 14) && (tileCoordinates.y < 19) { if visionMap[tileCoordinates.x + 1][tileCoordinates.y + 1] == 0  { tile[9] = true } }

  
        if tile[2] == true && tile[3] == true  && tile[6] == true  {return "righttop"}
        if tile[3] == true && tile[6] == true  && tile[7] == true  && tile[8] == true && tile[9] == true {return"rightbottom"}
        if tile[3] == true && tile[6] == true  && tile[8] == true  && tile[9] == true {return"rightbottom"}
        if tile[6] == true && tile[7] == true  && tile[8] == true  && tile[9] == true {return"rightbottom"}
        if tile[1] == true && tile[2] == true  && tile[4] == true  {return "lefttop"}
        if tile[2] == true && tile[6] == false && tile[4] == false {return "top"}
        if tile[4] == true && tile[2] == false && tile[8] == false {return "left"}
        if tile[6] == true && tile[2] == false && tile[8] == false {return "right"}
        if tile[7] == true && tile[4] == true  && tile[8] == true  {return "leftbottom"}
        if tile[8] == true && tile[4] == false && tile[5] == false {return "bottom"}
        if tile[9] == true && tile[6] == true  && tile[8] == true  {return "bottomright"}
        if tile[4] == true && tile[1] == true  && tile[2] == true  && tile[3] == true && tile[6] == true {return "lefttopright"}
        if tile[4] == true && tile[6] == true  && tile[7] == true  && tile[8] == true && tile[9] == true {return "leftrightbottom"}
        if tile[1] == true && tile[2] == true  && tile[4] == true  && tile[7] == true && tile[8] == true {return "lefttopbottom"}
        if tile[2] == true && tile[3] == true  && tile[6] == true  && tile[8] == true && tile[9] == true {return"righttopbottom"}

        
        return ""
        
    }

Этот код, на мой взгляд, не выглядит очень умным.

Прежде всего, есть общий способ проверить, нахожусь ли я на границах своей системы координат, поэтому мне не нужно проверять размер карты для каждого фрагмента: например, избавление от

if (tileCoordinates.x >= 1) && (tileCoordinates.y >= 1)

, потому что это зависит от размера карты, который в настоящее время составляет 15x20.

2-й: есть ли более разумный способ вернуть соответствующий image вместо проверки всех потенциальных возможностей?

Я почти уверен, что это используется во многих играх. Так что, если кто-то может помочь, мы будем очень признательны.

1 Ответ

0 голосов
/ 08 августа 2020

Поняв, что мне нужно учитывать только горизонтальные и вертикальные смежные поля, я переименовал свои изображения в следующем порядке, в зависимости от сторон, которые они покрывают:

«сверху», «слева» , "right", "bottom"

например, оверлейное изображение, покрывающее верхнюю и левую часть, будет называться "topleft"

это позволило мне уменьшить код до 4, если условия, которые проверяет, не видна ли сторона, и в этом случае добавляет имя стороны в строку:

    func getTileImage(index: Int) -> String {
        let tileCoordinates = convertInto2D(index: index)
        var tile : [Int] = [1,1,1,
                            1,1,1,
                            1,1,1]
            
        if (tileCoordinates.x >= 1) && (tileCoordinates.y >= 0)  { if visionMap[tileCoordinates.x - 1][tileCoordinates.y - 0] == 0  { tile[1] = 0 } }
        if (tileCoordinates.x >= 0) && (tileCoordinates.y >= 1)  { if visionMap[tileCoordinates.x - 0][tileCoordinates.y - 1] == 0  { tile[3] = 0 } }
        if (tileCoordinates.x >= 0) && (tileCoordinates.y < 19)  { if visionMap[tileCoordinates.x - 0][tileCoordinates.y + 1] == 0  { tile[5] = 0 } }
        if (tileCoordinates.x < 14) && (tileCoordinates.y >= 0)  { if visionMap[tileCoordinates.x + 1][tileCoordinates.y - 0] == 0  { tile[7] = 0 } }

        
        if (tile[1] == 1) && (tile[3] == 1) && (tile[5] == 1) && (tile[7] == 1) {return "noOverlay" }
        
        var returnString = ""
        
        if tile[1] == 0 {returnString.append("top")}
        if tile[3] == 0 {returnString.append("left")}
        if tile[5] == 0 {returnString.append("right")}
        if tile[7] == 0 {returnString.append("bottom")}

        return returnString
        
    }
...