Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / tileSet / TerrainPeering.cs
@小李xl 小李xl on 27 Dec 2023 2 KB 地牢新版地形开发中

using Godot;

/// <summary>
/// 地形掩码
/// </summary>
public static class TerrainPeering
{
    /// <summary>
    /// 无
    /// </summary>
    public const uint None = 0;
    /// <summary>
    /// 左上
    /// </summary>
    public const uint LeftTop = 0b1;
    /// <summary>
    /// 上
    /// </summary>
    public const uint Top = 0b10;
    /// <summary>
    /// 右上
    /// </summary>
    public const uint RightTop = 0b100;
    /// <summary>
    /// 左
    /// </summary>
    public const uint Left = 0b1000;
    /// <summary>
    /// 中心
    /// </summary>
    public const uint Center = 0b10000;
    /// <summary>
    /// 右
    /// </summary>
    public const uint Right = 0b100000;
    /// <summary>
    /// 左下
    /// </summary>
    public const uint LeftBottom = 0b1000000;
    /// <summary>
    /// 下
    /// </summary>
    public const uint Bottom = 0b10000000;
    /// <summary>
    /// 右下
    /// </summary>
    public const uint RightBottom = 0b100000000;

    /// <summary>
    /// 获取地形掩码值
    /// </summary>
    public static uint GetTerrainPeeringValue(this TileData tileData)
    {
        if (tileData.Terrain != -1 && tileData.TerrainSet != -1)
        {
            var value = Center;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner) >= 0)
                value |= LeftTop;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopSide) >= 0)
                value |= Top;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner) >= 0)
                value |= RightTop;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide) >= 0)
                value |= Left;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.RightSide) >= 0)
                value |= Right;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner) >= 0)
                value |= LeftBottom;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide) >= 0)
                value |= Bottom;
            if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner) >= 0)
                value |= RightBottom;
            return value;
        }

        return None;
    }
}