[TOC]
* * * * *
## 腳本編輯器(Script Editor)

在GameMaker Studio 2中有許多地方都可以編寫代碼,無論是對象、場景還是各個實例,并且GML和拖放編程模式都內置了大量函數來讓降低編碼的難度。但是你仍然會需要自己創建一些特殊的方法來進行調用,或是有個別方法你會在許多地方都要復用,為了方便管理而需要把一部分代碼單獨存放,這就是腳本存在的意義。
> 注意:本節所涉及的腳本,在腳本中編寫的代碼與“事件”、“場景”或“實例”中創建的代碼相同,本節所說的功能適用于所有腳本。
>
> 注意:本頁面介紹的都是用GML語言編寫腳本,但你也可以用拖放模式來創建腳本。無論用什么方式編寫代碼,本頁介紹的編輯器本身的功能全部適用。
腳本都是用GML語言編寫的(詳細的GML介紹可參考GML概述),這是GameMaker Studio 2內置的編程語言。一旦你逐漸熟悉了GameMaker Studio 2,并希望能做些更復雜的東西時,建議你開始學習GML語言,因為這可以更大擴展了制作游戲的可能性。你還可以使用拖放編程的方式來編寫腳本,但是這需要另一套編輯器,這會在“操作腳本”的章節進行介紹,同樣可以使用不同的輸入變量、字符串、布爾值和各種特殊的值,這些值通常被稱為實參,偶爾也被稱為形參。如果你需要在對象中調用這個腳本,你可以把腳本名稱作為GML語言的函數名來使用。你可以在資源樹中右鍵單擊并選擇重命名來給腳本重新命名,需要注意,腳本名稱必需符合函數的腳本規則,必需以字母開頭,并且名稱中只包含字母、數字以及下劃線“_”符號。
如上所述,你可以通過參數把一個數字傳遞給一個腳本,并使用這個參數來執行你所編寫的任務代碼。為了便于理解舉一個例子,設想一個拖放操作(或是用GML寫的代碼),仔細想想它是如何工作的……你把它放在一個事件的代碼區中,指定一些參數,它的實例就會根據你的要求行動。其實代碼是完全一樣的,唯一的區別是這是你自己編寫的。我們不僅可以向腳本傳遞參數,同時也可以要求腳本返回某些值(使用return方法),因此我們可以用這個方法來構建復雜的計算方法(數學方法)或是進行一個復雜的碰撞檢測或其它任意事情。但務必注意,返回方法應該在腳本最末的地方,確保在返回值之后沒有任何需要執行的代碼,因此你需要提前想好腳本的代碼結構。
當你首次創建資源時,會打開腳本編輯器,其中包含以下選項:
### 腳本標簽
腳本編輯器的窗口頂部有一個標簽選項卡,這讓你可以同時打開編輯多個腳本(也可以在首選項中修改設置,改為每個腳本一個獨立窗口)。你可以單擊腳本標簽,然后拖放進行排序操作,或者也可以將選項卡從窗口中拖出來形成一個獨立窗口并單獨放置到工作區中。如果將腳本標簽直接拖出IDE窗口,則會生成一個獨立的新的IDE窗口來存放該腳本,與主窗口的使用完全一致。
### 編輯操作
這里是創建腳本編寫代碼的主要區域,腳本需遵循GML語法規則進行編寫(詳細需參閱“GML概述”部分),而且編輯器自帶補全提示功能:

當你編寫代碼時,編輯器內會彈出(一般會有少許延遲,可在首選項中設置)提示窗口,其中會以首字母順序依次排列可能相關的方法、參數等內容,您可以從中選擇您需要的那項。在使用代碼編輯器時,你還可以選中一行代碼,然后使用Ctrl+C,Ctrl+X和Ctrl+V等標準的快捷鍵來進行復制、剪切和粘貼的操作。
在編寫代碼的過程中,你可能會不小心寫錯,這時候IDE就會警告你犯錯了,它會在出錯的那一行前標記紅色然后還有一個紅色的感嘆號“!”圖標,此時你把鼠標放到錯誤提示區可以看到簡單的錯誤描述,在輸出窗口則會有完整的錯誤信息:

