コード例 #1
0
ファイル: MapLayer.cs プロジェクト: RogueCollab/RogueEssence
        public void CalculateAutotiles(ulong randSeed, Loc rectStart, Loc rectSize)
        {
            HashSet <int> floortilesets = new HashSet <int>();

            for (int ii = rectStart.X; ii < rectStart.X + rectSize.X; ii++)
            {
                for (int jj = rectStart.Y; jj < rectStart.Y + rectSize.Y; jj++)
                {
                    if (Collision.InBounds(Width, Height, new Loc(ii, jj)))
                    {
                        if (Tiles[ii][jj].AutoTileset > -1)
                        {
                            floortilesets.Add(Tiles[ii][jj].AutoTileset);
                        }
                    }
                }
            }
            foreach (int tileset in floortilesets)
            {
                Data.AutoTileData entry = Data.DataManager.Instance.GetAutoTile(tileset);
                entry.Tiles.AutoTileArea(randSeed, rectStart, rectSize, new Loc(Width, Height),
                                         (int x, int y, int neighborCode) =>
                {
                    Tiles[x][y].NeighborCode = neighborCode;
                },
                                         (int x, int y) =>
                {
                    if (!Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        return(true);
                    }
                    return(Tiles[x][y].AutoTileset == tileset);
                },
                                         (int x, int y) =>
                {
                    if (!Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        return(true);
                    }
                    return(Tiles[x][y].AutoTileset == tileset || Tiles[x][y].Associates.Contains(tileset));
                });
            }
        }
コード例 #2
0
        public void CalculateAutotiles(Loc rectStart, Loc rectSize)
        {
            HashSet <int> floortilesets = new HashSet <int>();
            HashSet <int> blocktilesets = new HashSet <int>();

            for (int ii = rectStart.X; ii < rectStart.X + rectSize.X; ii++)
            {
                for (int jj = rectStart.Y; jj < rectStart.Y + rectSize.Y; jj++)
                {
                    if (Collision.InBounds(Width, Height, new Loc(ii, jj)))
                    {
                        AutoTile outTile;
                        if (Tiles[ii][jj].FloorTile.Layers.Count == 0)
                        {
                            Tiles[ii][jj].FloorTile = FloorBG.Copy();
                        }
                        if (TextureMap.TryGetValue(Tiles[ii][jj].Data.ID, out outTile))
                        {
                            Tiles[ii][jj].Data.TileTex = outTile.Copy();
                        }

                        if (Tiles[ii][jj].FloorTile.AutoTileset > -1)
                        {
                            floortilesets.Add(Tiles[ii][jj].FloorTile.AutoTileset);
                        }
                        if (Tiles[ii][jj].Data.TileTex.AutoTileset > -1)
                        {
                            blocktilesets.Add(Tiles[ii][jj].Data.TileTex.AutoTileset);
                        }
                    }
                }
            }
            foreach (int tileset in floortilesets)
            {
                Data.AutoTileData entry = Data.DataManager.Instance.GetAutoTile(tileset);
                entry.Tiles.AutoTileArea(Rand, rectStart, rectSize,
                                         (int x, int y, List <TileLayer> tile) =>
                {
                    if (Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        Tiles[x][y].FloorTile.Layers = tile;
                    }
                },
                                         (int x, int y) =>
                {
                    if (!Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        return(true);
                    }
                    if (Tiles[x][y].Data.TileTex.AutoTileset != -1 && Tiles[x][y].Data.TileTex.AutoTileset == Tiles[x][y].FloorTile.BorderTileset)
                    {
                        return(false);
                    }
                    return(Tiles[x][y].FloorTile.AutoTileset == tileset);
                });
            }
            foreach (int tileset in blocktilesets)
            {
                Data.AutoTileData entry = Data.DataManager.Instance.GetAutoTile(tileset);
                entry.Tiles.AutoTileArea(Rand, rectStart, rectSize,
                                         (int x, int y, List <TileLayer> tile) =>
                {
                    if (Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        Tiles[x][y].Data.TileTex.Layers = tile;
                    }
                },
                                         (int x, int y) =>
                {
                    if (!Collision.InBounds(Width, Height, new Loc(x, y)))
                    {
                        return(true);
                    }
                    return(Tiles[x][y].Data.TileTex.AutoTileset == tileset);
                });
            }
        }