/
Vagabond132
/
TerrariaCourse
Обзор
Документация
Войти
/
Vagabond132
/
TerrariaCourse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Windows
Model/GameComponents/MapModel.cs
146 строк
5 KB
Vagabond132
Соглашение
13 янв 2025, 13:34
13 янв 2025, 13:34
8528b00
Код
Авторство
О чём код?
using Model.Blocks; using Model.Blocks.ImplementedBlocks; using System.Drawing; using System.Runtime.CompilerServices; namespace Model.GameComponents { /// <summary> /// Класс карты /// </summary> public class MapModel { /// <summary> /// Карта /// </summary> private AbstractBlock[,] _map; /// <summary> /// Длина поля /// </summary> private int _width; /// <summary> /// Ширина поля /// </summary> private int _height; /// <summary> /// Геттер карты /// </summary> public AbstractBlock[,] GetMap { get { return _map; } } /// <summary> /// Ширина карты /// </summary> public int Width { get => _width; } /// <summary> /// Высота карты /// </summary> public int Height { get => _height; } /// <summary> /// Конструктор карты /// </summary> /// <exception cref="Exception">Исключение в случае неуспешной загрузки карты</exception> public MapModel() { _map = ConvertToBlocks(ReadBitmap(Environment.CurrentDirectory + "\\..\\..\\..\\..\\Model\\GameComponents\\Example.bmp")); } // Метод для чтения файла BMP и преобразования в объект Bitmap public static Bitmap ReadBitmap(string parFilePath) { try { // Открываем файл BMP и создаём объект Bitmap Bitmap bitmap = new Bitmap(parFilePath); return bitmap; } catch (Exception ex) { throw new ArgumentException($"Ошибка при чтении файла BMP: {ex.Message}", ex); } } /// <summary> /// Метод для преобразования битовой карты /// </summary> /// <param name="parBitmap"></param> /// <returns></returns> private AbstractBlock[,] ConvertToBlocks(Bitmap parBitmap) { int width = parBitmap.Width; this._width = width; int height = parBitmap.Height; this._height = height; AbstractBlock[,] numericArray = new AbstractBlock[height, width]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Color pixelColor = parBitmap.GetPixel(x, y); numericArray[y, x] = GetBlock(pixelColor); } } return numericArray; } //Метод для получения числового значения цвета // Метод для получения названия цвета через switch private static AbstractBlock GetBlock(Color parColor) { switch (parColor.ToArgb()) { case int argb when argb == Color.White.ToArgb(): return BlockConstructor.getAirBlock(); case int argb when argb == Color.SaddleBrown.ToArgb(): return BlockConstructor.getMudBlock(); case int argb when argb == Color.Gray.ToArgb(): return BlockConstructor.getStoneBlock(); case int argb when argb == Color.Gold.ToArgb(): return BlockConstructor.getGoldBlock(); case int argb when argb == Color.DarkBlue.ToArgb(): return BlockConstructor.getDiamondBlock(); case int argb when argb == Color.DarkGray.ToArgb(): return BlockConstructor.getIronBlock(); default: return BlockConstructor.getAirBlock(); } } /// <summary> /// Получить блок /// </summary> /// <param name="parBelowY">координата по У</param> /// <param name="parBelowX">координата по Х</param> /// <returns></returns> public object GetBlock(int parBelowY, int parBelowX) { if (parBelowX < 0 || parBelowY < 0) { return null; } return _map[parBelowY, parBelowX].Name.Equals("Воздух") ? null : _map[parBelowY, parBelowX]; } public object SetAirBlock(int belowY, int belowX) { return _map[belowY, belowX] = BlockConstructor.getAirBlock(); } /// <summary> /// Поставить блок /// </summary> /// <param name="parBelowY">Координата по У</param> /// <param name="parBelowX">Координата по Х</param> /// <param name="parBlock">Блок</param> /// <returns></returns> public object SetBlock(int parBelowY, int parBelowX, AbstractBlock parBlock) { return _map[parBelowY, parBelowX] = parBlock; } } }