另外,你可以在代碼中進行注釋。注釋對代碼而言十分重要,它能把代碼進行分割,保持更清晰的結構,讓人一目了然為什么這些代碼會在各自的位置。另外如果你與團隊其他成員一起協作時,注釋可以作為有效的筆記,讓其他人能明白你已經做了些什么。即使你是獨自一人進行開發,保留代碼注釋也十分重要,特別是你有其它事情導致你暫時放下了這個項目,一段時間后再回來看它時,能更快回憶起當初的工作內容。
為代碼做注釋非常簡單,你只需要在任何文本行的開頭敲下“//”即可,或者也可以用段落注釋,格式是“/* 注釋內容 */”。另外也可以用快捷鍵直接操作Ctrl+K是標記注釋,Ctrl+Shift+K則是取消注釋格式,下圖是兩種注釋格式示例

腳本中還可以支持JSDoc類型的注釋,這樣你就可以現在JSDoc中定義好一些通用的內容,然后在編輯代碼時會顯示在自動完成提示列表中。
你可能已經注意到了,腳本中的文本顏色有些是彩色的。這是腳本編輯器在解析了對象中內置的變量、函數等內容,然后根據配置對不同內容進行了顏色編碼,這種顏色編碼有助于你看的更加清晰不容易出錯,假如你拼寫了錯誤的名稱或關鍵詞就會立刻得到提示,但如果你不喜歡這種顏色編碼也可以在首選項中選擇關閉(或使用F10),其中也可以自定義不同的顏色編碼。
在編輯器中任意位置右鍵單擊可以打開以下菜單

除了常規的剪切、復制和粘貼等功能外,你還可以選擇將選中的文本設置為注釋格式,添加或刪除縮進,或將代碼窗口分割為1、2、3行來顯示。最后的這些選項可以讓你把窗口分割顯示以方便在其中拖放不同的腳本來比對其中的內容:

