Exemplo n.º 1
0
    List <Node> SmoothPath(List <Node> nodeList)
    {
        List <Node> newPath = new List <Node>();

        if (nodeList == null || nodeList.Count == 0)
        {
            return(null);
        }
        Node startingNode = nodeList[0];

        newPath.Add(startingNode);
        for (int i = 0; i < nodeList.Count; i++)
        {
            if (i == nodeList.Count - 1)
            {
                newPath.Add(nodeList[i]);
                continue;
            }
            GridPoints line = new GridPoints(new Vector2(startingNode.gridX, startingNode.gridY), new Vector2(nodeList[i].gridX, nodeList[i].gridY));
            foreach (Vector2 point in line)
            {
                Node currentNodepoint = Pathfinding.instance.grid.grid[(int)point.x, (int)point.y];
                if (!currentNodepoint.walkable)
                {
                    newPath.Add(nodeList[i - 1]);
                    startingNode = nodeList[i - 1];
                }
            }
        }
        return(newPath);
    }
Exemplo n.º 2
0
 public void InitializeMap()
 {
     gridMapSize = GridPoints.UnityToGridCoord(unityMapSize);
     tilesInMap  = new GameObject[unityMapSize.x, unityMapSize.y];
     mapTiles    = new GameObject[unityMapSize.x, unityMapSize.y, 16]; //array with all tiles
     GetSeed();
 }
Exemplo n.º 3
0
    private void CreateGridPoint(int x, int y, int z)
    {
        GameObject gridPoint = Instantiate(TemplatePoint);

        gridPoint.transform.position   = GetGridScaledVector(x, y, z);
        gridPoint.transform.localScale = ObjectScale;
        GridPoints.Add(gridPoint);
    }
Exemplo n.º 4
0
    public static GridPoints UnityToGridCoord(Vector2 unityCoords)
    {
        GridPoints gridPoints = new GridPoints
        {
            x = unityCoords.x * multiplier,
            y = unityCoords.y * multiplier
        };

        return(gridPoints);
    }
Exemplo n.º 5
0
    public static Vector2 GridToUnityCoord(GridPoints gridCoords)
    {
        Vector2 unityCoords = new Vector2
        {
            x = gridCoords.x / multiplier,
            y = gridCoords.y / multiplier
        };

        return(unityCoords);
    }
Exemplo n.º 6
0
    public static GridPoints MousePosToGridPoints(Vector2 mousePosition)
    {
        mousePosition = Camera.main.ScreenToWorldPoint(mousePosition);
        GridPoints gridPoints = new GridPoints
        {
            x = mousePosition.x / multiplier,
            y = mousePosition.y / multiplier
        };

        return(gridPoints);
    }
Exemplo n.º 7
0
    public override void Use()
    {
        MapController mapBuilder = GameObject.Find("GameManager").GetComponent <MapController>();
        GridPoints    mousePos   = GridPoints.MousePosToGridPoints(Input.mousePosition);
        GridPoints    holderPos  = new GridPoints(holder.xTilePos, holder.yTilePos);
        GridPoints    distance   = GridPoints.GridDistance(mousePos, holderPos);

        if (distance.x <= maxDistance && distance.y <= maxDistance)
        {
            mapBuilder.CreateTile(TileSystem.tiles["Wall"], Mathf.RoundToInt(mousePos.x), Mathf.RoundToInt(mousePos.y));
        }
    }
Exemplo n.º 8
0
 public void CombineTilesInMap()
 {
     for (int x = 1; x < unityMapSize.x; x++)
     {
         for (int y = 1; y < unityMapSize.y; y++)
         {
             if (tilesInMap[x, y] != null)
             {
                 CombineTiles(tilesInMap[x, y], GridPoints.UnityToGridCoord(new Vector2(x, y)));
             }
         }
     }
 }
Exemplo n.º 9
0
    public static GridPoints GridDistance(GridPoints coordsToMeasureFrom, GridPoints coordsToMeasureTo)
    {
        GridPoints gridDistance = new GridPoints
        {
            x = coordsToMeasureTo.x - coordsToMeasureFrom.x,
            y = coordsToMeasureTo.y - coordsToMeasureFrom.y
        };

        gridDistance.x = Mathf.Abs(gridDistance.x);
        gridDistance.y = Mathf.Abs(gridDistance.y);

        return(gridDistance);
    }
