예제 #1
0
    protected static void AddBorderToTerritory(HexTile tile, RelativeTilePosition relPos, float radius, float territoryBorderYPos, float halfWidth,
                                               ref List <Vector3> vertices, ref List <Vector3> normals, ref List <Vector2> UV, ref List <int> triangles,
                                               TriangleUVTweak tweakUVs = TriangleUVTweak.NoTweak)
    {
        Vector3 worldPos = tile.Grid.ToPixel(tile.Pos);

        Vector3 botRight = new Vector3(worldPos.x + (radius / 2), territoryBorderYPos, worldPos.z - halfWidth);    // botRight
        Vector3 right    = new Vector3(worldPos.x + radius, territoryBorderYPos, worldPos.z);                      // right
        Vector3 topRight = new Vector3(worldPos.x + (radius / 2), territoryBorderYPos, worldPos.z + halfWidth);    // topRight
        Vector3 topLeft  = new Vector3(worldPos.x + (-radius / 2), territoryBorderYPos, worldPos.z + halfWidth);   // topLeft
        Vector3 left     = new Vector3(worldPos.x + (-radius), territoryBorderYPos, worldPos.z);                   // left
        Vector3 botLeft  = new Vector3(worldPos.x + (-radius / 2), territoryBorderYPos, worldPos.z - halfWidth);   // botLeft
        Vector3 center   = new Vector3(worldPos.x, territoryBorderYPos, worldPos.z);                               // center

        Vector3 v1 = new Vector3();
        Vector3 v2 = new Vector3();
        Vector3 v3 = center;

        switch (relPos)
        {
        case RelativeTilePosition.Bot:      v1 = botLeft;  v2 = botRight; break;

        case RelativeTilePosition.BotRight: v1 = botRight; v2 = right;    break;

        case RelativeTilePosition.TopRight: v1 = right;    v2 = topRight; break;

        case RelativeTilePosition.Top:      v1 = topRight; v2 = topLeft;  break;

        case RelativeTilePosition.TopLeft:  v1 = topLeft;  v2 = left;     break;

        case RelativeTilePosition.BotLeft:  v1 = left;     v2 = botLeft;  break;
        }
        AddTriangle(v1, v2, v3, ref vertices, ref normals, ref UV, ref triangles, tweakUVs);
    }
예제 #2
0
    protected static void AddSideBorders(RelativeTilePosition left, RelativeTilePosition right,
                                         float radius, float territoryBorderYPos, float halfWidth,
                                         List <RelativeTilePosition> bordersAdded, HexTile tile,
                                         ref List <Vector3> vertices, ref List <Vector3> normals, ref List <Vector2> UV,
                                         ref List <int> triangles, bool invertUVs)
    {
        bool rightFound = false;
        bool leftFound  = false;

        for (int k = 0; k < bordersAdded.Count; k++)
        {
            if (bordersAdded[k] == right)
            {
                rightFound = true;
            }
            else if (bordersAdded[k] == left)
            {
                leftFound = true;
            }
        }

        if (!leftFound)
        {
            if (invertUVs)
            {
                AddBorderToTerritory(tile, left, radius, territoryBorderYPos, halfWidth, ref vertices, ref normals, ref UV, ref triangles, TriangleUVTweak.TweakLeft);
            }
            else
            {
                AddBorderToTerritory(tile, left, radius, territoryBorderYPos, halfWidth, ref vertices, ref normals, ref UV, ref triangles, TriangleUVTweak.TweakRight);
            }
        }
        if (!rightFound)
        {
            if (invertUVs)
            {
                AddBorderToTerritory(tile, right, radius, territoryBorderYPos, halfWidth, ref vertices, ref normals, ref UV, ref triangles, TriangleUVTweak.TweakRight);
            }
            else
            {
                AddBorderToTerritory(tile, right, radius, territoryBorderYPos, halfWidth, ref vertices, ref normals, ref UV, ref triangles, TriangleUVTweak.TweakLeft);
            }
        }
    }
예제 #3
0
    protected static HexTile GetTileNeighbour(HexGrid grid, Vector2 tilePos, RelativeTilePosition relPos)
    {
        Vector2 posToCheck = new Vector2();

        switch (relPos)
        {
        case RelativeTilePosition.Bot:
            posToCheck = new Vector2(tilePos.x, tilePos.y - 1);
            break;

        case RelativeTilePosition.BotRight:
            posToCheck = (tilePos.x % 2 == 0) ? new Vector2(tilePos.x + 1, tilePos.y - 1) : new Vector2(tilePos.x + 1, tilePos.y);
            break;

        case RelativeTilePosition.TopRight:
            posToCheck = (tilePos.x % 2 == 0) ? new Vector2(tilePos.x + 1, tilePos.y) : new Vector2(tilePos.x + 1, tilePos.y + 1);
            break;

        case RelativeTilePosition.Top:
            posToCheck = new Vector2(tilePos.x, tilePos.y + 1);
            break;

        case RelativeTilePosition.TopLeft:
            posToCheck = (tilePos.x % 2 == 0) ? new Vector2(tilePos.x - 1, tilePos.y) : new Vector2(tilePos.x - 1, tilePos.y + 1);
            break;

        case RelativeTilePosition.BotLeft:
            posToCheck = (tilePos.x % 2 == 0) ? new Vector2(tilePos.x - 1, tilePos.y - 1) : new Vector2(tilePos.x - 1, tilePos.y);
            break;
        }

        HexTile neighbour = null;

        grid.Tiles.TryGetValue(posToCheck, out neighbour);
        return(neighbour);
    }