public bool Fire(Shot shot) { //Attempt to raise event on specified tile if (!TileDictionary.ContainsKey(shot.Coordinate)) { return(false); } var tile = TileDictionary[shot.Coordinate]; tile?.OnHit?.Invoke(shot.PlayerName, shot.Coordinate); //Check the resulting status of the specified tile switch (tile?.Status ?? default(TileStatus)) { case TileStatus.Hit: case TileStatus.Sunk: return(true); case TileStatus.OpenOcean: case TileStatus.Ship: case TileStatus.Miss: default: if (tile != null) { tile.Status = TileStatus.Miss; } return(false); } }
/// <summary> /// Fills tiles with given textureid /// </summary> /// <param name="tile"></param> /// <param name="targetTexture"></param> /// <param name="replacementTexture"></param> public void FillTiles(Point tile, int targetTexture) { if (!_gridHandler.IsTileInsideGrid(tile)) { return; } if (!TileDictionary.ContainsKey(tile)) { AddTile(tile, -1); } if (targetTexture == SelectedTileTextureId) { RemoveNegativeTileTextureId(tile); return; } if (TileDictionary[tile].TextureId != targetTexture) { RemoveNegativeTileTextureId(tile); return; } TileDictionary[tile].TextureId = SelectedTileTextureId; FillTiles(new Point(tile.X + 1, tile.Y), targetTexture); FillTiles(new Point(tile.X, tile.Y + 1), targetTexture); FillTiles(new Point(tile.X - 1, tile.Y), targetTexture); FillTiles(new Point(tile.X, tile.Y - 1), targetTexture); }
/// <summary> /// Add borders to neighbouring tiles if in the same group /// </summary> /// <param name="tile"></param> private void AddBorders(Point tile, int groupId) { if (BorderControlled.Contains(tile)) { return; } if (!_gridHandler.IsTileInsideGrid(tile)) { return; } if (!TileDictionary.ContainsKey(tile)) { return; } if (!TilePropertyDictionary.ContainsKey(GetTile(tile).TextureId)) { return; } if (GetTileProperty(GetTile(tile).TextureId).GroupId != groupId) { return; } if (GetTileProperty(GetTile(tile).TextureId).GroupId == -1 || groupId == -1) { return; } Point TileTop = new Point(tile.X, tile.Y - 1); Point TileBottom = new Point(tile.X, tile.Y + 1); Point TileLeft = new Point(tile.X - 1, tile.Y); Point TileRight = new Point(tile.X + 1, tile.Y); int groupPosition = CalculateGroupPosition( GetTileGroup(TileTop) == groupId ? true : false, GetTileGroup(TileBottom) == groupId ? true : false, GetTileGroup(TileLeft) == groupId ? true : false, GetTileGroup(TileRight) == groupId ? true : false ); if (groupPosition == -1) { return; } int newTextureId = FindTilePropertyWithGroupPosition(groupId, groupPosition); if (newTextureId == -1) { return; } TileDictionary[tile].TextureId = newTextureId; BorderControlled.Add(tile); // Recursion ?! AddBorders(TileTop, groupId); AddBorders(TileBottom, groupId); AddBorders(TileLeft, groupId); AddBorders(TileRight, groupId); }
/// <summary> /// Returns the tile at given point /// </summary> /// <param name="tile"></param> /// <returns></returns> public Tile GetTile(Point position) { if (!TileDictionary.ContainsKey(position)) { return(null); } return(TileDictionary[position]); }
/// <summary> /// 构建当前缩放层级的瓦片 /// </summary> /// <param name="bound"></param> /// <param name="zoom"></param> void Build(GBound bound, int zoom) { int _tileSize = Projection.TileSize; //构建裁剪边界的矩形,用于整体裁剪 IGeometry _boundGeometry = bound.ToInsertPolygon(); //瓦片多尺度缓存 if (TileDictionary.ContainsKey(zoom)) { TileDictionary[zoom].Clear(); } else { TileDictionary[zoom] = new List <GTileElement>(); } //1.获取坐上右下坐标 Coordinate p0 = bound.Min; Coordinate p1 = bound.Max; //2.分尺度计算格网位置 //2.1 转换成尺度下的pixel Coordinate min = Projection.LatlngToPoint(p0, zoom); Coordinate max = Projection.LatlngToPoint(p1, zoom); //2.2 计算pixel下边界范围 GBound pixelBound = new GBound(new List <Coordinate>() { min, max }); //2.3 通过pixelbound计算range GBound range = new GBound(new List <Coordinate>() { new Coordinate((int)Math.Floor(pixelBound.Min.X / _tileSize), (int)Math.Floor(pixelBound.Min.Y / _tileSize)), new Coordinate((int)Math.Ceiling(pixelBound.Max.X / _tileSize) - 1, (int)Math.Ceiling(pixelBound.Max.Y / _tileSize) - 1), }); //2.3统计区域内瓦片的编号,边界经纬度等信息 for (int j = Convert.ToInt32(range.Min.Y); j <= Convert.ToInt32(range.Max.Y); j++) { for (int i = Convert.ToInt32(range.Min.X); i <= Convert.ToInt32(range.Max.X); i++) { //反算每块瓦片的边界经纬度 List <Coordinate> coordinates = new List <Coordinate>(); coordinates.Add(Projection.PointToLatLng(new Coordinate(i * 256, j * 256), zoom)); coordinates.Add(Projection.PointToLatLng(new Coordinate(i * 256 + 256, j * 256 + 256), zoom)); // GTileElement tile = new GTileElement() { X = i, Y = j, Z = zoom, Bound = new GBound(coordinates) }; TileDictionary[zoom].Add(tile); } } }
/// <summary> /// Removes tile at given position /// </summary> /// <param name="position"></param> public void RemoveTile(Point position) { if (position == new Point(-1, -1)) { return; } if (TileDictionary.ContainsKey(position)) { TileDictionary.Remove(position); return; } }
public void RemoveTile(Vector3Int cellPos) { if (Application.isPlaying || !Application.isEditor) { return; } if (tiles.ContainsKey(cellPos)) { TileData tile = tiles[cellPos]; tiles.Remove(cellPos); DestroyImmediate(tile.obj); } }
private Node GetNode(MapPosition position) { if (nodeMap.ContainsKey(position)) { return(nodeMap[position]); } var node = GenerateNode(position); if (node == null) { nodeMap[position] = null; return(null); } if (node.Walkable) { GetPlatform(node).AddNode(node); } nodeMap[position] = node; return(node); }
/// <summary> /// Add tile with textureid /// </summary> /// <param name="position"></param> /// <param name="textureId"></param> public void AddTile(Point position, int textureId) { if (position == new Point(-1, -1)) { return; } int tilePropertyId = (textureId == -1) ? SelectedTileTextureId : textureId; if (!TilePropertyDictionary.ContainsKey(tilePropertyId)) { CreateTileProperty(tilePropertyId); } if (TileDictionary.ContainsKey(position)) { TileDictionary[position].TextureId = textureId; StartAddBorders(position, TilePropertyDictionary[tilePropertyId].GroupId); return; } TileDictionary[position] = new Tile(position, textureId); StartAddBorders(position, TilePropertyDictionary[tilePropertyId].GroupId); }