public GameObject getObjectAtPosition(GridPosition position)
 {
     foreach (GameObject unit in playerUnits)
     {
         UnitController unitController = unit.GetComponent <UnitController>();
         if (position.Equals(unitController.position))
         {
             return(unit);
         }
     }
     foreach (GameObject unit in enemyUnits)
     {
         UnitController unitController = unit.GetComponent <UnitController>();
         if (position.Equals(unitController.position))
         {
             return(unit);
         }
     }
     return(null);
 }
Esempio n. 2
0
    public List <GridPosition> getBestPath(GridPosition start, GridPosition goal, int maxMovement, int maxJump)
    {
        List <GridPosition> path = new List <GridPosition>();
        int closestDistace       = 999;

        for (int i = 0; i < maxMovement; i++)
        {
            GridPosition up    = getGridPositionFromCoord(0, 1);
            GridPosition left  = getGridPositionFromCoord(-1, 0);
            GridPosition right = getGridPositionFromCoord(1, 0);
            GridPosition down  = getGridPositionFromCoord(0, -1);

            if (!up.Equals(new GridPosition(0, 0)))
            {
                int tempDistance = IsometricHelper.distanceBetweenGridPositions(up, goal);
                if (tempDistance < closestDistace)
                {
                    closestDistace = tempDistance;
                    path[i]        = up;
                }
            }
            if (!left.Equals(new GridPosition(0, 0)))
            {
                int tempDistance = IsometricHelper.distanceBetweenGridPositions(left, goal);
                if (tempDistance < closestDistace)
                {
                    closestDistace = tempDistance;
                    path[i]        = left;
                }
            }
            if (!right.Equals(new GridPosition(0, 0)))
            {
                int tempDistance = IsometricHelper.distanceBetweenGridPositions(right, goal);
                if (tempDistance < closestDistace)
                {
                    closestDistace = tempDistance;
                    path[i]        = right;
                }
            }
            if (!down.Equals(new GridPosition(0, 0)))
            {
                int tempDistance = IsometricHelper.distanceBetweenGridPositions(down, goal);
                if (tempDistance < closestDistace)
                {
                    closestDistace = tempDistance;
                    path[i]        = down;
                }
            }
        }

        return(path);
    }
Esempio n. 3
0
            /// <summary>
            /// そのグリッドに存在するUnitを返す
            /// </summary>
            /// <param name="grid"></param>
            /// <returns></returns>
            public UnitBaseController FindUnitByGrid(GridPosition grid)
            {
                if (!CheckAnyUnitExistByGrid(grid))
                {
                    return(null);
                }

                foreach (var item in m_unitPosition)
                {
                    if (grid.Equals(item.Value))
                    {
                        return(UnitManager.Instance.unitBaseControllers[item.Key]);
                    }
                }
                return(null);
            }
Esempio n. 4
0
    private void DoUpdate()
    {
        GridPosition currentChunkPosition = GetChunkPositionFromRealPosition();

        if (!currentChunkPosition.Equals(Position))
        {
            _LastI   = 0;
            Position = currentChunkPosition;
            _Done    = false;
        }

        if (!_Done)
        {
            LoadChunksInRange(Position);
        }
    }
        private Move?GetMoveForDirection(GridPosition position, Direction direction)
        {
            var offset = GetOffsetForDirection(direction);

            GridPosition endPosition     = position;
            GridPosition testingPosition = position;

            while (true)
            {
                testingPosition = endPosition.Plus(offset);

                var tile = GetTileForPosition(testingPosition);
                if (tile == null)
                {
                    throw new Exception("Invalid tile position used for solving calculations");
                }

                if (tile == Tile.Wall)
                {
                    break;
                }
                else if (tile == Tile.Target)
                {
                    endPosition = testingPosition;
                    break;
                }
                else
                {
                    endPosition = testingPosition;
                }
            }

            if (endPosition.Equals(position))
            {
                // Haven't actually moved anywhere, return null
                return(null);
            }

            return(new Move(position, endPosition, direction));
        }
