// конструктор класса public anEngine(int size_x, int size_y, int screen_w, int screen_h) { // при инициализации экземпляра класса сохраним настройки // размеров элементов и изображения в локальных переменных picture_size_x = size_x; picture_size_y = size_y; screen_width = screen_w; screen_height = screen_h; // полосы прокрутки у нас пока отсутствуют, поэтому просто обнулим значение переменных scroll_x = 0; scroll_y = 0; // добавим новый слой для работы, пока он будет единственным Layers.Add(new anLayer(picture_size_x, picture_size_y)); // номер активного слоя - 0 ActiveLayerNom = 0; // и создадим стандартную кисть standartBrush = new anBrush(3, false); }
// функция рисования // получает в качестве параметров кисть для рисования и координаты, // где сейчас необходимо перерисовать пиксели заданной кистью public void Draw(anBrush BR, int x, int y) { // // определяем позиция старта рисования int real_pos_draw_start_x = x - BR.myBrush.Width / 2; int real_pos_draw_start_y = y - BR.myBrush.Height / 2; // // корректируем ее для не выхода за границы массива // // проверка на отрицательные значения (граница "справа") if (real_pos_draw_start_x < 0) { real_pos_draw_start_x = 0; } if (real_pos_draw_start_y < 0) { real_pos_draw_start_y = 0; } // // проверки на выход за границу "справа" int boundary_x = real_pos_draw_start_x + BR.myBrush.Width; int boundary_y = real_pos_draw_start_y + BR.myBrush.Height; if (boundary_x > Width) { boundary_x = Width; } if (boundary_y > Heigth) { boundary_y = Heigth; } // // счетчик пройденных строк и столбцов массива, представляющий собой маску кисти int count_x = 0, count_y = 0; // // цикл по области с учетом смещения кисти и коррекции для невыхода за границы массива // for (int ax = real_pos_draw_start_x; ax < boundary_x; ax++, count_x++) // { // count_y = 0; // for (int bx = real_pos_draw_start_y; bx < boundary_y; bx++, count_y++) // { // // получаем текущий цвет пикселя маски // Color ret = BR.myBrush.GetPixel(count_x, count_y); // // цвет не красный // if (!(ret.R == 255 && ret.G == 0 && ret.B == 0)) // { // // заполняем данный пиксель соответствующим из маски, используя активный цвет // DrawPlace[ax, bx, 0] = ActiveColor.R; // DrawPlace[ax, bx, 1] = ActiveColor.G; // DrawPlace[ax, bx, 2] = ActiveColor.B; // DrawPlace[ax, bx, 3] = 0; // } // } // } // цикл по области с учетом смещения кисти и коррекции для невыхода за границы массива for (int ax = real_pos_draw_start_x; ax < boundary_x; ax++, count_x++) { count_y = 0; for (int bx = real_pos_draw_start_y; bx < boundary_y; bx++, count_y++) { // проверяем, не является ли данная кисть стеркой if (BR.IsBrushErase()) { // данная кисть - стерка. // помечаем данный пиксель как не закрашенный // получаем текущий цвет пикселя маски Color ret = BR.myBrush.GetPixel(count_x, count_y); // цвет не красный if (!(ret.R == 255 && ret.G == 0 && ret.B == 0)) { // заполняем данный пиксель соответствующим из маски, используя активный цвет DrawPlace[ax, bx, 3] = 1; } } else { // получаем текущий цвет пикселя маски Color ret = BR.myBrush.GetPixel(count_x, count_y); // цвет не красный if (!(ret.R == 255 && ret.G == 0 && ret.B == 0)) { // заполняем данный пиксель соответствующим из маски, используя активный цвет DrawPlace[ax, bx, 0] = ActiveColor.R; DrawPlace[ax, bx, 1] = ActiveColor.G; DrawPlace[ax, bx, 2] = ActiveColor.B; DrawPlace[ax, bx, 3] = 0; } } } } }
// функция установки стандартной кисти, передается только размер public void SetStandartBrush(int SizeB) { standartBrush = new anBrush(SizeB, false); }
// установка кисти из файла public void SetBrushFromFile(string FileName) { standartBrush = new anBrush(FileName); }
// функция установки специальной кисти public void SetSpecialBrush(int Nom) { standartBrush = new anBrush(Nom, true); }