Exemplo n.º 10
0
 /// <summary>
 /// Clears the grid
 /// </summary>
 public void ClearGrid()
 {
     for (int y = 0; y < GridPoints.GetLength(1); y++)
     {
         for (int x = 0; x < GridPoints.GetLength(0); x++)
         {
             //check if there is an object
             if (GridPoints[x, y].IsOccupied)
             {
                 gameObjects.Remove(GridPoints[x, y].CellObject);
                 GridPoints[x, y].CellObject = null;
             }
         }
     }
 }
Exemplo n.º 11
0
    // check if a tile is there already, if you're adding a ground tile, overwrite old tile
    public bool TileAlreadyThere(GridPoints gridCoords, bool newGroundTile = false)
    {
        Vector2Int unityCoords = Vector2Int.RoundToInt(GridPoints.GridToUnityCoord(gridCoords));

        if (IsInsideBoundaries(unityCoords))
        {
            bool isTileThere = (tilesInMap[unityCoords.x, unityCoords.y] != null && !tilesInMap[unityCoords.x, unityCoords.y].GetComponent <TileObject>().tile.isGroundTile&& !newGroundTile) ? true : false;
            if (newGroundTile)
            {
                RemoveTile(unityCoords.x, unityCoords.y);
            }
            return(isTileThere);
        }

        return(false);
    }
Exemplo n.º 12
0
 public void GenerateGrid()
 {
     if (!gridExist)
     {
         gridExist  = true;
         gridPoints = new GridPoints[col * row];
         for (int i = 0; i < gridPoints.Length; i++)
         {
             gridPoints[i] = new GridPoints(this, i, col, row, spriteWidth, spriteHeight);
         }
         GenerateGridLines();
         GenerateGridTMPro();
     }
     else
     {
         Debug.Log("Grid already exist, aborting grid generation");
     }
 }
Exemplo n.º 13
0
    public static void CreateTile(Tile tile, GridPoints gridPoints)
    {
        Vector2 unityCoords = GridPoints.GridToUnityCoord(gridPoints);

        if (map.IsInsideBoundaries(unityCoords) && !map.TileAlreadyThere(gridPoints, tile.isGroundTile))
        {
            GameObject tileToAdd = new GameObject("Tile", typeof(SpriteRenderer), typeof(TileObject));
            tileToAdd.transform.position = GridPoints.GridToUnityCoord(gridPoints); //TODO gridpoints to vector3 implicit;

            // to render the sprites correctly
            SpriteRenderer spriteRenderer = tileToAdd.GetComponent <SpriteRenderer>();
            spriteRenderer.material = pixelMaterial;

            TileObject tileData = tileToAdd.GetComponent <TileObject>();
            tileData.tile = tile;
            tileToAdd.transform.parent = map.mapHolder.transform;
            map.tilesInMap[gridPoints.intX, gridPoints.intY] = tileToAdd;
        }
        // TODO: MOET FATSOENLIJK GEIMPLEMENTEERD WORDEN
    }
Exemplo n.º 14
0
    public void CreateTile(Tile tile, int xCoord, int yCoord)
    {
        Vector2    coords     = new Vector2(xCoord, yCoord);
        GridPoints gridCoords = GridPoints.UnityToGridCoord(coords);

        if (IsInsideBoundaries(coords) && !TileAlreadyThere(gridCoords, tile.isGroundTile))
        {
            GameObject tileToAdd = new GameObject("Tile", typeof(SpriteRenderer), typeof(TileObject));
            tileToAdd.transform.position = new Vector3(gridCoords.x, gridCoords.y, 0f);

            // to render the sprites correctly
            SpriteRenderer spriteRenderer = tileToAdd.GetComponent <SpriteRenderer>();
            spriteRenderer.material = pixelMaterial;

            TileObject tileData = tileToAdd.GetComponent <TileObject>();
            tileData.tile = tile;
            tileToAdd.transform.parent = mapHolder.transform;
            tilesInMap[xCoord, yCoord] = tileToAdd;
            lastCreatedTile            = tileToAdd;
        }
    }
