译:Gamemaker Studio 2.3 语法详解( 二 )

  • 与 ds_map 不同 ,ds_map 几乎可以接受任何 key 值 , 但 struct 变量名称是字符串 , 因此 variable_struct_set(q, 4, "four") 与 variable_struct_set(q, "4", "four") 相同 。
  • Structs for JSON
  • 2.3.1 增加了 json_stringify 和 json_parse 函数 , 它们与现有的 json_encode 和 json_decode 很相似 , 但使用的是 struct 和 array, 而不是像之前的和 map 和 list。
  • 我们可以这样:
    varo ={
    a_number :4.5,
    a_string :"hi!",
    an_array :[1,2,3],
    a_struct:{x:1,y:2}
    };
    show_debug_message(json_stringify(o));
    这会输出下面的信息:
    {"a_string":"hi!","an_array":[1,2,3],"a_struct":{"x":1,"y":2},"a_number":4.5}
    并将该字符串传递给 json_parse 会返回给我们一个嵌套 struct。
    Functions
    以前 , 每个脚本资源都将包含在调用时要运行的单个代码片段 。
    像下面这样:
    /// array_find_index(array, value)
    /// @param array
    /// @param value
    var_arr =argument0;
    var_val =argument1;
    var_len =array_length_1d(_arr);
    for(var_ind =0;_ind <_len;_ind++){
    if(_arr[_ind]==_val)return_ind;
    }
    return-1;
    但现在 , 情况不同了 - 我们可以在同一个脚本资源中有多个独立的片段 , 通过使用 function { } 语法来区分:
    /// @param array
    /// @param value
    functionarray_find_index{
    var_arr =argument0;
    var_val =argument1;
    var_len =array_length_1d(_arr);
    for(var_ind =0;_ind <_len;_ind++){
    if(_arr[_ind]==_val)return_ind;
    }
    return-1;
    }
    /// @param array
    /// @param value
    functionarray_push{
    var_arr =argument0;
    var_val =argument1;
    _arr[@array_length(_arr)]=_val;
    }
    其工作原理如下:
    脚本中的 function name{} 成为一个全局函数 , 这相当于 2.3 之前的工作方式
    functionname{// code here}
    function{} 可以用作表达式 , 允许您执行
    explode =function{
    instance_create_layer(x,y,layer,obj_explosion);
    instance_destroy;
    }
    在 Create 事件中 , 甚至将其用作函数调用中的参数!
    layer__begin("MyLayer",function{
    shader_set (sh_brightness);
    shader_set_uniform_f(shader_get_uniform(sh_brightness,"u_bright"),1);
    });
    layer__end("MyLayer",function{
    shader_reset;
    });
    在另一个函数中/在脚本外的 function name{} 等效于:
    self.name =function{};
    可以更方便使用 。
    任何在脚本内但在函数外的其他代码都将在游戏启动时运行;获取/设置变量将像 global.variable 一样工作:
    show_debug_message("Hello!");// 在创建任何实例之前显示
    variable ="hi!";// sets global.variable
    // ...函数定义
    允许它被用于任何初始设置 。
    然而 , 请注意 , 这个程序在进入第一个房间之前就已经运行了 , 所以 , 如果你想生成实例 , 你会想使用 room_instance_add。
    作为一个令人愉快的奖励 , 你现在可以不用 _execute 来调用存储在变量中的函数 。
    functionscr_hello{
    show_debug_message("Hello, "+argument0 +"!");
    }
    /// ...
    varhi =scr_hello;
    _execute(hi,"you");
    hi ("you");// 新的! 与上面效果一样
    现在 , 开始进行更有趣的补充 。
    命名参数
    函数语法的引入还带来了另一个奇妙的补充--命名的参数!
    以前 , 咱得这么写:
    functionarray_push{
    var_arr =argument0,_val =argument1;
    _arr[@array_length(_arr)]=_val;
    }
    或者
    functionarray_push{
    var_arr =argument[0],_val =argument[1];
    _arr[@array_length(_arr)]=_val;

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。