> Свободная база знаний SFML > Уроки SFML > Разработка 2D Игр > Уроки от legozaur > Приложение 1. Основные классы > Design (Дизайн) > Design v2.0 (23.12.2016)
1. классы Design, DesignWindow, DesignCursor объединены в Design
2. добавлена структура DesignButton (для winButton из Window)
Исходный код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
//Desigh.h //v1.0(05.04.2016) #ifndef DSL_DESIGN_H #define DSL_DESIGN_H #include "stdafx.h" class Design { protected: sf::String filename; // Имя файла дизайна sf::Image image; // картинка целого дизайна std::vector<sf::Image> vecImage; // Обрезанные картинки // Набор функций, которые нужны для getImage(int numCell, int factorX, int factorY) //sf::Image getNewImage1(int numCell, int factorX, int factorY); //sf::Image getNewImage2(int numCell, int factorX, int factorY); //sf::Image getNewImageX(int numCell, int factor); //sf::Image getNewImageY(int numCell, int factor); public: Design(void); ~Design(void); void reserve(int num); bool loadImage(sf::String filename); // Основная функция преобразующая дизайн в набор картинок bool designToImage(sf::Image* image1, sf::Image* image2, int numCellWidth, int numCellHeight, int sideImage); bool designToImage(sf::Image* image1, sf::Image* image2, int numCellWidth, int numCellHeight, int sizeX, int sizeY); // Возвращает картинку дизайна sf::Image getImage(); // Возвращает обрезанную картинку дизайна под номером sf::Image getImage(int numCell); // Возвразает обрезанную картинку дизайна под номером увеличенную по Х в factorX раз, по Y в factorY раз //sf::Image getImage(int numCell, int factorX, int factorY); sf::String getFilename(); int size(); }; struct DesignWindow : public Design { DesignWindow() { reserve(9); } DesignWindow(sf::String filename) { reserve(9); load(filename); } bool load(sf::String filename) { if(loadImage(filename)) { // Расположение картинок в векторе // 0 4 1 // 5 8 6 // 2 7 3 // Режем image и заполняем картинки vecImage[0-8] designToImage(&image, &vecImage[0], 0, 0, 32); if(!designToImage(&image, &vecImage[1], 2, 0, 32)) { designToImage(&image, &vecImage[1], 0, 0, 32); vecImage[1].flipHorizontally(); } designToImage(&image, &vecImage[2], 0, 2, 32); if(!designToImage(&image, &vecImage[3], 2, 2, 32)) { designToImage(&image, &vecImage[3], 0, 2, 32); vecImage[3].flipHorizontally(); } designToImage(&image, &vecImage[4], 1, 0, 32); designToImage(&image, &vecImage[5], 0, 1, 32); if(!designToImage(&image, &vecImage[6], 2, 1, 32)) { designToImage(&image, &vecImage[6], 0, 1, 32); vecImage[6].flipHorizontally(); } designToImage(&image, &vecImage[7], 1, 2, 32); designToImage(&image, &vecImage[8], 1, 1, 32); return true; } return false; } }; struct DesignCursor : public Design { DesignCursor() { reserve(6); } DesignCursor(sf::String filename) { reserve(6); load(filename); } bool load(sf::String filename) { if(loadImage(filename)) { designToImage(&image, &vecImage[0], 0, 0, 32); // Курсор designToImage(&image, &vecImage[1], 1, 0, 32); // Перемещение designToImage(&image, &vecImage[2], 2, 0, 32); // Вертикальные designToImage(&image, &vecImage[3], 3, 0, 32); // Горизонтальные designToImage(&image, &vecImage[4], 4, 0, 32); // Лево-верх <-> Право-низ designToImage(&image, &vecImage[5], 5, 0, 32); // Лево-низ <-> Право-верх return true; } return false; } }; struct DesignButton : public Design { DesignButton() { reserve(3); } DesignButton(sf::String filename, int num, bool flag) { reserve(num); load(filename, num, flag); } bool load(sf::String filename, int num, bool flag) { int sizeX, sizeY; if(loadImage(filename)) { sf::Vector2u size = image.getSize(); if(flag) { sizeX = size.x / num; sizeY = size.y; for(int i=0; i<num; i++) designToImage(&image, &vecImage[i], i, 0, sizeX, sizeY); } else { sizeX = size.x; sizeY = size.y / num; for(int i=0; i<num; i++) designToImage(&image, &vecImage[i], 0, i, sizeX, sizeY); } return true; } return false; } }; #endif DSL_DESIGN_H |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
//Desigh.cpp //v2.0(23.12.2016) #include "Design.h" // Конструктор по умолчанию Design::Design(void) { vecImage.reserve(0); } void Design::reserve(int num) { vecImage.reserve(num); for(int i=0; i<num; i++) { sf::Image img; vecImage.push_back(img); } } bool Design::loadImage(sf::String filename) { vecImage.reserve(0); this->filename = filename; if(image.loadFromFile(filename)) return true; return false; } Design::~Design(void){} sf::Image Design::getImage() { return image; } // Возвращает sf::Картинку под номером numCell. Если такого номера нет, вернёт первую. sf::Image Design::getImage(int numCell) { if(numCell < vecImage.size()) return vecImage[numCell]; else return vecImage[0]; } // //Возвращает имя дизайна // Используется в eventHandlerWindows.h >> struct designWindows >> int checkDesName(sf::String filename){...} sf::String Design::getFilename() { return filename; } int Design::size() { return vecImage.size(); } // designToImage - режет дизайн, на картинки // *image1 - ссылка на Целый дизайн // *image2 - ссылка на картинку, в которую будет вставлена часть дизайна // numCellWidth - положение картинки в дизайне по ширине [начиная с 0] // numCellHeight - по высоте [начиная с 0] // sideCell - размер ячейки (обычно 32) bool Design::designToImage(sf::Image *image1, sf::Image *image2, int numCellWidth, int numCellHeight, int sideCell) { // Если в ячейке будет картинка, то W и H её ширина и высота соответственно int W = -1; // ширина int H = -1; // высота int imin = numCellWidth * sideCell; int imax = imin + sideCell; int jmin = numCellHeight * sideCell; int jmax = jmin + sideCell; for(int j = jmin; j < jmax; j++) { for(int i = imin; i < imax; i++) { if(image1->getPixel(i, j) != sf::Color(255,255,255,0)) {// Если пиксель не пустой if( W < i-imin) W++; if( H < j-jmin) H++; } } } if(W != -1 && H != -1) { W++; H++; // Фича 31.03.2016 8:40 МСК // нужная поправка на 1 пиксель image2->create(W, H, sf::Color(255, 255, 255, 255)); image2->copy(*image1, 0, 0, sf::IntRect(imin,jmin, imin+W,jmin+H)); return true; } return false; } bool Design::designToImage(sf::Image* image1, sf::Image* image2, int numCellWidth, int numCellHeight, int sizeX, int sizeY) { // Если в ячейке будет картинка, то W и H её ширина и высота соответственно int W = -1; // ширина int H = -1; // высота int imin = numCellWidth * sizeX; int imax = imin + sizeX; int jmin = numCellHeight * sizeY; int jmax = jmin + sizeY; for(int j = jmin; j < jmax; j++) { for(int i = imin; i < imax; i++) { if(image1->getPixel(i, j) != sf::Color(255,255,255,0)) {// Если пиксель не пустой if( W < i-imin) W++; if( H < j-jmin) H++; } } } if(W != -1 && H != -1) { W++; H++; // Фича 31.03.2016 8:40 МСК // нужная поправка на 1 пиксель image2->create(W, H, sf::Color(255, 255, 255, 255)); image2->copy(*image1, 0, 0, sf::IntRect(imin,jmin, imin+W,jmin+H)); return true; } return false; } /* // Возвращает картинку под номером numCell увеличенную по ширине в factorX раз и по высоте в factorY раз sf::Image Design::getNewImage1(int numCell, int factorX, int factorY) { sf::Image img0 = getNewImageX(numCell, factorX); // Растягиваем картинку до нужной нам ширины (factorX) int h = img0.getSize().y; // высота полосы (необходимо для расчётов) sf::Image img; // Создаём картинку которую будем возвращать img.create(factorX, factorY, sf::Color(0,0,0,0)); // Задаём её размеры int a = int(float(factorY)/h); // а - это количество полос в высоту if(a*h <= factorY) // Если не всё пространство занято полосами a++; // добавляем 1 полосу, она всё равно обрежется for(int i=0; i<a; i++) // делаем "а" раз нижеуказанное img.copy(img0, 0, i*h, sf::IntRect(0,0,factorX,h)); // вставляем (каждая следующая ниже на величину h) return img; // возвращаем картинку } // Возвращает картинку под номером numCell увеличенную по ширине в factorX раз и по высоте в factorY раз sf::Image Design::getNewImage2(int numCell, int factorX, int factorY) { sf::Image img0 = getNewImageY(numCell, factorY); // Растягиваем картинку до нужной нам ширины (factorX) int w = img0.getSize().x; // ширина полосы (необходимо для расчётов) int h = img0.getSize().y; // высота полосы (необходимо для расчётов) sf::Image img; // Создаём картинку которую будем возвращать img.create(factorX, factorY, sf::Color(0,0,0,0)); // Задаём её размеры for(int i=0; i<factorX; i++) // делаем "а" раз нижеуказанное img.copy(img0, i*w, 0, sf::IntRect(0,0,w,h)); // вставляем (каждая следующая ниже на величину h) return img; // возвращаем картинку } // Возвращает картинку под номером numCell увеличенную по ширине в factor раз sf::Image Design::getNewImageX(int numCell, int factor) { int w = vecImage[numCell].getSize().x; // ширина исходной картинки int h = vecImage[numCell].getSize().y; // высота исходной картинки sf::Image img; // создаём картинку, которую будем возвращать img.create(w*factor, h, sf::Color(0,0,0,0)); // Задаём ей форму и цвет for(int i=0; i<factor; i++) // Делаем нижеуказанное factor раз img.copy(vecImage[numCell], i*w, 0, sf::IntRect(0,0,w,h)); // вставляем картинку на 1 пиксель правее return img; // возвращаем картинку } // Возвращает картинку под номером numCell увеличенную по высоте в factor раз sf::Image Design::getNewImageY(int numCell, int factor) { int w = vecImage[numCell].getSize().x; // ширина исходной картинки int h = vecImage[numCell].getSize().y; // высота исходной картинки sf::Image img; // создаём картинку, которую будем возвращать img.create(w, h*factor, sf::Color(0,0,0,0)); // Задаём ей форму и цвет for(int i=0; i<factor; i++) // Делаем нижеуказанное factor раз img.copy(vecImage[numCell], 0, i*h, sf::IntRect(0,0,w,h)); // вставляем картинку на 1 пиксель правее return img; // возвращаем картинку } */ /* // Возвращает картинку под номером numCell из vecImage в зависимости от factorX и factorY (factor - множитель) sf::Image Design::getImage(int numCell, int factorX, int factorY) { // Если размер изменять не нужно, вызываем getImage(...) // Иначе если нужно изменить картинку в обе стороны, вызываем getNewImage2(...) // Иначе если нужно изменить картинку по ширине, вызываем getNewImageX(...) // Иначе нужно изменить картинку по высоте, вызываем getNewImageY(...) if(factorX <= 1 && factorY <= 1) return getImage(numCell); else if(factorX > 1 && factorY > 1) return getNewImage2(numCell, factorX, factorY); else if(factorX > 1) return getNewImageX(numCell, factorX); else return getNewImageY(numCell, factorY); } */ |