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); }
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); }
/// <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); }
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)); }
//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); }
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); }
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(); } } } }
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"); }