Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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]);
        }
Exemplo n.º 5
0
        /// <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);
                }
            }
        }
Exemplo n.º 6
0
        /// <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;
            }
        }
Exemplo n.º 7
0
 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);
     }
 }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        /// <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);
        }