表达式


表达式是一个数学短语,可以包含普通数字、变量、字符串或 GML 函数以及一个或多个 运算符 (如加、减、乘等...)。表达式中使用的值可以是实数(例如 3.4 * 6),以 $ 符号开头的十六进制数字(例如 $00FFAA | $88FFAA),英文双引号之间的字符串(例如 "hello" + "world")以及更复杂表达式使用多个运算符和许多值。

对于表达式,有下面这些运算符(以优先度排序):

= - 用来给一个变量赋值。请注意,在 GameMaker Studio 2 中,这 可以用于比较变量,你可以在例子里和其他人的代码中看到这一点。然而,这是 GameMaker 老版本遗留下来的,比较运算还是应该使用 == 运算符,然后赋值使用 = ,举例如下:

a = 12;
speed = 5;
val = (old_val + 5);


&&、||、^^(与、或 和 异或) - 将两个布尔值结合在一起判断是真还是否。如果下面的例子得出 true ,“{}” 里面的代码将会执行。

if (a == b && c == d) {do something...} // 与
if (a == b || c ==d) {do something...} // 或
if (a == b ^^ c == d) {do something...} // 异或


<、<=、==、!=、>、>= - 这些都是比较运算,且只会得出、 true 或者 false 的结果(true = 1,false = 0)。使用的例子:

if (a < b) {做些什么...}
if (a != b) {做些什么...}


|、&、^、<<、>>:你可以使用这些进行位运算, | = 位运算 “或”,& = 位运算 “与”, ^ = 位运算 “异或”, << = 左移, >> = 右移。使用的例子:

x = (x & $ffffffe0) + 32; // 括号中的运算会将变量偏移为 32、64、128 等 2 的倍数,详见 http://wiki.gamemake.org/index.php?doc-view-6
if (y ^ $1f) > 0 {做些什么...}; //


你可以在以下章节找到有关如何使用按位运算符以及它们能做什么的其他信息: 位运算符

+、-、*、/ - 加,减,乘和除。使用的例子:

c = a * b;
str = a + "world";


++、-- - 递增或递减 。值得注意的是在值之前或之后使用这个运算符结果稍微有些不同。比如:

  • ++a 递增变量并返回增加后的值。
  • a++ 递增变量但是返回增加前的值。
因此,如果代码这样写:

var a = 1;
show_debug_message(string(a++));
show_debug_message(string(++a));


调试输出将会有 1 和 3。这里还有一些使用的例子:

for (var i = 0; i < 10; i++;) {做些什么...};
if hit == true score--;


注意: 在 YYC 目标平台(即标记 YYC 的目标平台),这些表达式是从左到右进行求值的,而在其它目标平台可能会是从右到左,这意味着:

val = max(num, ++num, num++);


根据平台不同可能会得出不同的结果。

div, mod (%) - Division and modulo, where div gives you the amount a value can be divided into producing only an integer quotient, while mod gives you only the remainder of a division. Note that you can only div or mod using integer values. 使用的例子:

secs = time mod 60;
time_str = string(time div 60);


还存在以下一元运算符:
  • ! :布尔操作(boolean)“not”,所以 !true == false
  • - :否定下一个实数或整数值,即取 “负” 操作(对字符串或布尔值无效)
  • ~ :位否定下一个值

表达式的值可以使用数字、变量,或者有返回值的函数,子表达式放在括号里面。所有运算符都适用于实数值,但比较也适用于字符串,“+” 用于连接字符串。


运算符顺序

当一个表达式做多项运算时,使用括号 “()” 分离出运算顺序,这将 非常重要,如果没有明确的用这种方法表明,不同的平台执行上可能会有所不同。比如说,考虑如下代码:

a = b == c || d;

不同平台的编译器用不同的顺序执行运算,如果没有明确体现,可能会导致得出一个奇怪的结果,而影响游戏的体验。为避免这种情况,使用 “()” 括号隔开不同的部分,像这样:

a = (b == c || d); //这样更好
a = ((b == c) || d); //最好

对于不同的表达式,最后还有一些例子以供参考:

{
x = 23; // x 将勇敢的等于 23,不是 233
colour = $FFAA00; // 十六进制经常用来表示颜色值,具体颜色用在线工具查看,ps 当然也可以
str = "hello world";
y += 5; // 等同于 y = y + 5
x *= y; // 等同于 x = x * y;
x = y << 2; // 比如 y = 100; 二进制数是 “1100100”,左移两位是“110010000”,转成十进制是 400。每左移一位多乘一次 2。
x = 23 * ((2 + 4) / sin(y));
str = "hello" + "world";
b = (x < 5) && !(x==2 || x==4);
}


访问器

这些是表达式的 “捷径”,叫做 访问器 ,用于某些特定的 数据结构数组,使你可以快速、轻松地添加、替换数据,无需使用函数调用。详情请见以下页面:

  1. 访问器