public void LoadTileMapFromExisitingFile(string imagePath, ILoaderInterface loaderInterface)
 {
     TilesModel.LoadFromExistingFile(imagePath, loaderInterface);
 }
예제 #2
0
 public void LoadTileMapFromExisitingFile(string imagePath, ILoaderInterface loaderInterface)
 {
     canvasWorldViewGroup.LoadTileMapFromExisitingFile(imagePath, loaderInterface);
 }
        public static void LoadFromExistingFile(this ITilesModel tilesModel, String imagePath, ILoaderInterface loaderInterface = null)
        {
            if (tilesModel == null)
            {
                throw new Exception();
            }
            Image background = Image.FromFile(imagePath);

            tilesModel.TileRows = background.Height / tilesModel.TileHeight;
            if (background.Height % tilesModel.TileHeight != 0)
            {
                tilesModel.TileRows++;
            }
            tilesModel.TileColumns = background.Width / tilesModel.TileWidth;
            if (background.Width % tilesModel.TileWidth != 0)
            {
                tilesModel.TileColumns++;
            }

            Image      newImage = new Bitmap(tilesModel.TileColumns * tilesModel.TileWidth, tilesModel.TileRows * tilesModel.TileHeight);
            RectangleF r        = new RectangleF(0, 0, background.Width, background.Height);

            Graphics.FromImage(newImage).DrawImageFromOtherImage(background, r, r);
            background.Dispose();
            background        = newImage;
            tilesModel.Matrix = new int[tilesModel.TileRows, tilesModel.TileColumns];
            List <TileModel> tileModels = new List <TileModel>();

            if (loaderInterface != null)
            {
                loaderInterface.EnableWaiting();
            }

            int currentVolume = 0;

            for (int rIndex = 0; rIndex < tilesModel.TileRows; rIndex++)
            {
                for (int cIndex = 0; cIndex < tilesModel.TileColumns; cIndex++)
                {
                    Rectangle cropedRect   = new Rectangle(cIndex * tilesModel.TileWidth, rIndex * tilesModel.TileHeight, tilesModel.TileWidth, tilesModel.TileHeight);
                    Image     cropedImage  = background.CropImage(cropedRect);
                    TileModel tileHasImage = tileModels.TileHasImage(cropedImage);
                    if (tileHasImage != null)
                    {
                        tilesModel.Matrix[rIndex, cIndex] = tileHasImage.Index;
                    }
                    else
                    {
                        TileModel tileModel = new TileModel()
                        {
                            Image = cropedImage,
                            Index = tileModels.Count
                        };
                        tileModels.Add(tileModel);
                        tilesModel.Matrix[rIndex, cIndex] = tileModel.Index;
                    }

                    if (loaderInterface != null)
                    {
                        currentVolume++;
                        loaderInterface.SetVolumeWaiting((int)100.0f * currentVolume / (tilesModel.TileRows * tilesModel.TileColumns));
                    }
                }
            }

            tilesModel.TilesheetColumns = (int)(Math.Sqrt(tileModels.Count));
            int tileSheetColumns = tilesModel.TilesheetColumns;

            int tileSheetRows = tileModels.Count / tilesModel.TilesheetColumns;

            if (tileModels.Count % tilesModel.TilesheetColumns != 0)
            {
                tileSheetRows++;
            }
            tilesModel.Tilesheet = new Bitmap(tilesModel.TilesheetColumns * tilesModel.TileWidth,
                                              tileSheetRows * tilesModel.TileHeight);

            foreach (var tilesheet in tileModels)
            {
                int index = tilesheet.Index;
                int x     = (index % tileSheetColumns) * tilesModel.TileWidth;
                int y     = (index / tileSheetColumns) * tilesModel.TileHeight;

                Graphics.FromImage(tilesModel.Tilesheet).DrawImageFromOtherImage(tilesheet.Image,
                                                                                 new RectangleF(0, 0, tilesheet.Image.Width, tilesheet.Image.Height),
                                                                                 new RectangleF(x, y, tilesheet.Image.Width, tilesheet.Image.Height)
                                                                                 );
                tilesheet.Image.Dispose();
            }

            background.Dispose();
            if (loaderInterface != null)
            {
                loaderInterface.DisableWaiting();
            }
        }