Esempio n. 6
0
        //Ověření kolizí a umístění lodi
        public PlacementType CanBePlaced(List <GridPosition> occupied, GridPosition start, GridPosition end, ShipType shipType)
        {
            List <GridPosition> newGridPositions = new List <GridPosition>();
            PlacementType       response;
            int length = 0;

            //Solo
            if (start.Equals(end))
            {
                length = 1;
                newGridPositions.Add(new GridPosition(start.X, start.Y));
                response = PlacementType.Solo;
            }
            //Horizontal
            else if (start.Y == end.Y)
            {
                for (int x = start.X; x <= end.X; x++)
                {
                    newGridPositions.Add(new GridPosition(x, start.Y));
                    length++;
                }

                response = PlacementType.Horizontal;
            }
            //Vertical
            else if (start.X == end.X)
            {
                for (int y = start.Y; y <= end.Y; y++)
                {
                    newGridPositions.Add(new GridPosition(start.X, y));
                    length++;
                }

                response = PlacementType.Vertical;
            }
            //Invalid
            else
            {
                response = PlacementType.Invalid;
            }

            //Check if already exists
            if (occupied.Intersect(newGridPositions).Any())
            {
                response = PlacementType.Occupied;
            }

            //Check length
            if (shipType == ShipType.None)
            {
                response = PlacementType.Invalid;
            }
            if (shipType == ShipType.Destroyer && length != 1)
            {
                response = PlacementType.Invalid;
            }
            if (shipType == ShipType.Submarine && length != 2)
            {
                response = PlacementType.Invalid;
            }
            if (shipType == ShipType.Cruiser && length != 3)
            {
                response = PlacementType.Invalid;
            }
            if (shipType == ShipType.Battleship && length != 4)
            {
                response = PlacementType.Invalid;
            }
            if (shipType == ShipType.Carrier && length != 5)
            {
                response = PlacementType.Invalid;
            }

            return(response);
        }
Esempio n. 7
0
    public List <List <GridPosition> > getPossibleMovesFromPositon(List <GridPosition> path, int maxJump, bool isPlayer)
    {
        List <List <GridPosition> > paths = new List <List <GridPosition> >();
        GridPosition position             = path[path.Count - 1];
        GridPosition up    = getGridPositionFromCoord(position.x, position.y + 1);
        GridPosition left  = getGridPositionFromCoord(position.x - 1, position.y);
        GridPosition right = getGridPositionFromCoord(position.x + 1, position.y);
        GridPosition down  = getGridPositionFromCoord(position.x, position.y - 1);

        if (!up.Equals(new GridPosition(0, 0)))
        {
            if (Math.Abs(up.elevation - position.elevation) <= maxJump && !blockingEffectPositions.Contains(up))
            {
                List <GridPosition> possibleMoves = path;
                if (isPlayer && !enemyUnitPositions.Contains(up))
                {
                    possibleMoves.Add(up);
                    paths.Add(possibleMoves);
                }
                else if (!playerUnitPositions.Contains(up))
                {
                    possibleMoves.Add(up);
                    paths.Add(possibleMoves);
                }
            }
        }
        if (!left.Equals(new GridPosition(0, 0)))
        {
            if (Math.Abs(left.elevation - position.elevation) <= maxJump && !blockingEffectPositions.Contains(left))
            {
                List <GridPosition> possibleMoves = path;
                if (isPlayer && !enemyUnitPositions.Contains(left))
                {
                    possibleMoves.Add(left);
                    paths.Add(possibleMoves);
                }
                else if (!playerUnitPositions.Contains(left))
                {
                    possibleMoves.Add(left);
                    paths.Add(possibleMoves);
                }
            }
        }
        if (!right.Equals(new GridPosition(0, 0)))
        {
            if (Math.Abs(right.elevation - position.elevation) <= maxJump && !blockingEffectPositions.Contains(right))
            {
                List <GridPosition> possibleMoves = path;
                if (isPlayer && !enemyUnitPositions.Contains(right))
                {
                    possibleMoves.Add(right);
                    paths.Add(possibleMoves);
                }
                else if (!playerUnitPositions.Contains(right))
                {
                    possibleMoves.Add(right);
                    paths.Add(possibleMoves);
                }
            }
        }
        if (!down.Equals(new GridPosition(0, 0)))
        {
            if (Math.Abs(down.elevation - position.elevation) <= maxJump && !blockingEffectPositions.Contains(down))
            {
                List <GridPosition> possibleMoves = path;
                if (isPlayer && !enemyUnitPositions.Contains(down))
                {
                    possibleMoves.Add(down);
                    paths.Add(possibleMoves);
                }
                else if (!playerUnitPositions.Contains(down))
                {
                    possibleMoves.Add(down);
                    paths.Add(possibleMoves);
                }
            }
        }

        return(paths);
    }