這種瀏覽方式在比對或需要同時查看兩個腳本時會非常有效,可以避免再開一個窗口或在幾個標簽之間來回切換。菜單里還有一個在Debug模式下使用斷點的選項,最后是一個將腳本在GML代碼模式和DnD拖放模式下切換的選項。要注意,如果把代碼轉換為DnD拖放代碼塊時,并不會為每一行代碼單獨創建獨立的操作,而是用一個專門的區塊把原先所有的代碼都存放在其中。
在編輯腳本時,你還可以使用代碼片段的功能來提高效率。按下F4(譯者注:官方手冊寫的是F2但已經過時了,現在應該是F4)鍵就會彈出一個代碼片段窗口,你可以自定義自己需要的代碼片段,只需要把他們保存到GameMaker Studio 2的目錄下:\GameMaker Studio 2\TextEditor\snippets.txt中即可,你可以用任何文本編輯器來編輯這個文件:
* 每個代碼片段都是單獨的一行(不能有空行)
* 每個代碼片段都以片段名稱為開頭(會顯示在彈出列表中),名稱后跟一個冒號“:”,后面再接具體的代碼段
* 使用"#"號作為換行符,并把需要被選中的文字放到兩個"|"號之間(譯者目測無效)
請參考文件中現成的代碼段例子,以了解該如何按照上述規則來編寫自己的代碼段,強烈建議你在進行修改操作之前首先備份一下該文件,并備份你所做的任何修改操作,因為一旦重新安裝或更新GameMaker Studio 2都會重置該文件,此時你可以用你備份的文件來恢復你之前所做的修改。
> 譯者注:下面貼出來的這段是目前默認的snippets文件中的預設內容
>
> 1 - block:{# |STATEMENT|;#}#
>
> 2 - if:if (|CONDITION|)#{# STATEMENT;#};#
>
> 3 - if-else:if (|CONDITION|)#{# STATEMENT;#}#else#{# STATEMENT;#};#
>
> 4 - for:for (|INITIALISATION|; CONDITION; INCREMENT)#{# STATEMENT;#};#
>
> 5 - for i:for (i=0; i
>
> 6 - while:while (|CONDITION|)#{# STATEMENT;#};#
>
> 7 - do:do#{# |STATEMENT|;#}#until (CONDITION);#
>
> 8 - repeat:repeat (|EXPRESSION|)#{# STATEMENT;#};#
>
> 9 - switch:switch (|EXPRESSION|)#{# case EXPRESSION: STATEMENT; break;# default: STATEMENT;#}#
>
> 0 - with:with (|EXPRESSION|)#{# STATEMENT;#};#
>
> comment:// |TEXT|
>
> multiline comment:/***************************************************# |TEXT|#?***************************************************/
### 信息欄
IDE底部的信息欄會顯示你當前編輯的行數以及所在的位置。同時也是一個代碼提示器,它會以文本的形式提示你正在編輯的功能或函數所需的參數等信息。當你在編輯器中編寫相關函數代碼時,此處會突出顯示該函數對應所需的參數。如果你在JSDoc腳本注釋中自定義了幫助信息,這里也會進行相應的提示。
- 介紹
- 新手須知
- 版本授權
- 安裝
- 更新
- 發布日志
- 所需SDK
- 賬號
- 首選項設置
- 拖拽編程
- 擴展編輯器設置
- 基本項設置
- 圖片編輯器設置
- 語言設置
- 市場設置
- 對象編輯器設置
- 插件設置
- 資源樹設置
- 場景編輯器設置
- 運行庫設置
- 樣條編輯器設置
- 精靈編輯器設置
- 文本編輯器設置
- 瓷片編輯器設置
- 時間軸設置
- 輸入
- 快速上手
- 概覽
- 啟動頁
- 工作區
- 資源樹
- 工作流
- 創建精靈
- 創建瓷片集
- 創建音頻
- 創建對象
- 創建場景
- 編譯
- 調試
- 快捷鍵
- 菜單
- 文件菜單
- 編輯菜單
- 構建菜單
- 窗口菜單
- 工具菜單
- 市場菜單
- 幫助菜單
- 布局菜單
- 附加信息
- 位運算符和二進制
- 命令行
- 出錯信息
- 文件系統
- 導入非位圖精靈
- JSDoc使用
- 微型WEB服務端
- 過時函數
- 紋理頁
- 使用緩沖區
- 編輯器
- 擴展編輯器
- 字體編輯器
- 圖像編輯器
- 內含文件編輯器
- 備注編輯器
- 對象編輯器
- 路徑編輯器
- 場景編輯器
- 腳本編輯器
- 著色器編輯器
- 音頻編輯器
- 精靈編輯器
- 瓷片集編輯器
- 時間軸編輯器
- 對象可用事件
- 異步事件
- 繪制事件
- 手勢事件
- 其它
- 調試管理器
- 設備管理器
- YoYo資源市場
- 輸出停靠欄
- 項目圖生成器
- 最近使用窗口
- 遠程工作
- 混音器
- 版本控制
- 設置項
- 音頻組
- 配置項
- 跨平臺配置
- 紋理組
- 游戲配置選項
- AmazonFire 配置
- Android配置
- HTML5配置
- iOS配置
- Linux配置
- Mac配置
- Windows配置
- WindowsUWP配置
- 腳本編程
- 拖放編程概覽
- 拖放編程功能索引
- GML概覽
- 代碼
- 數組
- array_create
- array_copy
- array_equals
- array_length_1d
- array_height_2d
- array_length_2d
- 賦值
- 表達式
- 數據存取
- 功能性語法
- 函數
- 腳本
- 注釋
- 關鍵詞
- 變量及作用域
- variable_global_exists
- variable_global_get
- variable_global_set
- variable_instance_exists
- variable_instance_get
- variable_instance_get_names
- variable_instance_set
- 尋址變量
- 評估順序
- 數據類型
- is_array
- is_bool
- is_int32
- is_int64
- is_matrix
- is_ptr
- is_real
- is_string
- is_undefined
- is_vec3
- is_vec4
- 變元計數
- 指針
- 內置變量屬性
- async_load
- health
- lives
- score
- GML函數索引
- asset_get_index
- asset_get_type
- Compatibility_Functions
- Asynchronous Functions
- Audio
- Buffers
- Cameras And Display (攝像機和顯示)
- Cameras(攝像機)
- camera_apply
- camera_create
- camera_create_view
- camera_destroy
- camera_get_active
- camera_get_begin_script
- camera_get_default
- camera_get_end_script
- camera_get_proj_mat
- camera_get_update_script
- camera_get_view_angle
- camera_get_view_border_x
- camera_get_view_border_y
- camera_get_view_height
- camera_get_view_mat
- camera_get_view_speed_x
- camera_get_view_speed_y
- camera_get_view_target
- camera_get_view_width
- camera_get_view_x
- camera_get_view_y
- camera_set_begin_script
- camera_set_default
- camera_set_end_script
- camera_set_proj_mat
- camera_set_update_script
- camera_set_view_angle
- camera_set_view_border
- camera_set_view_mat
- camera_set_view_pos
- camera_set_view_size
- camera_set_view_speed
- camera_set_view_target
- view_camera
- view_current
- view_enabled
- view_get_camera
- view_get_hport
- view_get_surface_id
- view_get_visible
- view_get_wport
- view_get_xport
- view_get_yport
- view_hport
- view_set_camera
- view_set_hport
- view_set_surface_id
- view_set_visible
- view_set_wport
- view_set_xport
- view_set_yport
- view_surface_id
- view_visible
- view_wport
- view_xport
- view_yport
- The Screen Display
- Controls
- Data_Structures(數據結構)
- ds_exists
- ds_set_precision
- DS Grids
- DS Lists(列表)
- ds_list_create
- ds_list_destroy
- ds_list_clear
- ds_list_empty
- ds_list_size
- ds_list_add
- ds_list_set
- ds_list_delete
- ds_list_find_index
- ds_list_find_value
- ds_list_insert
- ds_list_replace
- ds_list_shuffle
- ds_list_sort
- ds_list_copy
- ds_list_read
- ds_list_write
- ds_list_mark_as_list
- ds_list_mark_as_map
- DS Maps(映射表)
- ds_map_exists
- ds_map_create
- ds_map_add
- ds_map_clear
- ds_map_copy
- ds_map_replace
- ds_map_delete
- ds_map_empty
- ds_map_size
- ds_map_find_first
- ds_map_find_last
- ds_map_find_next
- ds_map_find_previous
- ds_map_find_value
- ds_map_read
- ds_map_write
- ds_map_destroy
- ds_map_secure_save
- ds_map_secure_save_buffer
- ds_map_secure_load
- ds_map_secure_load_buffer
- ds_map_add_list
- ds_map_add_map
- ds_map_replace_list
- ds_map_replace_map
- DS Priority Queues
- DS Queues
- DS Stacks
- Debugging
- Drawing
- draw_enable_drawevent
- draw_flush
- Colour(顏色)
- colour_get_blue
- colour_get_green
- colour_get_hue
- colour_get_red
- colour_get_saturation
- colour_get_value
- draw_clear
- draw_clear_alpha
- draw_get_alpha
- draw_get_colour
- draw_getpixel
- draw_getpixel_ext
- draw_set_alpha
- draw_set_colour
- make_colour_hsv
- make_colour_rgb
- merge_colour
- Forms
- draw_arrow
- draw_button
- draw_circle
- draw_circle_colour
- draw_ellipse
- draw_ellipse_colour
- draw_healthbar
- draw_line
- draw_line_colour
- draw_line_width
- draw_line_width_colour
- draw_path
- draw_point
- draw_point_colour
- draw_rectangle
- draw_rectangle_colour
- draw_roundrect
- draw_roundrect_colour
- draw_roundrect_colour_ext
- draw_roundrect_ext
- draw_set_circle_precision
- draw_triangle
- draw_triangle_colour
- GPU
- gpu_get_alphatestenable
- gpu_get_alphatestref
- gpu_get_blendenable
- gpu_get_blendmode
- gpu_get_blendmode_dest
- gpu_get_blendmode_destalpha
- gpu_get_blendmode_ext
- gpu_get_blendmode_ext_sepalpha
- gpu_get_blendmode_src
- gpu_get_blendmode_srcalpha
- gpu_get_colorwriteenable
- gpu_get_cullmode
- gpu_get_fog
- gpu_get_state
- gpu_get_texfilter
- gpu_get_texfilter_ext
- gpu_get_texrepeat
- gpu_get_texrepeat_ext
- gpu_get_zfunc
- gpu_get_ztestenable
- gpu_get_zwriteenable
- gpu_pop_state
- gpu_push_state
- gpu_set_alphatestenable
- gpu_set_alphatestref
- gpu_set_blendenable
- gpu_set_blendmode
- gpu_set_blendmode_ext
- gpu_set_blendmode_ext_sepalpha
- gpu_set_colorwriteenable
- gpu_set_cullmode
- gpu_set_fog
- gpu_set_state
- gpu_set_texfilter
- gpu_set_texfilter_ext
- gpu_set_texrepeat
- gpu_set_texrepeat_ext
- gpu_set_zfunc
- gpu_set_ztestenable
- gpu_set_zwriteenable
- Lighting
- draw_get_lighting
- draw_light_define_ambient
- draw_light_define_direction
- draw_light_define_point
- draw_light_enable
- draw_light_get
- draw_light_get_ambient
- draw_set_lighting
- Mipmapping
- gpu_get_tex_max_aniso
- gpu_get_tex_max_aniso_ext
- gpu_get_tex_max_mip
- gpu_get_tex_max_mip_ext
- gpu_get_tex_min_mip
- gpu_get_tex_min_mip_ext
- gpu_get_tex_mip_bias
- gpu_get_tex_mip_bias_ext
- gpu_get_tex_mip_enable
- gpu_get_tex_mip_enable_ext
- gpu_get_tex_mip_filter
- gpu_get_tex_mip_filter_ext
- gpu_set_tex_max_aniso
- gpu_set_tex_max_aniso_ext
- gpu_set_tex_max_mip
- gpu_set_tex_max_mip_ext
- gpu_set_tex_min_mip
- gpu_set_tex_min_mip_ext
- gpu_set_tex_mip_bias
- gpu_set_tex_mip_bias_ext
- gpu_set_tex_mip_enable
- gpu_set_tex_mip_enable_ext
- gpu_set_tex_mip_filter
- gpu_set_tex_mip_filter_ext
- Particles
- Particle Emitters
- part_emitter_burst
- part_emitter_clear
- part_emitter_create
- part_emitter_destroy
- part_emitter_destroy_all
- part_emitter_exists
- part_emitter_region
- part_emitter_stream
- Particle Systems
- part_particles_clear
- part_particles_count
- part_particles_create
- part_particles_create_colour
- part_system_automatic_draw
- part_system_automatic_update
- part_system_clear
- part_system_create
- part_system_create_layer
- part_system_depth
- part_system_destroy
- part_system_draw_order
- part_system_drawit
- part_system_exists
- part_system_get_layer
- part_system_layer
- part_system_position
- part_system_update
- Particle Types
- part_type_alpha1
- part_type_alpha2
- part_type_alpha3
- part_type_blend
- part_type_clear
- part_type_colour_hsv
- part_type_colour_mix
- part_type_colour_rgb
- part_type_colour1
- part_type_colour2
- part_type_colour3
- part_type_create
- part_type_death
- part_type_destroy
- part_type_direction
- part_type_exists
- part_type_gravity
- part_type_life
- part_type_orientation
- part_type_scale
- part_type_shape
- part_type_size
- part_type_speed
- part_type_sprite
- part_type_step
- Simple Effects
- ef_cloud
- ef_ellipse
- ef_explosion
- ef_firework
- ef_flare
- ef_rain
- ef_ring
- ef_smoke
- ef_smokeup
- ef_snow
- ef_spark
- ef_star
- effect_clear
- effect_create_above
- effect_create_below
- Primitives(基本幾何體)
- draw_primitve_begin
- draw_primitive_begin_texture
- draw_primitive_end
- draw_vertex
- draw_vertex_colour
- draw_vertex_texture
- draw_vertex_texture_colour
- Primitive Building
- vertex_argb
- vertex_begin
- vertex_colour
- vertex_create_buffer
- vertex_create_buffer_ext
- vertex_create_buffer_from_buffer
- vertex_create_buffer_from_buffer_ext
- vertex_delete_buffer
- vertex_end
- vertex_float1
- vertex_float2
- vertex_float3
- vertex_float4
- vertex_freeze
- vertex_get_buffer_size
- vertex_get_number
- vertex_normal
- vertex_position
- vertex_position_3d
- vertex_submit
- vertex_texcoord
- vertex_ubyte4
- Vertex Formats
- vertex_format_add_colour
- vertex_format_add_custom
- vertex_format_add_normal
- vertex_format_add_position
- vertex_format_add_position_3d
- vertex_format_add_textcoord
- vertex_format_begin
- vertex_format_delete
- vertex_format_end
- Sprites_and_Tiles
- draw_enable_swf_aa
- draw_get_swf_aa_level
- draw_self
- draw_set_swf_aa_level
- draw_skeleton
- draw_skeleton_collision
- draw_skeleton_instance
- draw_skeleton_time
- draw_sprite
- draw_sprite_ext
- draw_sprite_general
- draw_sprite_part
- draw_sprite_part_ext
- draw_sprite_pos
- draw_sprite_stretched
- draw_sprite_stretched_ext
- draw_sprite_tiled
- draw_sprite_tiled_ext
- draw_tile
- draw_tilemap
- Surfaces
- application_get_position
- application_surface
- application_surface_draw_enable
- application_surface_enable
- application_surface_is_enabled
- draw_surface
- draw_surface_ext
- draw_surface_general
- draw_surface_part
- draw_surface_part_ext
- draw_surface_stretched
- draw_surface_stretched_ext
- draw_surface_tiled
- draw_surface_tiled_ext
- surface_copy
- surface_copy_part
- surface_create
- surface_create_ext
- surface_exists
- surface_free
- surface_get_height
- surface_get_texture
- surface_get_width
- surface_getpixel
- surface_getpixel_ext
- surface_reset_target
- surface_resize
- surface_save
- surface_save_part
- surface_set_target
- surface_set_target_ext
- The Application Surface
- Text
- draw_highscore
- draw_set_font
- draw_set_halign
- draw_set_valign
- draw_text
- draw_text_colour
- draw_text_ext
- draw_text_ext_colour
- draw_text_ext_transformed
- draw_text_ext_transformed_colour
- draw_text_transformed
- draw_text_transformed_colour
- Textures
- draw_texture_flush
- texture_get_height
- texture_get_texel_height
- texture_get_texel_width
- texture_get_uvs
- texture_get_width
- texture_global_scale
- texture_set_stage
- File Handing
- Fonts
- Game
- In App Purchases
- Instances
- 數學運算(Maths)
- Date and Time
- 數字方法(Number Functions)
- Vector Functions
- Matrices
- Miscellaneous
- Movement and Collisions
- Networking
- Objects
- Paths
- Physics
- 場景(Rooms)
- 常規的場景函數及變量(General Room Functions And Varibales)
- 常規圖層函數(General Layer Functions)
- 瓷片函數(TIlemap Tile Functions)
- 背景圖層(Backgrounds)
- 精靈圖層(Sprites)
- Scirpts
- Shaders
- Sprites
- Steam API
- Strings
- Timelines
- Web
- XBox_Live
- 翻譯名詞對照表