2

在新的 GameMaker 2 更新中有很多重大变化: https ://help.yoyogames.com/hc/en-us/articles/360011980018

我们在这个引擎上开发了我们的游戏 ( https://store.steampowered.com/app/733460/First_Feudal/ ) 3 年。之前没有其他处理状态的方法:只有数组。没有结构和模型对象。

所以我们的游戏中有很多数组。我们使用一维和二维数组。从现在开始,GML 只有一维数组,而二维或其他多维数组 - 是一维数组的一维数组。

现在从 2.2 更新到 2.3 GameMaker 后,您的阵列可能工作正常。但也有一些问题。首先,一些数组函数将在下一个版本中弃用。如果您混合 1d 和 2d 逻辑,其中一些(如 array_height_2d)可能会以不同的方式工作。

那么,如何将二维数组更新为新的 2.3 格式,并且以后不要使用过时的函数呢?

4

2 回答 2

1

在大多数情况下,您不必做任何事情 - 旧式 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那样,一维数组无法正常工作,因为二维数组和其中包含数组的数组之间不再有区别。出于我的目的,我可以通过引入一个脚本来解决这个问题,该脚本仅在数组包含其他数组时才返回高度:

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
于 2020-09-08T10:37:06.320 回答
0

首先,我想使用一些脚本(在 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 是否存在

二维数组创建也可能存在一些问题。如果您使用访问器,那么您应该在访问属性之前完全初始化数组。(之前,访问器本身增加了数组大小)

然后修复其他极端情况。

于 2020-09-06T16:56:22.613 回答