Beispiel #1
0
        public void Initialize(Scratch_TileData correspondingTile, Scratch_TileData destinationTile)
        {
            Parent   = null;
            Passable = (correspondingTile.Type == TileType.Floor) ? true : false;

            //if (correspondingTile.Type == TileType.Door) Passable = correspondingTile.DoorOpened;

            CalculateDistanceToDestination(destinationTile);
        }
Beispiel #2
0
        private void SetTileData()
        {
            TilesRow    = areaTilesRow * areasRow;
            TilesColumn = areaTilesColumn * areasColumn;

            TileData = new Scratch_TileData[TilesRow, TilesColumn];
            for (int z = 0; z < TilesColumn; z++)
            {
                for (int x = 0; x < TilesRow; x++)
                {
                    TileData[x, z] = new Scratch_TileData(x, z);
                }
            }
        }
Beispiel #3
0
        private void Refresh(Scratch_TileData[,] tileData, Scratch_TileData destinationTile)
        {
            openList.Clear();
            closedList.Clear();
            FinalTrack.Clear();
            currentNode = null;

            for (int z = 0; z < column; z++)
            {
                for (int x = 0; x < row; x++)
                {
                    node[x, z].Initialize(tileData[x, z], destinationTile);
                }
            }
        }
Beispiel #4
0
        private void CalculateDistanceToDestination(Scratch_TileData destinationTile)
        {
            int destinationX = destinationTile.X;
            int destinationZ = destinationTile.Z;

            int xDistance = Mathf.Abs(destinationX - X);
            int zDistance = Mathf.Abs(destinationZ - Z);

            if (xDistance - zDistance == 0)
            {
                DistanceToDestination = 14 * zDistance;
            }
            else
            {
                int linearDistance   = Mathf.Abs(xDistance - zDistance);
                int furtherAxis      = (xDistance - zDistance > 0) ? xDistance : zDistance;
                int diagonalDistance = furtherAxis - linearDistance;

                DistanceToDestination = linearDistance * 10 + diagonalDistance * 14;
            }
        }
Beispiel #5
0
        private Vector3 SetHighlighterPosition()
        {
            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;

            if (Physics.Raycast(ray, out hitInfo, 100.0f, 1 << LayerMask.NameToLayer("Tile Map")) == true)
            {
                mouseOnTileX = (int)(hitInfo.point.x + .5f);
                mouseOnTileZ = (int)(hitInfo.point.z + .5f);

                HighlightDoor();

                Scratch_TileData currentTile = mapData.TileData[mouseOnTileX, mouseOnTileZ];

                return(new Vector3((float)currentTile.X, .0f, (float)currentTile.Z));
            }

            mouseOnTileX = invalidIndex;
            mouseOnTileZ = invalidIndex;

            return(Vector3.zero);
        }
Beispiel #6
0
        public bool FindPath(Scratch_TileData[,] tileData, Scratch_TileData startingTile, Scratch_TileData destinationTile, bool doorTile = false)
        {
            Refresh(tileData, destinationTile);

            currentNode = node[startingTile.X, startingTile.Z];

            closedList.Add(currentNode);

            int failureCount = row * column;

            if (doorTile == true)
            {
                node[destinationTile.X, destinationTile.Z].Passable = true;
            }

            while (true)
            {
                for (int z = currentNode.Z - 1; z < currentNode.Z + 2; z++)
                {
                    for (int x = currentNode.X - 1; x < currentNode.X + 2; x++)
                    {
                        if (NodeIndexAvailable(x, z) == false)
                        {
                            continue;
                        }

                        if (node[x, z].Passable == false)
                        {
                            continue;
                        }

                        if (NodeInClosedList(node[x, z]) == true)
                        {
                            continue;
                        }

                        if (NodeInOpenList(node[x, z]) == false)
                        {
                            node[x, z].Parent = currentNode;
                            node[x, z].CalculateCostToDestination();
                            openList.Add(node[x, z]);
                        }
                        else
                        {
                            Node_AStar newData = new Node_AStar(node[x, z]);
                            newData.Parent = currentNode;
                            newData.CalculateCostToDestination();

                            if (newData.CostToDestination < node[x, z].CostToDestination)
                            {
                                node[x, z].Parent = currentNode;
                                node[x, z].CalculateCostToDestination();
                            }
                        }
                    }
                }

                int lowestCost = 99999999;
                for (int i = 0; i < openList.Count; i++)
                {
                    if (openList[i].CostToDestination < lowestCost)
                    {
                        lowestCost  = openList[i].CostToDestination;
                        currentNode = openList[i];
                    }
                }

                if (currentNode == node[destinationTile.X, destinationTile.Z])
                {
                    int whileBreaker = row * column;

                    if (doorTile == true)
                    {
                        currentNode = currentNode.Parent;
                    }

                    while (true)
                    {
                        FinalTrack.Add(currentNode);

                        if (currentNode == node[startingTile.X, startingTile.Z])
                        {
                            FinalTrack.Reverse();
                            return(true);
                        }

                        currentNode = currentNode.Parent;

                        whileBreaker--;
                        if (whileBreaker < 0)
                        {
                            return(false);
                        }
                    }
                }

                openList.Remove(currentNode);
                closedList.Add(currentNode);

                failureCount--;
                if (failureCount < 0)
                {
                    return(false);
                }
            }
        }
Beispiel #7
0
 public Node_AStar(Scratch_TileData correspondingTile)
 {
     X = correspondingTile.X;
     Z = correspondingTile.Z;
 }