コード例 #1
0
 public AutoTile GetAutoTile(int gridX, int gridY, int iLayer)
 {
     if (IsValidAutoTilePos(gridX, gridY) && iLayer < MapLayers.Count)
     {
         // AutoTile autoTile = TileLayers[MapLayers[iLayer].TileLayerIdx][gridX + gridY * MapTileWidth];
         AutoTile autoTile = TileLayers[iLayer][gridX, gridY];
         if (autoTile != null)
         {
             return(autoTile);
         }
         return(new AutoTile()
         {
             Id = k_emptyTileId,
             TileX = gridX,
             TileY = gridY,
             Layer = iLayer
         });
     }
     return(new AutoTile()
     {
         Id = k_outofboundsTileId,
         TileX = gridX,
         TileY = gridY,
         Layer = iLayer
     });
 }
コード例 #2
0
 public void RefreshTile(AutoTile autoTile)
 {
     if (autoTile == null)
     {
         return;
     }
     TileChunkPoolNode.MarkUpdatedTile(autoTile.TileX, autoTile.TileY, autoTile.Layer);
 }
コード例 #3
0
 public void ClearLayer(MapLayer mapLayer)
 {
     for (int i = 0; i < TileLayers[mapLayer.TileLayerIdx].Length; ++i)
     {
         for (int gridX = 0; gridX < MapTileWidth; gridX++)
         {
             for (int gridY = 0; gridY < MapTileHeight; gridY++)
             {
                 AutoTile autoTile = TileLayers[mapLayer.TileLayerIdx][gridX, gridY];
                 if (autoTile != null)
                 {
                     autoTile.Id = -1;
                 }
             }
         }
     }
 }
コード例 #4
0
        public bool SetAutoTile(int gridX, int gridY, int tileId, int iLayer, bool checkRefreshTile)
        {
            if (!IsValidAutoTilePos(gridX, gridY) || iLayer >= MapLayers.Count)
            {
                return(false);
            }

            bool tileHasChange = false;

            {
                // int idx = gridX + gridY * MapTileWidth;
                // AutoTile autoTile = TileLayers[MapLayers[iLayer].TileLayerIdx][idx];
                AutoTile autoTile = TileLayers[iLayer][gridX, gridY];
                if (autoTile == null)
                {
                    autoTile = new AutoTile();
                    // TileLayers[MapLayers[iLayer].TileLayerIdx][idx] = autoTile;
                    TileLayers[iLayer][gridX, gridY] = autoTile;
                }
                tileHasChange  = autoTile.Id != tileId;
                autoTile.Id    = tileId;
                autoTile.TileX = gridX;
                autoTile.TileY = gridY;
                autoTile.Layer = iLayer;
                if (checkRefreshTile && tileHasChange)
                {
                    for (int xf = -1; xf < 2; ++xf)
                    {
                        for (int yf = -1; yf < 2; ++yf)
                        {
                            RefreshTile(gridX + xf, gridY + yf, iLayer);
                        }
                    }
                }
            }
            return(tileHasChange);
        }
コード例 #5
0
        /// <summary>
        /// Save the map configuration
        /// </summary>
        /// <param name="_autoTileMap"></param>
        /// <returns></returns>
        public bool SaveData(AutoTileMap _autoTileMap)
        {
            int width  = TileMapWidth;
            int height = TileMapHeight;

            // avoid clear map data when auto tile map is not initialized
            if (!_autoTileMap.IsInitialized)
            {
                //Debug.LogError(" Error saving data. Autotilemap is not initialized! Map will not be saved. ");
                return(false);
            }

            Metadata.version = MetadataChunk.k_version;

            TileData.Clear();
            // TriggerLink.Clear();
            // WarpsData.Clear();
            // SignpostsData.Clear();
            // ScriptData.Clear();

            bool isEnableCompression = true;

            for (int iLayer = 0; iLayer < _autoTileMap.GetLayerCount(); ++iLayer)
            {
                AutoTileMap.MapLayer mapLayer = _autoTileMap.MapLayers[iLayer];
                List <int>           tileData = new List <int>(width * height);
                int iTileRepetition           = 0;
                int savedTileId = 0;
                int mapWidth    = _autoTileMap.MapTileWidth;
                int mapHeight   = _autoTileMap.MapTileHeight;
                for (int tile_y = 0; tile_y < height; ++tile_y)
                {
                    for (int tile_x = 0; tile_x < width; ++tile_x)
                    {
                        int iType = -1;
                        if (tile_x < mapWidth && tile_y < mapHeight)
                        {
                            // AutoTile autoTile = _autoTileMap.TileLayers[_autoTileMap.MapLayers[iLayer].TileLayerIdx][tile_x + tile_y * mapWidth];
                            AutoTile autoTile = _autoTileMap.TileLayers[iLayer][tile_x, tile_y];
                            iType = autoTile != null? autoTile.Id : -1;
                        }

                        if (isEnableCompression)
                        {
                            if (iTileRepetition == 0)
                            {
                                savedTileId     = iType;
                                iTileRepetition = 1;
                            }
                            else
                            {
                                // compression data. All tiles of the same type are store with number of repetitions ( negative number ) and type
                                // ex: 5|5|5|5 --> |-4|5| (4 times 5) ex: -1|-1|-1 --> |-3|-1| ( 3 times -1 )
                                if (iType == savedTileId)
                                {
                                    ++iTileRepetition;
                                }
                                else
                                {
                                    if (iTileRepetition > 1)
                                    {
                                        tileData.Add(-iTileRepetition);   // save number of repetition with negative sign
                                    }
                                    if (savedTileId < -1)
                                    {
                                        Debug.LogError(" Wrong tile id found when compressing the tile layer " + mapLayer.Name);
                                        savedTileId = -1;
                                    }
                                    tileData.Add(savedTileId);
                                    savedTileId     = iType;
                                    iTileRepetition = 1;
                                }
                            }
                        }
                        else
                        {
                            tileData.Add(iType);   // save number of repetition with negative sign
                        }
                    }
                }
                if (isEnableCompression)
                {
                    // save last tile type found
                    if (iTileRepetition > 1)
                    {
                        tileData.Add(-iTileRepetition);
                    }
                    tileData.Add(savedTileId);
                }
                //
                TileData.Add(new TileLayer()
                {
                    Tiles        = tileData,
                    Depth        = mapLayer.Depth,
                    LayerType    = mapLayer.LayerType,
                    SortingLayer = mapLayer.SortingLayer,
                    SortingOrder = mapLayer.SortingOrder,
                    Name         = mapLayer.Name,
                    Visible      = mapLayer.Visible
                });
            }
            TileMapWidth  = width;
            TileMapHeight = height;

            //Compression Data
            OverlayLink_C   = CreateCompressionArray(OverlayLink);
            TriggerLink_C   = CreateCompressionArray(TriggerLink);
            High_C          = CreateCompressionArray(High);
            OverlayRotate_C = CreateCompressionArray(OverlayRotate);
            // RawFlagMap.Data = FlagMap;
            RawFlagAction = new List <FlagAction.SerializableFlagAction>(ListFlagAction.Count);
            for (int i = 0; i < ListFlagAction.Count; i++)
            {
                var r = new FlagAction.SerializableFlagAction();
                r.FlagAction = ListFlagAction[i];
                RawFlagAction.Add(r);
            }
            Debug.Log("Save with Compression");
            return(true);
        }
コード例 #6
0
        public void RefreshTile(int gridX, int gridY, int iLayer)
        {
            AutoTile autoTile = GetAutoTile(gridX, gridY, iLayer);

            RefreshTile(autoTile);
        }
コード例 #7
0
        /// <summary>
        /// Copy a section of the map and use it as drawing template
        /// </summary>
        /// <param name="tile_start_x"></param>
        /// <param name="tile_start_y"></param>
        /// <param name="tile_end_x"></param>
        /// <param name="tile_end_y"></param>
        /// <param name="_dragEndTileX"></param>
        /// <param name="_dragEndTileY"></param>
        /// <param name="isCtrlKeyHold"></param>
        public void RefreshBrushGizmo(int tile_start_x, int tile_start_y, int tile_end_x, int tile_end_y, int _dragEndTileX, int _dragEndTileY, bool isCtrlKeyHold)
        {
            Vector2 pivot = new Vector2(0f, 1f);

            SpriteRenderer[] aSprites = GetComponentsInChildren <SpriteRenderer>();

            int sprIdx = 0;

            for (int tile_x = tile_start_x; tile_x <= tile_end_x; ++tile_x)
            {
                for (int tile_y = tile_start_y; tile_y <= tile_end_y; ++tile_y)
                {
                    for (int tile_layer = 0; tile_layer < MyAutoTileMap.GetLayerCount(); ++tile_layer)
                    {
                        // if(
                        //     (isCtrlKeyHold && tile_layer == SelectedLayer) || //copy all layers over the SelectedLayer
                        //     !MyAutoTileMap.MapLayers[tile_layer].Visible // skip invisible layers
                        // )
                        // {
                        //  continue;
                        // }

                        AutoTile autoTile = MyAutoTileMap.GetAutoTile(tile_x, tile_y, tile_layer);
                        if (autoTile != null && autoTile.Id >= 0)
                        {
                            // for( int partIdx = 0; partIdx < autoTile.TilePartsLength; ++partIdx, ++sprIdx )
                            // {
                            int idSlot = autoTile.Id;
                            if (!MyAutoTileMap.Tileset.IsExitSlot(idSlot))
                            {
                                continue;
                            }
                            var slot = MyAutoTileMap.Tileset.GetSlot(idSlot);
                            if (!slot.IsCanCopyWhenDraw)
                            {
                                continue;
                            }

                            SpriteRenderer spriteRender = GetSpriteRenderer(aSprites, ref sprIdx);

                            SetSpriteRendererSlot(spriteRender, slot, pivot);
                            spriteRender.sortingOrder = 50; //TODO: +50 temporal? see for a const number later

                            // get last tile as relative position
                            int tilePart_x = (tile_x - _dragEndTileX) * 2;
                            int tilePart_y = (tile_y - _dragEndTileY) * 2;

                            float xFactor = MyAutoTileMap.CellSize.x / 2f;
                            float yFactor = MyAutoTileMap.CellSize.y / 2f;
                            spriteRender.transform.localPosition = new Vector3(tilePart_x * xFactor, -tilePart_y * yFactor, spriteRender.transform.position.z);
                            spriteRender.transform.localScale    = new Vector3(MyAutoTileMap.CellSize.x * AutoTileset.PixelToUnits / MyAutoTileMap.Tileset.TileWidth, MyAutoTileMap.CellSize.y * AutoTileset.PixelToUnits / MyAutoTileMap.Tileset.TileHeight, 1f);
                            // }
                        }
                    }
                }
            }
            // clean unused sprite objects
            while (sprIdx < aSprites.Length)
            {
                if (Application.isEditor)
                {
                    DestroyImmediate(aSprites[sprIdx].transform.gameObject);
                }
                else
                {
                    Destroy(aSprites[sprIdx].transform.gameObject);
                }
                ++sprIdx;
            }
        }