SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › как поменять карту?
В этой теме 5 ответов, 2 участника, последнее обновление Raf_Tank 6 года/лет, 1 месяц назад.
-
АвторСообщения
-
Карта как и в уроке у меня из массива sf::String map[H1], который находится в доп. заголовочном файле map.h. Все функции взаимодействия и прорисовки работают именно с этим массивом map. А как его поменять? Например другой уровень совершенно другая карта. Делал запись
C++123456if (lvl==1) map[H1]={"WWWWWWWWWWW","W W","W W","WWWWWWWWWWW",};Непосредственно в бесконечно цикле перед прорисовкой карты. Но мне сразу же подчёркивает красным знак “=” и при наведении пишет ” Ошибка: отсутствует оператор “=”, соответствующий этим операндам
типы операндов sf::String {…} ”
Так как собственно поменять этот массив?
ты не меняй массив, а сделай еще массив и меняй имя в отрисовке.
Самая первая мысль, пришедшая в мою голову, это и было. НО! У меня много функций взаимодействия именно с map, и переписывать одну и ту же функцию но для кучи разных карт очень неудобно и нерационально, так что этот вариант сразу отлетел по мере его возникновения.
значит надо переписать функции, чтобы они работали с разными массивами. Такой код костыльный, надо рефакторить.
Нет, нет, и ещё раз нет. Это +куча ненужных строчек. Я всё думал как это сделать, и придумал.
Значит первым делом, заходим в map.h и создаём ещё один массив (такого же размера как и основной map), назовём его map1:
C++1234567891011121314151617181920// Основной массив, с которым работают все функцииconst int H = 5;const int W = 6;sf::String map[H]={"WWWWWW","W W","W W","W W","WWWWWW",};// создаём второй массив, допустим это наш уровень 2sf::String map2[H]={"WWWWWW","WWWWWW","W W","WWWWWW","WWWWWW",};// аналогичным образом можно создавать другие массивы (НО! Можно и менять размер массивов, но тогда код будетнемного посложней)Теперь есть 2 способа реализации замены карты. Первый написать отдельную функцию (просто и удобно), или же непосредственно в самом main (тоже просто и удобно, но привык делать функции).
C++12345678910111213141516171819202122232425// объявим в самом верху 2 глобальные переменные bool и intint lvl;bool change_map=false;// дальше функцияvoid changing_map_function(){if (change_map == true) {if (lvl == 2) {for (int i=0; i<H; i++)for (int j=0; j<W; i++){map[i][j] = map2[i][j]; // то есть по сути копируем переписываем map в map2if ( i==H && j==W) change_map=false; // то есть, когда мы дошли до самого последнего значения массива мы останавливаем перепись массива map, иначе он бы переписывался бесконечно, что даёт нагрузку}//конец цикла}// конец условия lvl == 2}// конец условия chnage_map==true}// конец функции// и уже непосредственно в main прописываем функцию в бесконечном цикле (!), и создаём различные условия смены карты, например:int main() {// опустим подробности создания окна и ивентаwhile window.isOpen(){// вот он тот самый бесконечный циклchanging_map_function();if (Keyboard::isKeyPressed(Keyboard::Space)) { lvl=2;change_map=1;} // если нажата клавиша Space, (кстати лучше через ивент сделать) то тогда уровень 2, и меняем карту}// конец бесконечного циклаreturn 0;} // конец int main()Как я писал в коде, массивы необязательно должны быть одинаковых размеров , т.е. для первого уровня размер H, для второго H2. Но тогда нужно будет учитывать какой из массивов больше (учитывать и ширину и высоту отдельно) и добавлять уже другие условия. В общем вот так я справился с этой проблемой. P.S. На такую мысль навел урок про создание бонуса в рандомном месте карты, где просто переписывали один элемент массива, тут же я переписал весь.
Моё личное мнение. Способ, представленный мной намного рациональней и логичней, чем переписывание множества (да даже двух) функций под каждую карту отдельно. Это как, у вас есть рабочий верстак, на котором вы обрабатываете допустим доски. Доски же бывают разные, по составу, длине, ширине и т.д. , и не будешь же ты под каждую доску ставить отдельный верстак.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.