Exemplo n.º 15
0
    /// <summary>
    /// Gets the nearest point in the gird as a Vector3.
    /// Returns null if passed position is too far out of the grid.
    /// </summary>
    /// <param name="position">The position to get the nearest grid cell</param>
    /// <returns>The nearest grid cell if not outside the grid</returns>
    public CustomGridCell GetGridCellInGrid(Vector3 location)
    {
        //round the x and y of the position to test
        int xPosition = Mathf.RoundToInt(location.x);
        int yPosition = Mathf.RoundToInt(location.y);

        //int zPosition = Mathf.RoundToInt(location.z / Constants.LEVEL_EDITOR_SPACING);

        //bounds check
        if (xPosition < 0 || xPosition > GridPoints.GetLength(0) - 1)
        {
            return(null);
        }
        //y bounds
        else if (yPosition < 0 || yPosition > GridPoints.GetLength(1) - 1)
        {
            return(null);
        }

        //in bounds
        return(GridPoints[xPosition, yPosition]);
    }
Exemplo n.º 16
0
        /**
         * Fill up Grid GridPoints using TriangleList input - Grid information should have been set by SetGridInfo
         *
         * @param	SamplePoints		: Sample Point List
         * @param	TriangleList		: List of triangles
         */
        public void GenerateGridElements(List <BSPoint> SamplePoints, List <BSTriangle> TriangleList)
        {
            if (!(NumGridDivisions.X > 0 && NumGridDivisions.Y > 0))
            {
                return;
            }
            //if(!(GridDimensions.IsValid))

            int TotalNumGridPoints = (int)(NumGridPointsForAxis.X * NumGridPointsForAxis.Y);

            GridPoints.Clear();


            if (SamplePoints.Count == 0 || TriangleList.Count == 0)
            {
                return;
            }

            for (int i = 0; i < TotalNumGridPoints; ++i)
            {
                GridPoints.Add(new GridElement());
            }
            Vector3 GridPointPosition;

            for (int GridPositionX = 0; GridPositionX < NumGridPointsForAxis.X; ++GridPositionX)
            {
                for (int GridPositionY = 0; GridPositionY < NumGridPointsForAxis.Y; ++GridPositionY)
                {
                    BSTriangle  SelectedTriangle = null;
                    GridElement GridPoint        = GridPoints[GridPositionX * (int)NumGridPointsForAxis.Y + GridPositionY];

                    GridPointPosition = GetPosFromIndex(GridPositionX, GridPositionY);

                    Vector3 Weights = Vector3.Zero;
                    if (FindTriangleThisPointBelongsTo(GridPointPosition, ref Weights, ref SelectedTriangle, TriangleList))
                    {
                        // found it
                        GridPoint.Weights[0] = Weights.X;
                        GridPoint.Weights[1] = Weights.Y;
                        GridPoint.Weights[2] = Weights.Z;
                        // need to find sample point index
                        // @todo fix this with better solution
                        // lazy me
                        GridPoint.Indices[0] = SamplePoints.FindIndex((point) => { return(point == SelectedTriangle.Vertices[0]); });
                        GridPoint.Indices[1] = SamplePoints.FindIndex((point) => { return(point == SelectedTriangle.Vertices[1]); });
                        GridPoint.Indices[2] = SamplePoints.FindIndex((point) => { return(point == SelectedTriangle.Vertices[2]); });

                        //check(GridPoint.Indices[0] != INDEX_NONE);
                        //check(GridPoint.Indices[1] != INDEX_NONE);
                        //check(GridPoint.Indices[2] != INDEX_NONE);
                    }
                    else
                    {
                        List <BSSortByDistance> SortedTriangles = new List <BSSortByDistance>();
                        for (int TriangleIndex = 0; TriangleIndex < TriangleList.Count; ++TriangleIndex)
                        {
                            // Check if points are collinear
                            BSTriangle Triangle = TriangleList[TriangleIndex];
                            Vector3    EdgeA    = Triangle.Vertices[1].Position - Triangle.Vertices[0].Position;
                            Vector3    EdgeB    = Triangle.Vertices[2].Position - Triangle.Vertices[0].Position;
                            float      Result   = EdgeA.X * EdgeB.Y - EdgeA.Y * EdgeB.X;
                            // Only add valid triangles
                            if (Result > 0.0f)
                            {
                                SortedTriangles.Add(new BSSortByDistance(TriangleIndex, Triangle.GetDistance(GridPointPosition)));
                            }
                        }

                        if (SortedTriangles.Count > 0)
                        {
                            // SortedTriangles.Sort([](FSortByDistance A, FSortByDistance B) { return A.Distance < B.Distance; });
                            BSTriangle ClosestTriangle = TriangleList[SortedTriangles[0].Index];

                            // For the closest triangle, determine which of its edges is closest to the grid point
                            List <BSSortByDistance> Edges         = new List <BSSortByDistance>();
                            List <Vector3>          PointsOnEdges = new List <Vector3>();
                            for (int EdgeIndex = 0; EdgeIndex < 3; ++EdgeIndex)
                            {
                                Vector3 ClosestPoint = ClosestPointOnLine(ClosestTriangle.Edges[EdgeIndex].Vertices[0].Position, ClosestTriangle.Edges[EdgeIndex].Vertices[1].Position, GridPointPosition);
                                Edges.Add(new BSSortByDistance(EdgeIndex, (ClosestPoint - GridPointPosition).LengthSquared()));
                                PointsOnEdges.Add(ClosestPoint);
                            }
                            //Edges.Sort([](FSortByDistance A, FSortByDistance B) { return A.Distance < B.Distance; });

                            // Calculate weighting using the closest edge points and the clamped grid position on the line
                            Vector3 GridWeights = GetBaryCentric2D(PointsOnEdges[Edges[0].Index], ClosestTriangle.Vertices[0].Position, ClosestTriangle.Vertices[1].Position, ClosestTriangle.Vertices[2].Position);

                            for (int Index = 0; Index < 3; ++Index)
                            {
                                GridPoint.Weights[Index] = GridWeights[Index];
                                GridPoint.Indices[Index] = SamplePoints.FindIndex((point) => { return(point == ClosestTriangle.Vertices[Index]); });
                            }
                        }
                        else
                        {
                            // This means that there is either one point, two points or collinear triangles on the grid
                            if (SamplePoints.Count == 1)
                            {
                                // Just one, fill all grid points to the single sample
                                GridPoint.Weights[0] = 1.0f;
                                GridPoint.Indices[0] = 0;
                            }
                            else
                            {
                                // Two points or co-linear triangles, first find the two closest samples
                                List <BSSortByDistance> SampleDistances = new List <BSSortByDistance>();
                                for (int PointIndex = 0; PointIndex < SamplePoints.Count; ++PointIndex)
                                {
                                    var     vec     = (SamplePoints[PointIndex].Position - GridPointPosition);
                                    Vector2 vector2 = new Vector2(vec.X, vec.Y);
                                    float   DistanceFromSampleToPoint = vector2.LengthSquared();
                                    SampleDistances.Add(new BSSortByDistance(PointIndex, DistanceFromSampleToPoint));
                                }
                                SampleDistances.Sort((A, B) =>
                                {
                                    if (A.Distance == B.Distance)
                                    {
                                        return(0);
                                    }
                                    return(A.Distance > B.Distance ? 1 : -1);
                                });

                                // Find closest point on line between the two samples (clamping the grid position to the line, just like clamping to the triangle edges)
                                BSPoint[] Samples = new BSPoint[2];
                                Samples[0] = SamplePoints[SampleDistances[0].Index];
                                Samples[1] = SamplePoints[SampleDistances[1].Index];
                                Vector3 ClosestPointOnTheLine = ClosestPointOnLine(Samples[0].Position, Samples[1].Position, GridPointPosition);

                                var     temp        = (Samples[0].Position - Samples[1].Position);
                                Vector2 tempVector2 = new Vector2(temp.X, temp.Y);
                                float   LineLength  = tempVector2.LengthSquared();

                                // Weight the samples according to the distance from the grid point on the line to the samples
                                for (int SampleIndex = 0; SampleIndex < 2; ++SampleIndex)
                                {
                                    var thelength3D = (Samples[SampleIndex].Position - ClosestPointOnTheLine);
                                    var thelength2D = new Vector2(thelength3D.X, thelength3D.Y);
                                    GridPoint.Weights[SampleIndex] = (LineLength - thelength2D.LengthSquared()) / LineLength;
                                    GridPoint.Indices[SampleIndex] = SamplePoints.FindIndex((point) => { return(point == Samples[SampleIndex]); });
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 17
0
    public void CombineTiles(GameObject tileToChange, GridPoints gridCoords)
    {
        Tile           tile = tileToChange.GetComponent <TileObject>().tile;
        SpriteRenderer SR   = tileToChange.GetComponent <SpriteRenderer>();

        if (tile.combinable)
        {
            Vector2   unityCoords   = GridPoints.GridToUnityCoord(gridCoords);
            Vector2[] coordsToCheck = new Vector2[]
            {
                new Vector2(unityCoords.x, unityCoords.y + 1),
                new Vector2(unityCoords.x + 1, unityCoords.y + 1),
                new Vector2(unityCoords.x + 1, unityCoords.y),
                new Vector2(unityCoords.x + 1, unityCoords.y - 1),
                new Vector2(unityCoords.x, unityCoords.y - 1),
                new Vector2(unityCoords.x - 1, unityCoords.y - 1),
                new Vector2(unityCoords.x - 1, unityCoords.y),
                new Vector2(unityCoords.x - 1, unityCoords.y + 1)
            };

            List <Direction> td = new List <Direction>();
            int i = 0;

            foreach (Vector2 coordToCheck in coordsToCheck)
            {
                if (IsInsideBoundaries(coordToCheck))
                {
                    float unityXCoord = coordToCheck.x;
                    float unityYCoord = coordToCheck.y;
                    if (tilesInMap[Mathf.RoundToInt(unityXCoord), Mathf.RoundToInt(unityYCoord)].GetComponent <TileObject>().tile == tile)
                    {
                        td.Add((Direction)i);
                    }
                }
                i++;
            }

            SR.sprite = tile.sprites[6];

            // top left
            if (!td.Contains(Direction.top) && !td.Contains(Direction.left) && td.Contains(Direction.bottom) && td.Contains(Direction.bottomRight) && td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[0];
            }

            // top
            if (!td.Contains(Direction.top) && td.Contains(Direction.left) && td.Contains(Direction.bottomLeft) && td.Contains(Direction.bottom) && td.Contains(Direction.bottomRight) && td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[1];
            }

            // top right
            if (!td.Contains(Direction.top) && !td.Contains(Direction.right) && td.Contains(Direction.bottom) && td.Contains(Direction.bottomLeft) && td.Contains(Direction.left))
            {
                SR.sprite = tile.sprites[2];
            }

            // left
            if (!td.Contains(Direction.left) && td.Contains(Direction.top) && td.Contains(Direction.topRight) && td.Contains(Direction.bottom) && td.Contains(Direction.bottomRight) && td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[5];
            }

            // right
            if (!td.Contains(Direction.right) && td.Contains(Direction.top) && td.Contains(Direction.topLeft) && td.Contains(Direction.bottom) && td.Contains(Direction.bottomLeft) && td.Contains(Direction.left))
            {
                SR.sprite = tile.sprites[7];
            }

            // bottom left
            if (!td.Contains(Direction.bottom) && !td.Contains(Direction.left) && td.Contains(Direction.top) && td.Contains(Direction.topRight) && td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[10];
            }

            //bottom
            if (!td.Contains(Direction.bottom) && td.Contains(Direction.left) && td.Contains(Direction.topLeft) && td.Contains(Direction.top) && td.Contains(Direction.topRight) && td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[11];
            }

            // bottom right
            if (!td.Contains(Direction.bottom) && !td.Contains(Direction.right) && td.Contains(Direction.top) && td.Contains(Direction.topLeft) && td.Contains(Direction.left))
            {
                SR.sprite = tile.sprites[12];
            }

            // inner top left
            if (td.Count == 7 && !td.Contains(Direction.topLeft))
            {
                SR.sprite = tile.sprites[17];
            }

            // inner top
            if (td.Count == 6 && !td.Contains(Direction.topRight) && !td.Contains(Direction.topLeft))
            {
                SR.sprite = tile.sprites[16];
            }

            // inner top right
            if (td.Count == 7 && !td.Contains(Direction.topRight))
            {
                SR.sprite = tile.sprites[15];
            }

            // inner left
            if (td.Count == 6 && !td.Contains(Direction.bottomLeft) && !td.Contains(Direction.topLeft))
            {
                SR.sprite = tile.sprites[23];
            }

            // inner right
            if (td.Count == 6 && !td.Contains(Direction.bottomRight) && !td.Contains(Direction.topRight))
            {
                SR.sprite = tile.sprites[18];
            }

            // inner bottom left
            if (td.Count == 7 && !td.Contains(Direction.bottomLeft))
            {
                SR.sprite = tile.sprites[20];
            }

            // inner bottom
            if (td.Count == 6 && !td.Contains(Direction.bottomRight) && !td.Contains(Direction.bottomLeft))
            {
                SR.sprite = tile.sprites[21];
            }

            // inner bottom right
            if (td.Count == 7 && !td.Contains(Direction.bottomRight))
            {
                SR.sprite = tile.sprites[22];
            }

            // single top
            if (td.Contains(Direction.bottom) && !td.Contains(Direction.left) && !td.Contains(Direction.right) && !td.Contains(Direction.top))
            {
                SR.sprite = tile.sprites[8];
            }

            // single left
            if (td.Contains(Direction.right) && !td.Contains(Direction.top) && !td.Contains(Direction.bottom) && !td.Contains(Direction.left))
            {
                SR.sprite = tile.sprites[9];
            }

            // single right
            if (td.Contains(Direction.left) && !td.Contains(Direction.top) && !td.Contains(Direction.bottom) && !td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[14];
            }

            // single bottom
            if (td.Contains(Direction.top) && !td.Contains(Direction.left) && !td.Contains(Direction.right) && !td.Contains(Direction.bottom))
            {
                SR.sprite = tile.sprites[13];
            }

            // horizontal
            if (td.Contains(Direction.left) && td.Contains(Direction.right) && !td.Contains(Direction.top) && !td.Contains(Direction.bottom))
            {
                SR.sprite = tile.sprites[4];
            }

            // vertical
            if (td.Contains(Direction.top) && td.Contains(Direction.bottom) && !td.Contains(Direction.left) && !td.Contains(Direction.right))
            {
                SR.sprite = tile.sprites[3];
            }

            /*
             * // left bottom corner straight
             * if (td.Contains(Direction.top) && td.Contains(Direction.right) && td.Contains(Direction.topRight) && td.Contains(Direction.bottom) && !td.Contains(Direction.left) && !td.Contains(Direction.bottomRight))
             * {
             *  SR.sprite = tile.sprites[23];
             * }
             *
             * // right bottom corner straight
             * if (td.Contains(Direction.top) && td.Contains(Direction.left) && td.Contains(Direction.topLeft) && td.Contains(Direction.bottom) && !td.Contains(Direction.right) && !td.Contains(Direction.bottomLeft))
             * {
             *  SR.sprite = tile.sprites[24];
             * }
             *
             * // left top corner straight
             * if (td.Contains(Direction.bottom) && td.Contains(Direction.right) && td.Contains(Direction.bottomRight) && td.Contains(Direction.top) && !td.Contains(Direction.left) && !td.Contains(Direction.topRight))
             * {
             *  SR.sprite = tile.sprites[25];
             * }
             *
             * // right top corner straight
             * if (td.Contains(Direction.bottom) && td.Contains(Direction.left) && td.Contains(Direction.bottomLeft) && td.Contains(Direction.top) && !td.Contains(Direction.right) && !td.Contains(Direction.topLeft))
             * {
             *  SR.sprite = tile.sprites[26];
             * }*/

            // center
            if (td.Count == 8)
            {
                SR.sprite = tile.sprites[6];
            }

            // single tile
            if (!td.Contains(Direction.left) && !td.Contains(Direction.right) && !td.Contains(Direction.top) && !td.Contains(Direction.bottom))
            {
                SR.sprite = tile.sprites[19];
            }
        }
    }
Exemplo n.º 18
0
 public void Reset()
 {
     GridPoints.Clear();
 }