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年了。之前没有其他方法可以处理状态:只有数组。没有结构和模型对象。

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

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

那么,如何将2d数组更新为新的2.3格式,并且以后不使用过时的函数

解决方法

在大多数情况下,您无需执行任何操作-老式的2d访问器可以正常工作:

var a2d; a2d[1,2] = 3;
show_debug_message(a2d[1,2]); // 3
show_debug_message(a2d[1][2]); // 3
a2d = [[],[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
,

首先,我想使用一些脚本(在vbs或powershell上)执行此操作,但是由于打开和重写文件的最佳方式存在问题,这个想法想花费很多时间。重写后文件代码格式可能存在问题。 +研究其中的正则表达式的时间。并且还开发了一些日志记录系统(以了解哪些文件以及如何更改)。 我们无法仅使用GMS,因为没有进行正则表达式搜索。

所以对我来说最好的方法是记事本++(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是否存在

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

然后修复其他极端情况。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...