运算顺序

当使用GameMaker语言编程你的游戏时,你应该意识到函数调用参数并不能保证计算顺序。这意味着代码中函数的运行顺序会因平台而异,因此应该以显式的方式编写它们。这是由于不同目标平台之间的优化差异,例如在Windows目标函数参数可能从右向左计算,但在HTML5目标上,它们可能从左向右计算。因此,为了避免任何问题,你最好不要在一个函数调用的参数中调用多个函数,因为你可能会建立对求值顺序的依赖。

要了解这意味着什么,考虑以下代码,它有一个脚本函数 "buffer_get_info",它调用几个运行时函数并使用它们作为参数:

buffer_seek(buff, buffer_seek_start, 0);
buffer_get_info(buffer_read(buff, buffer_s8), buffer_read(buff, buffer_s16),buffer_read(buff, buffer_s16));

现在,这里的问题是,在某些平台上,最后的 buffer_read()将被先调用,因此脚本的所有参数都是错误的,因为数据是从缓冲区以“相反”的顺序读取的,正如您所理解的那样。这在这里产生了连锁反应,影响了buffer_read()函数的所有进一步值,因此传递给这个脚本函数的所有参数都是错误的!

要避免这种情况,您应该以所需的顺序显式调用函数,并将返回的值存储在变量中,如下所示:

var val[0] = buffer_read(buff, buffer_s8);
var val[1] = buffer_read(buff, buffer_s16);
var val[2] = buffer_read(buff, buffer_s16);
buffer_get_info(val[0], val[1], val[2]);

虽然它看起来似乎是一种更详细的方法,但它保持了一切清晰,并避免了任何可能的运算顺序问题。

使用表达式 时也应注意,因为它们的计算顺序将根据要编译到的目标而改变。因此,在代码中使用表达式时,请确保使用括号()来正确控制操作顺序。这对于确保您的游戏在所有目标平台游戏中的正确行为非常重要,并且对于HTML5平台来说是必不可少的表达式上的页面对此进行了更详细的说明。