Skip to content

Assets/Scripts/Room.cs 中 UpdateEdgeTiles 函数可能会放入重复的边界点 #2

@CheapMeow

Description

@CheapMeow

Assets/Scripts/Room.cs 中 UpdateEdgeTiles 函数可能会放入重复的边界点

    // 更新房间边缘瓦片集
    public void UpdateEdgeTiles(TileType[,] map)
    {
        edgeTiles.Clear();

        // 遍历上下左右四格,判断是否有墙
        foreach (Coord tile in tiles)
            for (int i = 0; i < 4; i++)
            {
                int x = tile.tileX + upDownLeftRight[i, 0];
                int y = tile.tileY + upDownLeftRight[i, 1];
                if (map[x, y] == TileType.Wall)
                {
                    edgeTiles.Add(tile);
                    continue;
                }
            }
    }

测试函数

    // 更新房间边缘瓦片集
    public void UpdateEdgeTiles(TileType[,] map)
    {
        edgeTiles.Clear();

        // 遍历上下左右四格,判断是否有墙
        foreach (Coord tile in tiles)
            for (int i = 0; i < 4; i++)
            {
                int x = tile.tileX + upDownLeftRight[i, 0];
                int y = tile.tileY + upDownLeftRight[i, 1];
                if (map[x, y] == TileType.Wall)
                {
                    foreach (var edgeTile in edgeTiles)
                    {
                        if (edgeTile.tileX == tile.tileX && edgeTile.tileY == tile.tileY)
                        {
                            Debug.Log("重复放入边界点");
                            break;
                        }
                    }
                    edgeTiles.Add(tile);
                    continue;
                }
            }
    }

测试结果

image

可以考虑将 Coord 结构体改成 Vector2Int 然后使用 Contain 判断是否已经放过

    // 更新房间边缘瓦片集
    public void UpdateEdgeTiles(TileType[,] map)
    {
        edgeTiles.Clear();
        
        // 遍历上下左右四格,判断是否有墙
        foreach (Vector2Int tile in tiles)
            for (int i = 0; i < 4; i++)
            {
                int x = tile.x + upDownLeftRight[i, 0];
                int y = tile.y + upDownLeftRight[i, 1];
                if (map[x, y] == TileType.Wall && !edgeTiles.Contains(tile))
                {
                    edgeTiles.Add(tile);
                }
            }
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions