Exemple #1
0
        void OnTileClick(
            Image img,
            TilePos pos
            )
        {
            switch (ctrlCtx.getCurrentToolFcn())
            {
            case ToolKind.paint:
                AssignTile(img, pos, ctrlCtx.getCurrentSpriteFcn());
                break;

            case ToolKind.fill:
                Fill(pos, ctrlCtx.getCurrentSpriteFcn());
                break;

            case ToolKind.erase:
                ClearTile(img, pos);
                break;

            case ToolKind.pick:
                var id = layer.Get(pos.x, pos.y);
                if (id != 0)
                {
                    ctrlCtx.setSpriteFcn(id);
                }
                break;
            }
        }
Exemple #2
0
        void Fill(
            TilePos startPos,
            SpriteRecord sprite
            )
        {
            // get starting tile kind
            var matchID  = layer.Get(startPos.x, startPos.y);
            var visited  = new HashSet <TilePos>();
            var traverse = new List <TilePos>();

            // add starting node to traverse list
            traverse.Add(startPos);
            // iterate through list of nodes to traverse
            while (traverse.Count > 0)
            {
                var pos = traverse[0];
                traverse.RemoveAt(0);
                // update current node
                AssignTile(imageMap[pos], pos, sprite);
                visited.Add(pos);
                // check/add neighbors
                var neighbors = new TilePos[] {
                    new TilePos(pos.x - 1, pos.y),
                    new TilePos(pos.x + 1, pos.y),
                    new TilePos(pos.x, pos.y - 1),
                    new TilePos(pos.x, pos.y + 1),
                };
                foreach (var neighbor in neighbors)
                {
                    // bounds
                    if (neighbor.x < 0 || neighbor.x >= layer.width || neighbor.y < 0 || neighbor.y >= layer.height)
                    {
                        continue;
                    }
                    // visited
                    if (visited.Contains(neighbor))
                    {
                        continue;
                    }
                    // already set to traverse
                    if (traverse.Contains(neighbor))
                    {
                        continue;
                    }
                    // non-matching tile
                    if (layer.Get(neighbor.x, neighbor.y) != matchID)
                    {
                        continue;
                    }
                    // tile matches
                    traverse.Add(neighbor);
                }
            }
        }
Exemple #3
0
 void ClearTile(
     Image img,
     TilePos pos
     )
 {
     if (img != null)
     {
         img.sprite = null;
         img.color  = new Color(0, 0, 0, 0);
     }
     layer.Set(pos.x, pos.y, 0);
 }
Exemple #4
0
        public void AssignLayer(
            Layer layer
            )
        {
            this.layer = layer;
            if (spritePrefab == null)
            {
                return;
            }
            // setup grid layout
            var grid = GetComponent <GridLayoutGroup>();

            if (grid == null)
            {
                return;
            }
            grid.constraint      = GridLayoutGroup.Constraint.FixedColumnCount;
            grid.constraintCount = layer.width;
            grid.cellSize        = new Vector2(ctrlCtx.project.tileWidth, ctrlCtx.project.tileHeight);
            // iterate through grid
            // -- start 0,0 representing top-left corner
            for (var y = 0; y < layer.height; y++)
            {
                for (var x = 0; x < layer.width; x++)
                {
                    var pos      = new TilePos(x, y);
                    var spriteGO = UnityEngine.Object.Instantiate(spritePrefab, contentTransform);
                    var img      = spriteGO.GetComponent <Image>();
                    var id       = layer.Get(x, y);
                    if (img != null)
                    {
                        imageMap[pos] = img;
                        AssignTile(img, pos, ctrlCtx.lookupSpriteFcn(id));
                    }
                    // wire handlers
                    var btn = spriteGO.GetComponent <Button>();
                    if (btn != null)
                    {
                        btn.onClick.AddListener(() => OnTileClick(img, pos));
                    }
                }
            }
        }
Exemple #5
0
 void AssignTile(
     Image img,
     TilePos pos,
     SpriteRecord record
     )
 {
     if (record == null)
     {
         return;
     }
     // assign sprite to image
     if (img != null)
     {
         img.sprite = record.sprite;
         img.color  = Color.white;
     }
     // assign record id to layer
     layer.Set(pos.x, pos.y, record.id);
 }