Нарисованные квадраты постоянно мерцают между назначенными цветами

Я новичок в GameMaker 1.4, но у меня есть некоторый опыт работы с Python и C++. Я создал матрицу случайных целых чисел от 1 до 5 включительно, чтобы представить количество этажей каждого здания на карте. Я хочу использовать это, чтобы нарисовать набор квадратов 10x10 со светло-серыми квадратами, представляющими более высокие здания. К сожалению, я не могу заставить квадраты оставаться одного цвета. Они постоянно мерцают между цветами.

Как я могу заставить их перестать мерцать и правильно отображать соответствующие значения?

Вот мой сценарий:

// Random 2D Map Height Generator

/*
Generates a matrix which is used for determining 
 the amount of stories per building in the game.

 Then draws squares of different colors to represent
 the number of stories of each building.
*/

ct = irandom(1);
// create array
for (i = 0; i <= global.height; i += 1) {
   for (j = 0; j <= global.width; j += 1) {
      mapArray[i, j] = irandom_range(1, 5);
      if (ct % 2 != 0 && mapArray[i, j] < 5) {
      mapArray[i, j] += 1;
   }
   ct += 1;
   }
}

// make colors
one = make_color_rgb(0, 0, 0);
two = make_color_rgb(51, 51, 51);
three = make_color_rgb(102, 102, 102);
four = make_color_rgb(153, 153, 153);
five = make_color_rgb(204, 204, 204);

// initialize coordinates
ex = 300;
wy = 100;

// count columns

// draw map
for (i = 0; i <= global.height; i += 1) {
   for (j = 0; j <= global.width; j += 1) {
      ex2 = ex + 30;
      wy2 = wy + 30;
      switch (mapArray[i, j])
      {
         case 1:
            draw_set_color(one);
            break;
         case 2:
            draw_set_color(two);
            break;
         case 3:
            draw_set_color(three);
            break;
         case 4:
            draw_set_color(four);
            break;
         case 5:
            draw_set_color(five);
            break;
         default:
            draw_text(200, 200, 
            "ERROR: scr_mapGeneration, case not met");
            break;
      }
      draw_rectangle(ex, wy, ex2, wy2, false);
      ex += 33;
      if (j == global.width) {
         wy += 33;
         ex = 300;
      }
   }
}

Я вызываю его в объекте с событием рисования и выполняю с ним этот код:

script_execute(scr_mapGeneration);

Я вызываю randomize(); в исходном коде создания моей комнаты. Проблема возникает в другой комнате.

Вот картинка того, что получается, очевидно, на этой картинке нет мерцающих квадратов. введите здесь описание изображения

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person LuminousNutria    schedule 14.06.2018    source источник
comment
Я предполагаю, что скрипт выполняется очень часто.   -  person Emond Erno    schedule 14.06.2018
comment
Похоже, это так. Я не уверен, как заставить его выполняться только один раз.   -  person LuminousNutria    schedule 14.06.2018
comment
Есть ли у гейммейкера способ запустить генератор случайных чисел? Если это так, вы можете заполнить его тем же значением в начале скрипта перед вызовом функций irandom() и irandom_range().   -  person user1118321    schedule 14.06.2018
comment
@user1118321 user1118321 Я посмотрю, смогу ли я найти что-нибудь об этом.   -  person LuminousNutria    schedule 14.06.2018


Ответы (2)


Цветам постоянно назначаются новые новые случайные значения, поскольку функция рисования вызывается каждый кадр.

randomize() не имеет ничего общего с вашей проблемой, случайный всегда создает новый случайный, он просто меняет случайное начальное число. ;)

Вы должны вызвать скрипт в событии create один раз, и вместо рисования прямоугольников вы храните их, например. a ds_grid (больше информации здесь) В функции рисования вы просто рисуете сохраненные значения из сетки.

person Aaron H    schedule 20.06.2018

Проблема заключалась в том, что я включил весь текст как часть события рисования. Так что массив постоянно переделывался. Решение состоит в том, чтобы отделить код создания массива и выполнить его при другом событии. Я использовал событие создания для этого.

Я бы привел подробный пример, но это сложно, учитывая природу программы GameMaker, и решение должно быть самоочевидным в любом случае.

person LuminousNutria    schedule 14.06.2018