Esempio n. 8
0
 public void MakePath()
 {
     if (Input.mousePresent)
     {
         Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit, 300f))  //Physics.Raycast(ray, out hit, 300f, LayerMask.NameToLayer("Chess Grid")) 按理说可以过滤其他层,可是这时只有离摄像头近的有效,很奇怪
         {
             Debug.DrawLine(ray.origin, hit.point);
             GridPosition newPosition = new GridPosition(hit.point);
             Pair         UV          = new Pair(newPosition);
             if (!UV.Equals(turnPair) && grids[UV].activeSelf /*hit.collider.CompareTag("Grid") 效果不好*/)  //Pair的其他值可能不一样要用自定义的Equals
             {
                 if (!mousePosition.Equals(newPosition))
                 {
                     mousePosition = newPosition;
                     ExtinguishPath();
                     if (!grids[UV].GetComponent <GridAttribute>().isUnit)
                     {
                         LightPath(new Pair(mousePosition));
                     }
                     if (neighbourGrid != GridPosition.NeighbourGrid.M)
                     {
                         neighbourGrid = GridPosition.NeighbourGrid.M;
                     }
                 }
                 else if (grids[UV].GetComponent <GridAttribute>().isUnit) //处理敌方单位
                 {
                     if (attackFlag)                                       //近战攻击
                     {
                         if (Input.GetMouseButton(0))                      //进行攻击
                         {
                             turnControler.MoveUnit(gridQueue.ToArray());
                             attackUV = new Pair(mousePosition);
                             turnControler.AttackUnit(attackUV);
                             ExtinguishPath();
                             SleepGrid();
                             flag = true;
                         }
                         else                            //攻击前选择方向
                         {
                             Vector3 gridVector = mousePosition.GetPosition();
                             if (hit.point.x < gridVector.x - 0.16f && hit.point.z < gridVector.z - 0.16f)
                             {
                                 LightPathByNeighbour(GridPosition.NeighbourGrid.SW);
                             }
                             else if (hit.point.x + hit.point.z <= 1f && hit.point.x <= gridVector.x + 0.16f && hit.point.z <= gridVector.z + 0.16f)
                             {
                                 if (hit.point.x >= hit.point.z)
                                 {
                                     LightPathByNeighbour(GridPosition.NeighbourGrid.S);
                                 }
                                 else
                                 {
                                     LightPathByNeighbour(GridPosition.NeighbourGrid.W);
                                 }
                             }
                             else if (hit.point.x < gridVector.x - 0.16f && hit.point.z > gridVector.z + 0.16f)
                             {
                                 LightPathByNeighbour(GridPosition.NeighbourGrid.NW);
                             }
                             else if (hit.point.x > gridVector.x + 0.16f && hit.point.z < gridVector.z - 0.16f)
                             {
                                 LightPathByNeighbour(GridPosition.NeighbourGrid.SE);
                             }
                             else if (hit.point.x > gridVector.x + 0.16f && hit.point.z > gridVector.z + 0.16f)
                             {
                                 LightPathByNeighbour(GridPosition.NeighbourGrid.NE);
                             }
                             else
                             {
                                 if (hit.point.x >= hit.point.z)
                                 {
                                     LightPathByNeighbour(GridPosition.NeighbourGrid.E);
                                 }
                                 else
                                 {
                                     LightPathByNeighbour(GridPosition.NeighbourGrid.N);
                                 }
                             }
                         }
                     }
                     else                                              //远程攻击
                     {
                         turnControler.exceptMelee();
                     }
                 }
                 else if (Input.GetMouseButton(0))
                 {
                     turnControler.MoveUnit(gridQueue.ToArray());
                     ExtinguishPath();
                     SleepGrid();
                     flag = true;
                 }
             }
             else
             {
                 ExtinguishPath();
             }
         }
     }
 }
Esempio n. 9
0
 public void EqualsTest(GridPosition v1, GridPosition v2)
 {
     Assert.True(v1.Equals(v2), "Vector3i.Equals(Vector3i) failed");
     Assert.True(v1.Equals((object)v2), "Vector3i.Equals(object) failed");
 }