GameMaker 2.2* =› 2.3 Обновление массивов исправлений

В новом обновлении GameMaker 2 очень много важных изменений: https://help.yoyogames.com/hc/en-us/articles/360011980018

Мы разрабатываем нашу игру (https://store.steampowered.com/app/733460/First_Feudal/) на этом двигателе в течение 3 лет. Раньше не было другого способа обрабатывать состояние: только массивы. Никаких структур и объектов модели.

Итак, у нас действительно много массивов в нашей игре. Мы используем 1d и 2d массивы. Теперь в GML есть только 1d массивы, а 2d или другие многомерные массивы - это 1d массив из 1d массивов.

На данный момент после обновления с 2.2 до 2.3 GameMaker ваши массивы могут работать нормально. Но есть некоторые проблемы. Во-первых, в следующих версиях некоторые функции массива станут устаревшими. И некоторые из них (например, array_height_2d) могут работать по-другому, если вы смешаете логику 1d и 2d.

Итак, как обновить 2d-массивы до нового формата 2.3 и потом не использовать устаревшие функции?


person SirCapy    schedule 06.09.2020    source источник


Ответы (2)


По большей части вам не нужно ничего делать — старые 2d-аксессоры будут работать нормально:

var a2d; a2d[1, 2] = 3;
show_debug_message(a2d[1, 2]); // 3
show_debug_message(a2d[1][2]); // 3
a2d = [[], [0, 0, 4]];
show_debug_message(a2d[1, 2]); // 4
show_debug_message(a2d[1][2]); // 4

Как вы сами заметили, array_height_2d некорректно работает с 1d-массивами, так как больше нет разницы между 2d-массивом и массивом с массивами в нем. Для моих целей я смог обойти это, введя скрипт, который возвращает высоту, только если массив содержит другие массивы внутри:

function array_height_2d_fixed(arr) {
    var n = array_height_2d(arr);
    if (n == 0) return 0; // empty / not an array
    for (var i = 0; i < n; i++) if (is_array(arr[i])) return n;
    return 1; // no arrays inside
}

так что

var a1d = [0, 1];
show_debug_message(array_height_2d(a1d)); // 2 - wrong!
show_debug_message(array_height_2d_fixed(a1d)); // 1 - right
show_debug_message(array_height_2d(a2d)); // 2
show_debug_message(array_height_2d_fixed(a2d)); // 2
person YellowAfterlife    schedule 08.09.2020
comment
Ага, хороший обходной путь) Но я читал, что функционал для 2d массивов помечен как устаревший и не удалялся только на какой-то переходный период (может я не прав). Вот почему я решил заменить старый функционал. В любом случае, вы должны проверить все функции 2d-массива в приложении, потому что они работают по-разному, когда вы работаете с аксессором @ (вы должны полностью инициализировать массив перед использованием @). Другая функциональность, которая сейчас у нас не работает - быстрое копирование массива по изменению значения (до того, как вы сможете изменить значение в скрипте и изменить его обратно - для быстрого создания полной копии массива). - person SirCapy; 09.09.2020

Во-первых, я хочу сделать это с помощью какого-нибудь скрипта (на vbs или powershell), но эта идея требует много времени из-за проблем с лучшим способом открытия и перезаписи файла. После перезаписи могут возникнуть проблемы с форматом кода файла. + время на исследование регулярных выражений в них. А также разработать какую-то систему логирования (чтобы знать, какие файлы и как меняются). Мы не можем использовать только GMS из-за отсутствия поиска по регулярному выражению.

Поэтому лучшим способом для меня был Notepad++ (https://notepad-plus-plus.org/downloads/ ).

Во-первых, замените все [i,j] на [i][j]

  • Откройте Блокнот++
  • Перетащите папку проекта
  • ПКМ по папке на рабочем месте › Найти в файлах..
  • Вкладка «Найти в файлах»
  • Найдите что: ([\w])(\[\s*)([^\]\[]+)(\s*,\s*)([^\[\]]+)(\s*\])
  • Заменить на: \1\[\3\]\[\5\]
  • Фильтры: *.gml
  • Переключатель регулярного выражения
  • Во всех подпапках флажок
  • Кнопка «Найти все»
  • Исследуйте все найденные места, если все в порядке, кнопка Заменить в файлах.

Затем подумайте о том, чтобы исправить [[i][j],k] на [[i][j]][k]:

  • То же, что и раньше, но
  • Найдите что: ([\w])(\[\s*)([^\]\[]+\]\[[^\]\[]+\])(\s*,\s*)([^\[\]]+)(\s*\])
  • Заменить на: \1\[\3\]\[\5\]
  • Могут быть проблемы, если у вас сложная логика

Во-вторых, замените все array_height_2d на array_length

  • То же, что и раньше, но
  • Найдите что: array_height_2d\(
  • Заменить на: array_length\(
  • Проверить существование array_height_2d

В-третьих, замените все array_length_2d на array_length

  • То же, что и раньше, но
  • Найдите что: (array_length_2d\(\s*)([^\(]+)(\s*,\s*)([^\)]+)(\s*\))
  • Заменить на: array_length\(\2\[\4\]\)
  • Проверить существование array_length_2d (может быть, если вы используете скрипты внутри проверки array_length_2d)

И, наконец, замените все array_length_1d на array_length

  • То же, что и раньше, но
  • Найдите что: array_length_1d\(
  • Заменить на: array_length\(
  • Проверить существование array_length_1d

Также могут быть некоторые проблемы с созданием 2d-массива. Если вы используете аксессоры, вы должны полностью инициализировать массив перед доступом к свойству. (раньше аксессор сам увеличивал размер массива)

Затем закрепите другие угловые корпуса.

person SirCapy    schedule 06.09.2020