From e7a0c0f2cddd4bbfc31cad9452777dea8eaba9f8 Mon Sep 17 00:00:00 2001 From: LiarOnce Date: Sat, 1 Jun 2024 10:52:43 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20main=20from=20@=20GamemakerChi?= =?UTF-8?q?na/GameMaker-maunl-zh@6880e515be9c03f9757c21e1906b5ad88ad6a3ad?= =?UTF-8?q?=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- The_Asset_Editors/Extension_Creation/Android_Extensions.htm | 2 +- The_Asset_Editors/Extension_Creation/Creating_An_Extension.htm | 2 +- The_Asset_Editors/Extension_Creation/iOS_Extensions.htm | 2 +- The_Asset_Editors/Extensions.htm | 2 +- The_Asset_Editors/Object_Properties/Event_Order.htm | 2 +- The_Asset_Editors/Object_Properties/Object_Events.htm | 2 +- The_Asset_Editors/The_Asset_Editors.htm | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/The_Asset_Editors/Extension_Creation/Android_Extensions.htm b/The_Asset_Editors/Extension_Creation/Android_Extensions.htm index 526eef87..c05472c6 100644 --- a/The_Asset_Editors/Extension_Creation/Android_Extensions.htm +++ b/The_Asset_Editors/Extension_Creation/Android_Extensions.htm @@ -1 +1 @@ -Android Extensions

Android 扩展

要为Android创建一个扩展,你必须分两部分进行。第一部分是添加扩展本身,以及所需的文件,第二部分是创建扩展所需的函数和宏/常量。

函数和常量是用占位符文件来添加的,所以你要添加一个占位符,然后按照上一节的解释定义函数和宏。要添加其余的文件,你需要首先在编辑器的Extra Platforms 部分勾选Android check-box,这将打开扩展的Android属性。

Android Editor

在这里,你可以提供以下细节:

代码注入

任何输入到 "代码注入 "窗口的代码都需要被分成不同的XML组,如上面的截图所示。你在组中使用的XML标签将决定代码被注入到你的应用程序的位置。

你可以使用以下语法来创建代码注入组。

<YYTagName>

// Code to inject

</YYTagName>

以下标签可用于安卓平台。

YYAndroidTopLevelGradle
YYAndroidTopLevelGradleBuildscript
YYAndroidTopLevelGradleBuildscriptRepositories
YYAndroidTopLevelGradleBuildscriptDependencies
YYAndroidTopLevelGradleAllprojects
YYAndroidTopLevelGradleAllprojectsRepositories
YYAndroidTopLevelGradleEnd

YYAndroidGradle
YYAndroidGradleEnd
YYAndroidGradleAndroid
YYAndroidGradleDependencies 
YYAndroidGradleProperties
YYAndroidManifestAttributes
YYAndroidManifestApplicationAttributes
YYAndroidManifestActivityAttributes
YYAndroidManifestActivityInject
YYAndroidManifestApplicationInject
YYAndroidStringValuesInjection
YYAndroidLayout
YYAndroidProguard
YYAndroidLogcat

注入代码的运行时位置取决于标记的类型:

标签类型注入路径
Top Level Gradle{RUNTIME}\android\runner\RootFiles\build.gradle
Module Level Gradle{RUNTIME}\android\runner\ProjectFiles\build.gradle
Android Manifest{RUNTIME}\android\runner\ProjectFiles\src\main\AndroidManifest.xml
Strings{RUNTIME}\android\runner\ProjectFiles\src\main\res\values\strings.xml
Layout{RUNTIME}\android\runner\ProjectFiles\src\main\res\layout\main.xml

注意 这些路径仅适用于VM;对于YYC,注入的代码将进入{RUNTIME}/yyc目录,其中的路径可能与VM的路径不同。

Conditional Injection

You can inject code conditionally, depending on the value of one of the Extension Options.

Inside a code injection group, use toInject with the required option in condition:

<YYIosPlist>
 
<toInject condition='${YYEXTOPT_MyExtension_ShouldInject}'>
...
</toInject>
 
</YYIosPlist>

This will only inject the code between the toInject tags when the option YYEXTOPT_MyExtension_ShouldInject is true. The option should be of the Boolean type.

You can also check against a specific value by specifying it in the match attribute:

<YYIosPlist>
 
<toInject condition='${YYEXTOPT_MyExtension_ShouldInject}' match='FooBar'>
<string>This content is injected IF condition == match</string>
</toInject>
 
</YYIosPlist>

This will only inject the code between the toInject tags when the option YYEXTOPT_MyExtension_ShouldInject is equal to "FooBar". This allows you to match against a value of any type, as this check is done at compile time when all extension option values are provided as strings.

Also see: Using Extension Options

使用提示

File Injection

Within the text files added to your extension (see: Adding Files), you can inject code from the Code Injection window by mentioning a tag inside ${ }. For example, say you have a file with the following contents:

<?xml version="1.0" encoding="UTF-8"?>

${YYAndroidMyInjectionTag}

重要 You can create your own tags for this use. Such custom tags must start with YYAndroid.

The ${YYAndroidMyInjectionTag} part here will be replaced with the contents of the <YYAndroidMyInjectionTag> </YYAndroidMyInjectionTag> group from the extension's Code Injection window.

Custom Files

You can create a folder called "ProjectFiles" in the folder of your extension (alongside its .yy file). Any files placed in this folder will be moved to the root of the generated Android project at compile time, and can also take injection tags as described above.

源文件

一旦你设置正确,你将需要添加你的扩展包工作所需的文件。要做到这一点,你需要点击底部的按钮,添加SDK添加源代码,然后浏览你想添加的文件。添加的文件将和你的扩展名一起存储在Android Source目录中。你可以在任何时候通过右键点击RMB Icon 扩展名,选择在资源管理器中打开,来打开这个位置。

关于你为Android创建本地扩展的信息,请参见示例代码

 

 

\ No newline at end of file +Android Extensions

Android 扩展

要为Android创建一个扩展,你必须分两部分进行。第一部分是添加扩展本身,以及所需的文件,第二部分是创建扩展所需的函数和宏/常量。

函数和常量是用占位符文件来添加的,所以你要添加一个占位符,然后按照上一节的解释定义函数和宏。要添加其余的文件,你需要首先在编辑器的Extra Platforms 部分勾选Android check-box,这将打开扩展的Android属性。

Android Editor

在这里,你可以提供以下细节:

代码注入

任何输入到 "代码注入 "窗口的代码都需要被分成不同的XML组,如上面的截图所示。你在组中使用的XML标签将决定代码被注入到你的应用程序的位置。

你可以使用以下语法来创建代码注入组。

<YYTagName>

// Code to inject

</YYTagName>

以下标签可用于安卓平台。

YYAndroidTopLevelGradle
YYAndroidTopLevelGradleBuildscript
YYAndroidTopLevelGradleBuildscriptRepositories
YYAndroidTopLevelGradleBuildscriptDependencies
YYAndroidTopLevelGradleAllprojects
YYAndroidTopLevelGradleAllprojectsRepositories
YYAndroidTopLevelGradleEnd

YYAndroidGradle
YYAndroidGradleEnd
YYAndroidGradleAndroid
YYAndroidGradleDependencies 
YYAndroidGradleProperties
YYAndroidManifestAttributes
YYAndroidManifestApplicationAttributes
YYAndroidManifestActivityAttributes
YYAndroidManifestActivityInject
YYAndroidManifestApplicationInject
YYAndroidStringValuesInjection
YYAndroidLayout
YYAndroidProguard
YYAndroidLogcat

注入代码的运行时位置取决于标记的类型:

标签类型注入路径
Top Level Gradle{RUNTIME}\android\runner\RootFiles\build.gradle
Module Level Gradle{RUNTIME}\android\runner\ProjectFiles\build.gradle
Android Manifest{RUNTIME}\android\runner\ProjectFiles\src\main\AndroidManifest.xml
Strings{RUNTIME}\android\runner\ProjectFiles\src\main\res\values\strings.xml
Layout{RUNTIME}\android\runner\ProjectFiles\src\main\res\layout\main.xml

注意 这些路径仅适用于VM;对于YYC,注入的代码将进入{RUNTIME}/yyc目录,其中的路径可能与VM的路径不同。

条件注入

您可以有条件地注入代码,具体取决于扩展选项之一的值。

在代码注入组中,使用 toInject,并在 condition 中使用所需选项:

<YYIosPlist>
 
<toInject condition='${YYEXTOPT_MyExtension_ShouldInject}'>
...
</toInject>
 
</YYIosPlist>

这将仅在选项 YYEXTOPT_MyExtension_ShouldInjecttrue 时在 toInject 标记之间注入代码。该选项应为 Boolean 类型。

您还可以通过在 match 属性中指定特定值来检查该值:

<YYIosPlist>
 
<toInject condition='${YYEXTOPT_MyExtension_ShouldInject}' match='FooBar'>
<string>This content is injected IF condition == match</string>
</toInject>
 
</YYIosPlist>

当选项 YYEXTOPT_MyExtension_ShouldInject 等于 "FooBar" 时,这将仅在 toInject 标记之间注入代码。这允许您匹配任何类型的值,因为当所有扩展选项值都作为字符串提供时,此检查将在编译时完成。

另请参阅:使用扩展选项

使用提示

文件注入

Within the text files added to your extension (see: Adding Files), you can inject code from the Code Injection window by mentioning a tag inside ${ }. For example, say you have a file with the following contents:

<?xml version="1.0" encoding="UTF-8"?>

${YYAndroidMyInjectionTag}

重要 您可以为此创建自己的标签。此类自定义标签必须以 YYAndroid 开头。

此处的 ${YYAndroidMyInjectionTag} 部分将替换为扩展的代码注入窗口中的 <YYAndroidMyInjectionTag> </YYAndroidMyInjectionTag>

自定义文件

您可以在扩展名的文件夹中创建一个名为 "ProjectFiles" 的文件夹 (与其 .yy 文件一起)。放置在此文件夹中的任何文件将在编译时移动到生成的 Android 项目的根目录,并且还可以如上所述地使用注入标记。

源文件

一旦你设置正确,你将需要添加你的扩展包工作所需的文件。要做到这一点,你需要点击底部的按钮,添加SDK添加源代码,然后浏览你想添加的文件。添加的文件将和你的扩展名一起存储在Android Source目录中。你可以在任何时候通过右键点击RMB Icon 扩展名,选择在资源管理器中打开,来打开这个位置。

关于你为Android创建本地扩展的信息,请参见示例代码

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/Extension_Creation/Creating_An_Extension.htm b/The_Asset_Editors/Extension_Creation/Creating_An_Extension.htm index d7e3b462..378e0665 100644 --- a/The_Asset_Editors/Extension_Creation/Creating_An_Extension.htm +++ b/The_Asset_Editors/Extension_Creation/Creating_An_Extension.htm @@ -1 +1 @@ -Creating An Extension

创建一个扩展

要创建一个扩展,你首先需要右击RMB Icon资源浏览器中的任何地方,选择创建-扩展。这将在工作区中为你新创建的资源打开扩展属性。

Extension Properties如果你没有看到这个,你可以在资源浏览器中双击你的扩展资源来打开它的属性窗口,或者在它已经打开的情况下关注它。

现在已经准备好让你添加所需的文件和功能,你也可以在这里给扩展名(按照通常的惯例,只有字母/数字,除了下划线"_",没有特殊符号)。如果你愿意,你还可以为扩展设置版本号。

在 "Copies To "下,你可以选择这个扩展被导出的平台。对于一个简单的GML扩展,你不需要担心这个问题,因为它将在所有平台上运行,然而,如果你正在创建一个特定平台的扩展(如Android),那么你需要确保它不要导出到任何不兼容的平台(如iOS,控制台等)。

占位符文件

要向新的扩展名添加文件,你需要点击菜单图标Estension Options Icon 并选择一个占位符文件("添加占位符")或导入目标平台所需的实际文件("添加文件")。

Add Files To An Extension

一个 "通用 "占位符是一个可以是任何类型的文件,除了那些特定平台所要求的(例如没有DLLSO文件),它将不会被使用,除了作为一个 "链接器 "文件来连接一组函数或常量与给定的扩展(通常它只用于iOS和Android扩展,这将在下面的章节解释这些目标)。你还可以添加 "GML "和 "JS "占位符文件,以便更具体地使用。

添加文件

通常情况下,你不需要使用占位符,除非你是为iOS和Android构建的,所以你会选择 "添加文件" 选项,根据他们的目标平台,添加以下任何一个文件。

你会注意到,没有AndroidiOS的文件类型,这是因为它们的设置略有不同。再往下看,你可以找到关于如何设置它们的解释,但首先让我们看看如何为任何一个目标平台创建一个普通的GML扩展,因为这个过程对所有这些平台都是一样的。

创建一个GML扩展

首先,你需要创建将被使用的文件。对于GML扩展,这将是一个文本文件(以.gml为扩展名保存),其格式是这样的:

#define c_alice_blue
return make_color_rgb(240,248,255);


#define instance_create_colour
var i = instance_create_layer(argument0, argument1, argument2, argument3);
with (i)
{
    image_blend = argument3;
}
return i;

正如你所看到的,我们以一个#define的调用开始每个部分,在上面的例子中,它被用来定义两个函数。让我们来看看定义函数的每一部分。

如果你要写一个DLL或JavaScript扩展,那么这个过程将是类似的,但要用正确的语言来写扩展的文件格式。

一旦你完成了这些,你需要将文件添加到扩展名中(使用 "添加文件 "选项),这将为文件属性的扩展名链出一个新窗口。

File Property Window

在这里,你将选择扩展的目标平台(对于GML你将选择它们全部),以及重命名扩展文件和设置其他一些细节,我们稍后会介绍这些。

注意:将文件添加到扩展名中会将其复制到项目目录中,这意味着任何进一步的修改都必须在该副本中进行,以便在游戏中看到它们。你可以在资源浏览器中右键点击你的扩展名,并选择"在资源管理器中打开"来找到该副本。

添加功能

编辑器应该自动填入我们的GML文件中的函数,但如果没有,你可以通过点击函数菜单按钮Estension Options Icon,选择你所需要的,手动添加它们。

Add functions/Constants To An Extension

选择"添加函数"将允许您向扩展添加函数,然后可以在GameMaker中调用该函数,与任何内置函数相同。添加函数后,将打开以下窗口,供您定义函数属性(或者您可以双击函数打开它):

Function Editor

在上图中,我们在函数编辑器中填入了我们在GML扩展文件中定义的函数instance_create_colour()的详细信息(注意,这个函数编辑器窗口并不只是用来定义GML函数的--它在所有扩展类型中都是一样的)。让我们来看看可以为一个函数定义的每个选项。

注意   如果函数是Windows、Mac或Ubuntu的原生扩展的一部分(分别为dll、dylib等),并且它有四个以上的参数,则所有参数必须是相同类型的。

一旦你完成了所有这些,那么这个函数就可以在项目中使用了; 它现在会以自动完成的形式显示,并且还会有颜色编码:

定义的函数也可以被设置为初始函数最终函数,这意味着它们将在游戏开始(初始)和游戏结束(最终)时被自动调用。

重要 所有平台都支持 Init 函数调用,但不是所有平台都会执行 Final 函数调用。这是因为某些平台会直接关闭应用程序,而不给任何通知或时间让这个函数被调用。受此影响的平台主要是 iOSAndroidHTML5PlayStationXbox

你的另一个选择是创建一个。宏可以是一个常量 值,也可以是一个简短的代码片段(关于宏的更多信息,请参见这里)。例如,我们可以从之前定义的GML扩展中删除c_alice_blue 函数,而将其改为宏。要创建一个宏,你可以简单地点击扩展属性中的 "宏 "按钮,它将打开以下窗口。

Macro Editor

这里的编辑器几乎是不言自明的:你给出宏的名称和它的常量值,或者一行简短的代码。注意,如果该宏是一行代码,那么每次调用该宏时都会重新运行代码

创建扩展选项

点击"扩展选项"旁边的齿轮图标,创建或修改你的扩展选项。

在确认提示上点击""后,你会看到一个新的窗口,在这里你可以添加新的扩展选项。

你可以给每个扩展选项一个名称,一个默认值,和一个数据类型。名称是你在扩展代码中内部使用的,用来检索该选项的值。

除了使用 "添加选项 "添加选项外,您还可以使用 "添加章节 "添加章节。 章节不是一个选项,而只是显示在扩展编辑器主窗口的一个标题。如果你有很多选项,想清理最终用户看到的选项列表,可以使用这个方法。

可以创建以下类型的选项:

你也可以点击一个选项旁边的  齿轮图标,给它一个可选的显示名称描述(在悬停在显示名称上时以工具提示出现)。

在额外窗口中,你也可以选择将这个选项导出到与游戏捆绑的options.ini文件中。

最后,你可以选择从编辑器中隐藏该选项,让使用该扩展的终端用户看不到它。

使用扩展选项

你可以通过使用 扩展函数在运行时检索扩展的选项值。

You can also retrieve your extension options in your Compiler Batch Files / Scripts and during Conditional Injection by using the identifier YYEXTOPT_<ExtensionName>_<OptionName>. Keep in mind that since these are executed at compile time, values for the extension options will be retrieved as strings.

注意 您也可以在编译器批处理文件/脚本中使用扩展版本号,使用名称 GMEXT_<ExtensionName>_version

只有当扩展有在运行时使用的功能时,扩展选项才会在运行时可用。然而,无论扩展的使用情况如何,选项将始终被导出到INI文件(如果选项被启用)和批处理脚本中。

代理文件

当使用多个目标平台时,值得注意的是,你可以创建一个只有一套函数/宏的单一扩展,它将在所有平台上工作。这可以通过在你的游戏中只添加一个链接库作为扩展,并将其他链接库放入扩展属性窗口的代理文件列表中来实现。

例如,假设你有一个Windows扩展的dll "Haggis.dll"。你可以简单地将这个dll 复制为Mac的DyLib,将其命名为"libHaggis.dylib",并确保内部函数名称与原Windows dll一致。然后,这个DyLib将被添加到代理文件中,当游戏在Mac目标上运行时被设置为导出,GameMaker将在调用扩展函数时自动使用它。

要添加代理文件,只需单击“属性”窗口中所选资源文件的Add Argument Icon按钮,然后浏览到文件位置。一旦它被添加,你可能需要更新扩展的目标添加适当的模块,当你下一次运行你的游戏,它将包括作为该平台的代理。您也可以通过单击将删除所选代理文件的Remove Argument Icon按钮来删除代理文件。

一旦你添加了你的代理文件,它们将被复制到你的项目的Extensions文件夹中(你可以通过右击RMB Icon 扩展名,选择在资源管理器中打开找到它们),所以如果你需要编辑它们,你应该编辑与游戏捆绑的复制文件而不是导入的源文件,因为GameMaker将使用项目中的文件进行编译。

命名规则

你的代理文件必须遵循下面列出的命名规则,这一点非常重要,因为GameMaker会解析这些名称,并根据文件的扩展名和名称为文件分配目标模块,并自动为你链接文件。如果你不遵循这些约定,你的游戏在运行时可能无法工作,因为GameMaker将无法确定要使用哪个文件,所以它将无法正常加载文件。

下面给出了每个目标平台的命名惯例:

平台名称
Windows 32bit Runtime<Name>.dll, lib<Name>.dll
Windows 64bit Runtime<Name>_x64.dll, lib<Name>_x64.dll
Ubuntu (Linux)<Name>.so, lib<Name>.so,
<Name>_linux.so, lib<Name>_linux.so,

<Name>_arm.so, lib<Name>_arm.so,
lib<Name>_linux_arm.so,

<Name>_arm64.so, lib<Name>_arm64.so, lib<Name>_linux_arm64.so,

<Name>_arm64-v8.so,
lib<Name>_arm64-v8.so, lib<Name>_linux_arm64-v8.so,

<Name>_armeabi-v7a.so, lib<Name>_armeabi-v7a.so, lib<Name>_linux_armeabi-v7a.so
macOS<Name>.dylib, lib<Name>.dylib
HTML5<Name>.js
PS4<Name>.prx, lib<Name>.prx, <Name>_ps4.prx, lib<Name>_ps4.prx
PS5<Name>.prx, lib<Name>.prx, <Name>_ps5.prx, lib<Name>_ps5.prx
Xbox One<Name>.dll, <Name>_xboxone.dll
Xbox Series X|S<Name>.dll, <Name>_xboxseriesxs.dll

使用上述惯例,你要把<Name>部分换成你要添加代理文件的基础文件的名称。

 

 

\ No newline at end of file +Creating An Extension

创建一个扩展

要创建一个扩展,你首先需要右击RMB Icon资源浏览器中的任何地方,选择创建-扩展。这将在工作区中为你新创建的资源打开扩展属性。

Extension Properties如果你没有看到这个,你可以在资源浏览器中双击你的扩展资源来打开它的属性窗口,或者在它已经打开的情况下关注它。

现在已经准备好让你添加所需的文件和功能,你也可以在这里给扩展名(按照通常的惯例,只有字母/数字,除了下划线"_",没有特殊符号)。如果你愿意,你还可以为扩展设置版本号。

在 "Copies To "下,你可以选择这个扩展被导出的平台。对于一个简单的GML扩展,你不需要担心这个问题,因为它将在所有平台上运行,然而,如果你正在创建一个特定平台的扩展(如Android),那么你需要确保它不要导出到任何不兼容的平台(如iOS,控制台等)。

占位符文件

要向新的扩展名添加文件,你需要点击菜单图标Estension Options Icon 并选择一个占位符文件("添加占位符")或导入目标平台所需的实际文件("添加文件")。

Add Files To An Extension

一个 "通用 "占位符是一个可以是任何类型的文件,除了那些特定平台所要求的(例如没有DLLSO文件),它将不会被使用,除了作为一个 "链接器 "文件来连接一组函数或常量与给定的扩展(通常它只用于iOS和Android扩展,这将在下面的章节解释这些目标)。你还可以添加 "GML "和 "JS "占位符文件,以便更具体地使用。

添加文件

通常情况下,你不需要使用占位符,除非你是为iOS和Android构建的,所以你会选择 "添加文件" 选项,根据他们的目标平台,添加以下任何一个文件。

你会注意到,没有AndroidiOS的文件类型,这是因为它们的设置略有不同。再往下看,你可以找到关于如何设置它们的解释,但首先让我们看看如何为任何一个目标平台创建一个普通的GML扩展,因为这个过程对所有这些平台都是一样的。

创建一个GML扩展

首先,你需要创建将被使用的文件。对于GML扩展,这将是一个文本文件(以.gml为扩展名保存),其格式是这样的:

#define c_alice_blue
return make_color_rgb(240,248,255);


#define instance_create_colour
var i = instance_create_layer(argument0, argument1, argument2, argument3);
with (i)
{
    image_blend = argument3;
}
return i;

正如你所看到的,我们以一个#define的调用开始每个部分,在上面的例子中,它被用来定义两个函数。让我们来看看定义函数的每一部分。

如果你要写一个DLL或JavaScript扩展,那么这个过程将是类似的,但要用正确的语言来写扩展的文件格式。

一旦你完成了这些,你需要将文件添加到扩展名中(使用 "添加文件 "选项),这将为文件属性的扩展名链出一个新窗口。

File Property Window

在这里,你将选择扩展的目标平台(对于GML你将选择它们全部),以及重命名扩展文件和设置其他一些细节,我们稍后会介绍这些。

注意:将文件添加到扩展名中会将其复制到项目目录中,这意味着任何进一步的修改都必须在该副本中进行,以便在游戏中看到它们。你可以在资源浏览器中右键点击你的扩展名,并选择"在资源管理器中打开"来找到该副本。

添加功能

编辑器应该自动填入我们的GML文件中的函数,但如果没有,你可以通过点击函数菜单按钮Estension Options Icon,选择你所需要的,手动添加它们。

Add functions/Constants To An Extension

选择"添加函数"将允许您向扩展添加函数,然后可以在GameMaker中调用该函数,与任何内置函数相同。添加函数后,将打开以下窗口,供您定义函数属性(或者您可以双击函数打开它):

Function Editor

在上图中,我们在函数编辑器中填入了我们在GML扩展文件中定义的函数instance_create_colour()的详细信息(注意,这个函数编辑器窗口并不只是用来定义GML函数的--它在所有扩展类型中都是一样的)。让我们来看看可以为一个函数定义的每个选项。

注意 如果函数是Windows、Mac或Ubuntu的原生扩展的一部分(分别为dll、dylib等),并且它有四个以上的参数,则所有参数必须是相同类型的。

一旦你完成了所有这些,那么这个函数就可以在项目中使用了; 它现在会以自动完成的形式显示,并且还会有颜色编码:

定义的函数也可以被设置为初始函数最终函数,这意味着它们将在游戏开始(初始)和游戏结束(最终)时被自动调用。

重要 所有平台都支持 Init 函数调用,但不是所有平台都会执行 Final 函数调用。这是因为某些平台会直接关闭应用程序,而不给任何通知或时间让这个函数被调用。受此影响的平台主要是 iOSAndroidHTML5PlayStationXbox

你的另一个选择是创建一个。宏可以是一个常量 值,也可以是一个简短的代码片段(关于宏的更多信息,请参见这里)。例如,我们可以从之前定义的GML扩展中删除c_alice_blue 函数,而将其改为宏。要创建一个宏,你可以简单地点击扩展属性中的 "宏 "按钮,它将打开以下窗口。

Macro Editor

这里的编辑器几乎是不言自明的:你给出宏的名称和它的常量值,或者一行简短的代码。注意,如果该宏是一行代码,那么每次调用该宏时都会重新运行代码

创建扩展选项

点击"扩展选项"旁边的齿轮图标,创建或修改你的扩展选项。

在确认提示上点击""后,你会看到一个新的窗口,在这里你可以添加新的扩展选项。

你可以给每个扩展选项一个名称,一个默认值,和一个数据类型。名称是你在扩展代码中内部使用的,用来检索该选项的值。

除了使用 "添加选项 "添加选项外,您还可以使用 "添加章节 "添加章节。 章节不是一个选项,而只是显示在扩展编辑器主窗口的一个标题。如果你有很多选项,想清理最终用户看到的选项列表,可以使用这个方法。

可以创建以下类型的选项:

你也可以点击一个选项旁边的  齿轮图标,给它一个可选的显示名称描述(在悬停在显示名称上时以工具提示出现)。

在额外窗口中,你也可以选择将这个选项导出到与游戏捆绑的options.ini文件中。

最后,你可以选择从编辑器中隐藏该选项,让使用该扩展的终端用户看不到它。

使用扩展选项

你可以通过使用 扩展函数在运行时检索扩展的选项值。

您还可以使用标识符YYEXTOPT_<扩展名>_<选项名>条件注入期间和编译器批处理文件/目录中检索扩展选项。请记住,由于这些选项是在编译时执行的,因此扩展选项的值将作为字符串检索。

注意 您也可以在编译器批处理文件/脚本中使用扩展版本号,使用名称 GMEXT_<ExtensionName>_version

只有当扩展有在运行时使用的功能时,扩展选项才会在运行时可用。然而,无论扩展的使用情况如何,选项将始终被导出到INI文件(如果选项被启用)和批处理脚本中。

代理文件

当使用多个目标平台时,值得注意的是,你可以创建一个只有一套函数/宏的单一扩展,它将在所有平台上工作。这可以通过在你的游戏中只添加一个链接库作为扩展,并将其他链接库放入扩展属性窗口的代理文件列表中来实现。

例如,假设你有一个Windows扩展的dll "Haggis.dll"。你可以简单地将这个dll 复制为Mac的DyLib,将其命名为"libHaggis.dylib",并确保内部函数名称与原Windows dll一致。然后,这个DyLib将被添加到代理文件中,当游戏在Mac目标上运行时被设置为导出,GameMaker将在调用扩展函数时自动使用它。

要添加代理文件,只需单击“属性”窗口中所选资源文件的Add Argument Icon按钮,然后浏览到文件位置。一旦它被添加,你可能需要更新扩展的目标添加适当的模块,当你下一次运行你的游戏,它将包括作为该平台的代理。您也可以通过单击将删除所选代理文件的Remove Argument Icon按钮来删除代理文件。

一旦你添加了你的代理文件,它们将被复制到你的项目的Extensions文件夹中(你可以通过右击RMB Icon 扩展名,选择在资源管理器中打开找到它们),所以如果你需要编辑它们,你应该编辑与游戏捆绑的复制文件而不是导入的源文件,因为GameMaker将使用项目中的文件进行编译。

命名规则

你的代理文件必须遵循下面列出的命名规则,这一点非常重要,因为GameMaker会解析这些名称,并根据文件的扩展名和名称为文件分配目标模块,并自动为你链接文件。如果你不遵循这些约定,你的游戏在运行时可能无法工作,因为GameMaker将无法确定要使用哪个文件,所以它将无法正常加载文件。

下面给出了每个目标平台的命名惯例:

平台名称
Windows 32bit Runtime<Name>.dll, lib<Name>.dll
Windows 64bit Runtime<Name>_x64.dll, lib<Name>_x64.dll
Ubuntu (Linux)<Name>.so, lib<Name>.so,
<Name>_linux.so, lib<Name>_linux.so,

<Name>_arm.so, lib<Name>_arm.so,
lib<Name>_linux_arm.so,

<Name>_arm64.so, lib<Name>_arm64.so, lib<Name>_linux_arm64.so,

<Name>_arm64-v8.so,
lib<Name>_arm64-v8.so, lib<Name>_linux_arm64-v8.so,

<Name>_armeabi-v7a.so, lib<Name>_armeabi-v7a.so, lib<Name>_linux_armeabi-v7a.so
macOS<Name>.dylib, lib<Name>.dylib
HTML5<Name>.js
PS4<Name>.prx, lib<Name>.prx, <Name>_ps4.prx, lib<Name>_ps4.prx
PS5<Name>.prx, lib<Name>.prx, <Name>_ps5.prx, lib<Name>_ps5.prx
Xbox One<Name>.dll, <Name>_xboxone.dll
Xbox Series X|S<Name>.dll, <Name>_xboxseriesxs.dll

使用上述惯例,你要把<Name>部分换成你要添加代理文件的基础文件的名称。

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/Extension_Creation/iOS_Extensions.htm b/The_Asset_Editors/Extension_Creation/iOS_Extensions.htm index 36ebf97a..41be6128 100644 --- a/The_Asset_Editors/Extension_Creation/iOS_Extensions.htm +++ b/The_Asset_Editors/Extension_Creation/iOS_Extensions.htm @@ -1 +1 @@ -iOS / tvOS Extensions

iOS / tvOS 扩展

要为 iOS 或 tvOS 创建扩展,必须分两部分进行。第一部分是添加扩展本身以及所需的文件,第二部分是创建扩展所需的函数和宏/常量。

函数和常量是通过占位符文件来添加的,所以你要添加一个占位符,然后按照这里的解释来定义函数和宏。要添加其余的文件,你需要首先在编辑器的附加功能部分勾选iOS 和/或tvOS 复选框,以打开相关的扩展属性窗口(下图是iOS的属性窗口,但tvOS的窗口是完全一样的)。

iOS Editor

在这里,你可以提供以下细节。

代码注入

代码注入可用于iOS/tvOS扩展,方法与Android扩展页面上的描述相同:见代码注入

以下标签可用于iOS和tvOS平台。

YYIosPlist
YYIosEntitlements
YYIosCocoaPods
YYIosCocoaPodsDependencies
YYIosBuildRules
YYIosBuildSettingsInjection
YYIosScriptPhase
YYIosCFBundleURLSchemesArray
YYIosLSApplicationQueriesSchemesArray
YYIosPrivacyManifest

YYTvosPlist
YYTvosEntitlements
YYTvosCocoaPods
YYTvosCocoaPodsDependencies
YYTvosBuildRules
YYTvosBuildSettingsInjection
YYTvosScriptPhase
YYTvosCFBundleURLSchemesArray
YYTvosLSApplicationQueriesSchemesArray
YYTvosPrivacyManifest

代码被注入的运行时位置将取决于标签的类型:

标签类型注入路径
Entitlements{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
${YYXCodeProjName}.entitlements
info.plist{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
Supporting Files\${YYXCodeProjName}-Info.plist
infoPlist.strings{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
en.lproj\InfoPlist.strings
project.pbxproj{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}.xcodeproj\
project.pbxproj
xcscheme{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}.xcodeproj\
xcshareddata\xcschemes\${YYXCodeProjName}.xcscheme
PrivacyManifest{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\Supporting Files\PrivacyInfo.xcprivacy

注意 这些路径仅适用于 VM。 对于 YYC,注入的代码将进入 {RUNTIME}\yyc 目录,其中的路径可能与 VM 的路径不同。

You can also inject tags conditionally. See: Conditional Injection

File Injection

Within the text files added to your extension (see: Adding Files), you can inject code from the Code Injection window by mentioning a tag inside ${ }. For example, say you have a file with the following contents:

<?xml version="1.0" encoding="UTF-8"?>
<dict>

    ${YYIosMyInjectionTag}

</dict>

重要 You can create your own tags for this use. Such custom tags must start with YYIos or YYTvos (depending on the platform).

The ${YYIosMyInjectionTag} part here will be replaced with the contents of the <YYIosMyInjectionTag> </YYIosMyInjectionTag> group from the extension's Code Injection window.

Custom Files

You can create a folder called "iOSProjectFiles" in the folder of your extension (alongside its .yy file). Any files placed in this folder will be moved to the root of the generated Xcode project at compile time, and can also take injection tags as described above.

其他资料

如果你的扩展添加了任何系统框架或第三方框架,这些框架现在将被列在扩展属性窗口中,每个框架旁边都有一个复选框。如果你选中该复选框,你就启用了弱连接,如果你需要用你自己的值 "覆盖 "内含库中的任何符号,这很有用,但应该注意,这样做会减慢连接速度。

关于你为iOS创建原生扩展的信息,请参见 示例代码,关于在扩展中使用CocoaPods的信息,请参见以下指南。

 

 

 

\ No newline at end of file +iOS / tvOS Extensions

iOS / tvOS 扩展

要为 iOS 或 tvOS 创建扩展,必须分两部分进行。第一部分是添加扩展本身以及所需的文件,第二部分是创建扩展所需的函数和宏/常量。

函数和常量是通过占位符文件来添加的,所以你要添加一个占位符,然后按照这里的解释来定义函数和宏。要添加其余的文件,你需要首先在编辑器的附加功能部分勾选iOS 和/或tvOS 复选框,以打开相关的扩展属性窗口(下图是iOS的属性窗口,但tvOS的窗口是完全一样的)。

iOS Editor

在这里,你可以提供以下细节。

代码注入

代码注入可用于iOS/tvOS扩展,方法与Android扩展页面上的描述相同:见代码注入

以下标签可用于iOS和tvOS平台。

YYIosPlist
YYIosEntitlements
YYIosCocoaPods
YYIosCocoaPodsDependencies
YYIosBuildRules
YYIosBuildSettingsInjection
YYIosScriptPhase
YYIosCFBundleURLSchemesArray
YYIosLSApplicationQueriesSchemesArray
YYIosPrivacyManifest

YYTvosPlist
YYTvosEntitlements
YYTvosCocoaPods
YYTvosCocoaPodsDependencies
YYTvosBuildRules
YYTvosBuildSettingsInjection
YYTvosScriptPhase
YYTvosCFBundleURLSchemesArray
YYTvosLSApplicationQueriesSchemesArray
YYTvosPrivacyManifest

代码被注入的运行时位置将取决于标签的类型:

标签类型注入路径
Entitlements{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
${YYXCodeProjName}.entitlements
info.plist{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
Supporting Files\${YYXCodeProjName}-Info.plist
infoPlist.strings{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\
en.lproj\InfoPlist.strings
project.pbxproj{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}.xcodeproj\
project.pbxproj
xcscheme{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}.xcodeproj\
xcshareddata\xcschemes\${YYXCodeProjName}.xcscheme
PrivacyManifest{RUNTIME}\ios\TemplateProject\${YYXCodeProjName}\Supporting Files\PrivacyInfo.xcprivacy

注意 这些路径仅适用于 VM。 对于 YYC,注入的代码将进入 {RUNTIME}\yyc 目录,其中的路径可能与 VM 的路径不同。

也可以有条件地注入标记。请参阅:条件注入

文件注入

在添加到扩展名的文本文件中(请参阅:添加文件),您可以通过在 ${ } 中提及标记来从"代码注入"窗口注入代码。例如,假设您有一个包含以下内容的文件:

<?xml version="1.0" encoding="UTF-8"?>
<dict>

    ${YYIosMyInjectionTag}

</dict>

重要 您可以为此创建自己的标记。此类自定义标记必须以 YYIosYYTvos 开头(取决于平台)。

此处的 ${YYIosMyInjectionTag} 部分将替换为扩展的"代码注入"窗口中的 <YYIosMyInjectionTag> </YYIosMyInjectionTag>

自定义文件

您可以在扩展的文件夹中创建一个名为 "iOSProjectFiles" 的文件夹 (与其 .yy 文件一起)。放置在该文件夹中的任何文件都会在编译时移动到生成的 Xcode 项目的根目录,并且也可以如上所述地使用注入标记。

其他资料

如果你的扩展添加了任何系统框架或第三方框架,这些框架现在将被列在扩展属性窗口中,每个框架旁边都有一个复选框。如果你选中该复选框,你就启用了弱连接,如果你需要用你自己的值 "覆盖 "内含库中的任何符号,这很有用,但应该注意,这样做会减慢连接速度。

关于你为iOS创建原生扩展的信息,请参见 示例代码,关于在扩展中使用CocoaPods的信息,请参见以下指南。

 

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/Extensions.htm b/The_Asset_Editors/Extensions.htm index a5e93e30..19a9c71a 100644 --- a/The_Asset_Editors/Extensions.htm +++ b/The_Asset_Editors/Extensions.htm @@ -1 +1 @@ -The Extension Editor

扩展编辑器

一个扩展包可以用来在GameMaker语言(GML)中添加一些额外的函数和常量,并在项目之间轻松转移它们。扩展函数也可以链接到外部SDK或用其他语言编写的源代码(如Android的Java,iOS的Objective-C等),可以用来扩展你的游戏功能(通常用于实现第三方API,如用于广告、应用内购买等)。

Extensions Properties

扩展可以用来创建一个在所有项目中经常使用的函数库,因此不必将相同的脚本导入到每个项目中,您可以简单地添加一个扩展资源,其中包含您最喜欢的函数和常量的集合。这些功能也可以特定于某个平台,您可以轻松地选择扩展可以在哪个平台上使用。

有关创建扩展的逐步示例,请参见: 创建扩展

若要基于目标平台禁用扩展,请参见: 如何禁用扩展?

导入扩展插件

一般来说,第三方扩展将来自于GameMaker Marketplace ,那些你已经订阅的扩展将会在市场库窗口中列出,这个窗口可以从那里安装。如果您没有从 Marketplace 获得扩展包,您仍然可以通过在资源浏览器中的任何地方右键单击RMB Icon并选择添加现有 ,然后浏览到扩展的位置来选择它来将其添加到项目中。

NOTE If you have a .yymps/.yymp/.gmez package, you can drag it into the IDE to import it, or go under the "Tools" menu and select "Import Local Package".

目标平台

一旦你在资源浏览器中添加了一个扩展,你应该给它一个名字和一个版本号,同时设置你想把它导出到哪些平台。通过取消选中的平台,你可以告诉GameMaker不把扩展作为这些平台的可执行文件的一部分导出。你还应该确保扩展的属性与选定的目标平台相匹配,并根据以下内容为扩展文件选择兼容的导出目标。

注意某些扩展需要遵循GameMaker的特定命名约定,以正确识别其设计所针对的平台和CPU体系结构。有关详细信息,请参阅命名约定

由于一个扩展可以有各种相关的文件,所以有可能为多个平台创建一个扩展,在这种情况下,你要在主扩展编辑器中指定所有的兼容平台(即:勾选旁边的复选框),然后在扩展的每个部分的个别文件属性中,设置这些文件应该被导出的平台。

要更改特定扩展文件或占位符的目标平台,必须首先打开扩展属性 (在 资源浏览器 中双击 LMB Icon 扩展),然后在扩展属性中从右侧选择要编辑的资源文件。在打开的窗口中,可以选择要将该特定文件导出到的平台:

Extension Target Platforms

扩展选项

你正在使用的扩展可能有选项,这些选项将显示在扩展编辑器窗口的底部。

这些将是不同的,取决于扩展,而且不是所有的扩展都有选项。请看你所使用的扩展的文档,了解其选项的信息。

要为自己的扩展设置选项,请参阅: 创建扩展选项

建立时解压

"构建时解压 "选项可用于为特定目标平台准备的压缩档案文件。如果这个选项被启用,该归档文件的内容将被解压缩到已建软件包的包含文件目录中,但只有在被复制到目标平台之后。

例如,如果你对扩展中的.zip文件启用了这个功能,然后从Windows启动macOS 构建,那么.zip存档将被原样从Windows复制到macOS,然后在目标平台(在这里是指macOS)上编译时被解压缩。

调用扩展函数

一旦你设置了你的扩展,你就可以像使用GameMaker语言中的内置函数和常量一样使用它的函数和常量。如果你的游戏是跨平台的(例如,它被设计为在 Windows和Android目标上运行),那么你应该使用OS常量和函数,在调用扩展的特定函数之前检查当前的平台,以防止问题,例如:

switch (os_type)
{
    case os_android:
        call_android_extension_function(x, y, z);
    break;

    case os_windows:
        call_windows_extension_function(x, y, z);
    break;
}

请注意,对于不同的平台,你的扩展可以共享功能名称,因此,如果你有一个不同的扩展文件,(例如)在Windows和Android上弹出一个消息,只要它们都被设置为只输出到各自的平台,这两个扩展文件可以共享相同的功能名称。

如果你想创建自己的扩展,那么你可以从以下网页中找到基本的所需信息。

 

官方的第三方扩展

传统版本的GameMaker内置了很多第三方功能,但这是低效且难以维护的,因为如果第三方改变了任何特定的功能,那么整个GameMaker的IDERuntime就必须要更新。所以,目前的版本采用了使用扩展包来为你的游戏添加第三方支持。这意味着你可以只添加那些你需要的额外功能,你甚至可以调整和编辑它们以适应你的特定需求。

当你选择特定的游戏选项时,大多数这些扩展将为你下载和安装(例如Facebook或谷歌移动广告),但你可以从GameMaker 知识库中每个平台的相应部分找到关于它们的进一步信息。

你可以从以下市场页面找到这些扩展程序:

请注意,这些扩展程序都有一个演示和一个帮助文件(*.pdf格式),解释如何使用它们,因此它们的功能在本手册中没有涉及。

 

 

\ No newline at end of file +The Extension Editor

扩展编辑器

一个扩展包可以用来在GameMaker语言(GML)中添加一些额外的函数和常量,并在项目之间轻松转移它们。扩展函数也可以链接到外部SDK或用其他语言编写的源代码(如Android的Java,iOS的Objective-C等),可以用来扩展你的游戏功能(通常用于实现第三方API,如用于广告、应用内购买等)。

Extensions Properties

扩展可以用来创建一个在所有项目中经常使用的函数库,因此不必将相同的脚本导入到每个项目中,您可以简单地添加一个扩展资源,其中包含您最喜欢的函数和常量的集合。这些功能也可以特定于某个平台,您可以轻松地选择扩展可以在哪个平台上使用。

有关创建扩展的逐步示例,请参见: 创建扩展

若要基于目标平台禁用扩展,请参见: 如何禁用扩展?

导入扩展插件

一般来说,第三方扩展将来自于GameMaker Marketplace ,那些你已经订阅的扩展将会在市场库窗口中列出,这个窗口可以从那里安装。如果您没有从 Marketplace 获得扩展包,您仍然可以通过在资源浏览器中的任何地方右键单击RMB Icon并选择添加现有 ,然后浏览到扩展的位置来选择它来将其添加到项目中。

注意 如果您有 .yymps/.yymp/.gmez 包,则可以将其拖到 IDE 中以导入它,或者转到"工具"菜单下并选择"导入本地包"。

目标平台

一旦你在资源浏览器中添加了一个扩展,你应该给它一个名字和一个版本号,同时设置你想把它导出到哪些平台。通过取消选中的平台,你可以告诉GameMaker不把扩展作为这些平台的可执行文件的一部分导出。你还应该确保扩展的属性与选定的目标平台相匹配,并根据以下内容为扩展文件选择兼容的导出目标。

注意某些扩展需要遵循GameMaker的特定命名约定,以正确识别其设计所针对的平台和CPU体系结构。有关详细信息,请参阅命名约定

由于一个扩展可以有各种相关的文件,所以有可能为多个平台创建一个扩展,在这种情况下,你要在主扩展编辑器中指定所有的兼容平台(即:勾选旁边的复选框),然后在扩展的每个部分的个别文件属性中,设置这些文件应该被导出的平台。

要更改特定扩展文件或占位符的目标平台,必须首先打开扩展属性 (在 资源浏览器 中双击 LMB Icon 扩展),然后在扩展属性中从右侧选择要编辑的资源文件。在打开的窗口中,可以选择要将该特定文件导出到的平台:

Extension Target Platforms

扩展选项

你正在使用的扩展可能有选项,这些选项将显示在扩展编辑器窗口的底部。

这些将是不同的,取决于扩展,而且不是所有的扩展都有选项。请看你所使用的扩展的文档,了解其选项的信息。

要为自己的扩展设置选项,请参阅: 创建扩展选项

建立时解压

"构建时解压 "选项可用于为特定目标平台准备的压缩档案文件。如果这个选项被启用,该归档文件的内容将被解压缩到已建软件包的包含文件目录中,但只有在被复制到目标平台之后。

例如,如果你对扩展中的.zip文件启用了这个功能,然后从Windows启动macOS 构建,那么.zip存档将被原样从Windows复制到macOS,然后在目标平台(在这里是指macOS)上编译时被解压缩。

调用扩展函数

一旦你设置了你的扩展,你就可以像使用GameMaker语言中的内置函数和常量一样使用它的函数和常量。如果你的游戏是跨平台的(例如,它被设计为在 Windows和Android目标上运行),那么你应该使用OS常量和函数,在调用扩展的特定函数之前检查当前的平台,以防止问题,例如:

switch (os_type)
{
    case os_android:
        call_android_extension_function(x, y, z);
    break;

    case os_windows:
        call_windows_extension_function(x, y, z);
    break;
}

请注意,对于不同的平台,你的扩展可以共享功能名称,因此,如果你有一个不同的扩展文件,(例如)在Windows和Android上弹出一个消息,只要它们都被设置为只输出到各自的平台,这两个扩展文件可以共享相同的功能名称。

如果你想创建自己的扩展,那么你可以从以下网页中找到基本的所需信息。

 

官方的第三方扩展

传统版本的GameMaker内置了很多第三方功能,但这是低效且难以维护的,因为如果第三方改变了任何特定的功能,那么整个GameMaker的IDERuntime就必须要更新。所以,目前的版本采用了使用扩展包来为你的游戏添加第三方支持。这意味着你可以只添加那些你需要的额外功能,你甚至可以调整和编辑它们以适应你的特定需求。

当你选择特定的游戏选项时,大多数这些扩展将为你下载和安装(例如Facebook或谷歌移动广告),但你可以从GameMaker 知识库中每个平台的相应部分找到关于它们的进一步信息。

你可以从以下市场页面找到这些扩展程序:

请注意,这些扩展程序都有一个演示和一个帮助文件(*.pdf格式),解释如何使用它们,因此它们的功能在本手册中没有涉及。

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/Object_Properties/Event_Order.htm b/The_Asset_Editors/Object_Properties/Event_Order.htm index 8553fab1..9958837f 100644 --- a/The_Asset_Editors/Object_Properties/Event_Order.htm +++ b/The_Asset_Editors/Object_Properties/Event_Order.htm @@ -1 +1 @@ -Event Order

事件顺序

When considering Events in GameMaker, it should be noted that the exact order that ALL the events are going to occur in each step cannot be clearly stated, simply because it depends on the internal workings of GameMaker and this is subject to change as the software develops or based on the platform where the game is running. However there are certain events that will always run in the same order.

进入房间后

总是以相同方式发生的第一组事件是第一次进入房间时发生的事件。不同事件的触发顺序是:

注意您还可以通过在实例层属性窗口的列表中上下移动特定实例来设置在房间编辑器中创建特定实例的顺序。

每一步/帧

Other than those specific events, events in a game step also always occur in the same order. However, the order of the instances within an event is not always guaranteed, and may vary between different GameMaker versions and target platforms.

As a general rule, you can rely on the order of the events listed below, but not on the order in which the instances in the room execute one event.

For example, you will see below that the "Step" event always executes after the "Begin Step" event, however you cannot guarantee that, for example, Object2 will always execute its Step event after Object1. If you require such an execution order, then making use of a different event is recommended (e.g. putting Object2's Step code in End Step, if you need it to execute after Object1's Step).

So when you have code that relies on specific timing during each step of your game, make use of the events as listed below. To put it simply, first all Begin Step events are executed, then all Step events are executed, after that all End Step events are executed, then all Draw events, etc.

After all Step events are complete, GameMaker executes the Draw events for all instances, in the same game step. Within a particular event (e.g. Draw End), the order in which instances run that event depends on the layer order, e.g. the layer with the highest depth has its instances drawn first, and the layer with the lowest depth is drawn last.

NOTE The layer with the highest depth (which draws first) is displayed at the bottom of the Room Editor's layer list, while the lowest depth layer is at the top (as it is "closer" to the viewer).

Each Draw event draws instances in this order (based on the depth value), and then moves on to the next event, repeating the same instance order (e.g. Draw Begin moving to Draw and then Draw End).

This is the order of the Draw events:

有关这些事件如何与 GameMaker 的绘制相关的更多详细信息,请参阅绘制事件

 

 

\ No newline at end of file +Event Order

事件顺序

在考虑 GameMaker 中的事件时,应注意无法清楚说明每个步骤中所有事件将发生的确切顺序,这仅仅是因为它取决于 GameMaker 的内部工作方式,并且随着软件的开发,这可能会随着软件的开发或基于运行游戏的平台而发生变化。但是,某些事件将始终以相同的顺序运行。

进入房间后

总是以相同方式发生的第一组事件是第一次进入房间时发生的事件。不同事件的触发顺序是:

注意您还可以通过在实例层属性窗口的列表中上下移动特定实例来设置在房间编辑器中创建特定实例的顺序。

每一步/帧

Other than those specific events, events in a game step also always occur in the same order. However, the order of the instances within an event is not always guaranteed, and may vary between different GameMaker versions and target platforms.

As a general rule, you can rely on the order of the events listed below, but not on the order in which the instances in the room execute one event.

For example, you will see below that the "Step" event always executes after the "Begin Step" event, however you cannot guarantee that, for example, Object2 will always execute its Step event after Object1. If you require such an execution order, then making use of a different event is recommended (e.g. putting Object2's Step code in End Step, if you need it to execute after Object1's Step).

So when you have code that relies on specific timing during each step of your game, make use of the events as listed below. To put it simply, first all Begin Step events are executed, then all Step events are executed, after that all End Step events are executed, then all Draw events, etc.

After all Step events are complete, GameMaker executes the Draw events for all instances, in the same game step. Within a particular event (e.g. Draw End), the order in which instances run that event depends on the layer order, e.g. the layer with the highest depth has its instances drawn first, and the layer with the lowest depth is drawn last.

NOTE The layer with the highest depth (which draws first) is displayed at the bottom of the Room Editor's layer list, while the lowest depth layer is at the top (as it is "closer" to the viewer).

Each Draw event draws instances in this order (based on the depth value), and then moves on to the next event, repeating the same instance order (e.g. Draw Begin moving to Draw and then Draw End).

This is the order of the Draw events:

有关这些事件如何与 GameMaker 的绘制相关的更多详细信息,请参阅绘制事件

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/Object_Properties/Object_Events.htm b/The_Asset_Editors/Object_Properties/Object_Events.htm index fc0687ca..8d17a063 100644 --- a/The_Asset_Editors/Object_Properties/Object_Events.htm +++ b/The_Asset_Editors/Object_Properties/Object_Events.htm @@ -1 +1 @@ -Object Events

Object Events

那么,什么是对象事件?基本上,这些都是游戏循环中的谨慎时刻,事情会根据你为它们编程的内容发生。GameMaker与这些事件的循环一起工作-从房间开始的那一刻到它结束的那一刻,有一个游戏循环在运行,每一都会运行或检查一系列事件,您可以选择将GML代码GML视觉动作放置在响应这些事件的对象中(每秒游戏帧数是游戏时间中的一个时刻,由每秒游戏帧数设置控制,也可以称为)。

让我们看看一个有事件和代码的典型对象设置。

Object Editor Events ViewAs你可以看到在我们的例子对象中列出了许多它应该响应的事件,但是最初当你创建一个对象时,这个列表是空的,你必须决定你需要哪些事件以及当这些事件被触发时该对象的实例应该做什么。要向对象中添加事件,按下事件列表底部的添加事件按钮,将弹出以下窗口:

Object Editor Events List这是一个对象可以响应的所有基本事件和事件类别的列表,每个类别中都有子事件来进一步细化行为。例如,如果你点击Key Press Key Press Icon 事件类别,你就会弹出一个进一步的窗口,让你选择对象应该对哪个键做出响应。

一旦你选择了你的事件,事件的编辑窗口 将被链到它,并在右边打开。

在这一点上,你可能会被要求在 GML Visual 和 GML Code之间选择。请参阅 GameMaker语言了解更多信息。

现在,您可以编辑GML代码(或块),以给予对象对该事件的特定行为或反应。

你可以在任何已添加到对象的事件上点击鼠标右键RMB Icon ,以获得以下菜单选项。

Object Editor Events Menu这些选项是:

删除事件时,您可以使用Shift Icon+LMB Icon选择多个事件,然后将它们一起删除。您创建的每个对象都有自己的独立事件列表,这些事件是从对象编辑器添加到其中的。这些事件分为两类:

事件的完整列表如下:

Create Event Icon创建创建

这个事件发生在对象的一个实例被首次创建时,也是通过房间编辑器放置在房间里的实例在进入房间时发生的第一件事。这意味着该事件是初始化变量、启动时间线、设置路径 等......以及其他任何通常只需要做一次或只在房间中首次创建实例时做的事情的理想场所。如果你的对象在对象编辑器或房间编辑器中添加了任何对象变量实例变量,那么这些变量将首先被初始化,然后创建事件将被运行。

记住,你可以从房间编辑器中的实例创建代码 中修改你在创建事件中设置的任何内容,因为那是在实例的创建事件之后直接运行的,可以用来创建实例变量 或覆盖作为对象变量或在实际创建事件中添加的任何变量。

注意 房间中的实例是按照一定的顺序创建的,它们的创建事件也是在逐一创建时执行的。这意味着,当你在创建事件中从其他实例中读取变量时,必须小心谨慎,因为其他实例可能还没有运行其创建事件!

例如:假设ObjectAObjectB之前被创建,而你在这些对象的创建事件里有以下代码:

ObjectA Create - myValue = objectB.myValue;
ObjectB Create - myValue = 10;

ObjectA先被创建,它的创建事件运行,然后游戏崩溃:

"Variable objectB.myValue(100003, -2147483648) not set before reading it."

这只是因为ObjectB还没有被创建,所以在其创建事件中初始化的任何变量还不存在。这就是为什么当你在创建事件中引用其他实例 时必须谨慎,包括在with()块内运行的任何代码。

 

Destroy Event Icon销毁销毁

这个事件是一个实例被销毁时要执行的事件。在给对象添加行为时,它经常被忽略,但它可以非常有用,例如,当敌人被杀死时,它可以产生爆炸或粒子效果,或者在房间的另一个地方重新生成对象的新实例,甚至可以在分数上加分。

 

Clean Up Event Icon清理清理

此事件将在任何从房间中删除对象实例的事件之后调用。因此,如果出现以下情况,则会触发此事件:

它被设计用于"清理"游戏中可能存在的任何动态资源(如表面、数据结构等),或者在实例以任何方式从游戏中移除时执行需要执行一次的任何任务。

请注意,此事件将在触发它的事件之后立即被调用,但直到当前事件结束时,实例才会实际从游戏中移除。例如,如果您在Step Event中调用instance_destroy(),则会调用Destroy Event,然后是Clean Up Event,然后步骤事件的其余部分将完成运行。这意味着在调用instance_destroy()之后,您拥有的任何代码仍将运行,并且如果您已经清理了代码所需的数据结构或其他资源,则可能会导致错误,因此在使用此事件时必须小心。

 

Alarm Event Icon计时器计时器

计时器类别被分成12个事件,每个事件对应一个实例中可能设置的计时器。因此,当你点击添加计时器类别时,你会看到这个窗口。

Object Editor Alarm Events在这里,你选择你想创建的计时器,一旦完成,你会看到它已经被添加到事件窗口,允许你像平常一样向它添加代码。但什么是计时器打响?嗯,它是一个特殊的事件,除非事先设置了计时器,否则它不会做任何事情,它将等待计时器倒计时到0,然后再运行你添加到它的动作或代码。

一旦计时器达到0并运行代码,它就会倒数到-1,在那里它将一直保持,直到再次设置(意味着你可以检查计时器的值是否大于-1,这将告诉你它是否正在运行)。所以,假设你在对象的创建事件中把alarm[0]设置为30,这意味着GameMaker将在运行放在alarm[0]事件中的动作或代码之前倒数30步。注意,将计时器设置为0将不会运行计时器代码,因为虽然事件被触发了,但计时器被立即设置为-1,所以代码被跳过。如果你需要一个计时器来运行下一个步骤,那么你应该把它设置为1。

这可能非常有用,因为它允许你用精确的时刻设置事物的运动,你甚至可以让它们重复,因为没有什么可以阻止你在计时器的事件中设置一个计时器。想象一下,你有一个怪物,你想让它每隔三秒钟向右转......好吧,你可以在它的创建事件中设置一个计时器,以room_speed*3(如果房间速度是30,那就是每秒30步,所以乘以3,你就得到了3秒!)然后在计时器事件中,你会有代码或动作来设置它的方向,以及动作(或代码)来设置其计时器为房间速度*3 ;再者。通过这种方式,你可以设置简单的游戏循环,事情只在特定的时间间隔发生。

值得注意的是,一个没有任何动作或代码的计时器将不会倒数。但是,如果 只有注释,没有代码或动作,那么计时器也会继续倒计时,可以像平时一样进行设置和检查。

 

Step Event Icon

GameMaker将时间划分为,游戏速度定义了每秒应该有多少步(一个步骤也可以被称为)。一个步骤,基本上是一个循环,不断运行的所有事件被检查和触发的必要,而游戏运行,所以你可以想象,步骤事件是当实例存在时在游戏的每一步都检查的事件。

步骤事件实际上由三个子事件组成,概述如下。

Object Editor Step Events

注意首先,所有实例运行其开始步骤事件。然后,所有实例运行其步骤事件。之后,所有实例运行其结束步骤事件。

对于大多数情况,使用标准步骤事件都很好,但有时您需要对运行的代码和运行时间进行更多控制,因此为您提供了开始结束步骤事件。每一步都会检查这三个事件,但它们的顺序永远不会改变,即使将来对GameMaker引擎的更新更改了其他事件,这意味着这是唯一可靠的方法来确保某件事总是在另一件事之前发生。

步骤事件可以用来做什么?嗯,它可以用于需要连续执行的动作或代码。例如,如果一个物体应该跟随另一个物体,在这里你可以对我们所跟随的物体的运动方向进行调整,以保持它在后面平稳地移动。不过要小心处理这个事件,不要在物体的步骤事件中放入很多复杂的动作,尤其是当你打算在游戏室里有很多物体的实例时,因为这可能会使游戏变慢。许多事情都可以放入计时器,或者使用一些其他事件设置为触发,而不是一直发生。

 

Collision Event Icon碰撞碰撞

显然,在制作游戏时,你必须知道一个物体的两个(或多个)实例发生了碰撞,为此我们有碰撞事件。这是一个你放置在一个对象中的事件,然后指定你应该针对哪个其他对象来检查碰撞。

当你没有开启物理时,这些碰撞将根据两个物体的遮罩(遮罩在精灵属性中定义,或者可以在物体属性中独立分配)以及它们是否重叠来计算。请注意,如果碰撞中的一个或另一个实例没有分配掩码(或者精灵掩码被设置为无),即使它正在绘制什么东西也不会被检测到碰撞。

如果物理是启用的,那么碰撞将基于你在物体的物理属性中为其定义的碰撞形状Fixture)的类型,以及它对碰撞的反应。这意味着你可能不需要任何代码来处理碰撞,但这个事件仍然需要至少有一个注释在里面,以便检测碰撞。

最后,应该注意的是,在碰撞事件被触发之前,所有的碰撞将在每个游戏步骤中被计算一次,这样,当碰撞事件运行时,所有的碰撞都已经被计算并预先分配了。这意味着,如果你在这个事件中创建了一个实例,然后试图用它来检查碰撞,那么在游戏循环的下一次迭代之前,碰撞将不会被检测到或解决。

 

Keyboard Icon键盘,键盘,   Keyboard Press Icon键盘按下,键盘按下,  Keyboard Release Icon 键盘松开键盘松开

让玩家控制你游戏的不同方面是非常重要的,为此GameMaker为你提供了一个非常全面的键盘事件列表,可以在三个主要的键盘类别中的任何一个使用。对于一般的键盘类别,只要选定的键被按下,它就会被连续触发 每一步 ,而按压和释放类别的事件只会在最初按压或释放键时被触发一次。

应该注意的是,每当使用一个键时,键盘事件实际上会在房间里的所有活动实例中被触发,但只有那些为该特定键定义了事件的实例才会做出反应,你可以在任何对象中创建多个键盘事件,在游戏运行时,该对象的实例会对所有事件做出反应。

当你向一个对象添加任何键盘事件时,你会看到键盘子事件菜单,你可以指定你要检查的键:

Object Editor Keyboard Events它们中的大多数是相当明显的,但让我们简单地浏览一下这些部分--在顶部我们有方向键,其次是最常用的修改键,然后是键盘的其他部分(分成更多的子部分,这样你就可以得到所需的确切键,如Escape Icon 或 Insert Icon),最后是两个非常特殊的子事件,No KeyAny Key。正如它们的名字所暗示的,这些是检查键被按下时或任何键被按下时的子事件。请注意,数字键盘上的按键只有在数字锁被启用时才会产生相应的事件。

键盘的PressRelease 事件与常规键盘事件几乎完全相同,只是它们不是连续触发,而是只触发一次。当键盘第一次记录到一个键被按下时,它将产生一个键盘按下事件(以及一个常规的键盘事件),之后第一次不再检测到一个键被按下时,它将触发一个键盘释放事件。

重要调试覆盖层打开并接管键盘和/或鼠标输入时,GameMaker不会执行键盘和鼠标事件。模拟按键也不会执行事件。但是,您仍然可以在Step事件中使用键盘输入鼠标输入功能,例如,检查输入。您还可以使用event_perform功能及其类似的。

 

 Mouse Icon鼠标鼠标

鼠标类别被分成一系列的事件,可以选择这些事件来给你一个更精确的控制你的游戏中发生的事情。在这里你可以看到这些事件到底是什么。

Object Editor Mouse Events左边LMB Icon,右边RMB Icon 和中间MMB Icon 按钮事件(无论是正常的,按下释放)都对具有事件的实例的遮罩起作用。这意味着当这些按钮被用于具有鼠标事件的实例的碰撞遮罩时,GameMaker将检查鼠标在房间中的位置。如果与实例边界框有"碰撞",则事件将被触发,因此,请确保具有这些事件的任何实例都有一个带有有效碰撞遮罩的精灵,或者对象有一个在对象属性中选择的遮罩精灵。正如它们的名称所暗示的那样,这些事件将在第一次按下或释放所选鼠标按钮时触发一次,或者在按钮保持不变的每一步中连续触发。

鼠标进入和离开事件也与按钮事件类似,它们也依赖于实例的掩码来工作,但这次它们是在鼠标第一次 "进入"(触摸)实例或鼠标 "离开"(停止触摸)实例时触发的。然而,这些事件不是连续的,每当鼠标进入或离开对象时只被触发一次--所以它们是一种理想的方法,例如,创建需要在鼠标悬停时改变的按钮,当鼠标移开时又恢复正常。

最后,我们还有一个鼠标事件的部分,叫做全局鼠标。在这个子菜单中,你会发现有一些事件是用来记录实例中的鼠标事件的,即使鼠标不在它们上面,甚至不在它们附近。这些事件是为所有实例生成的,如果有为指定事件定义的动作或代码,那么它将被运行,无论鼠标在游戏中的位置如何。

注意在移动的或触摸屏设备上,鼠标左键LMB Icon也可用于检查触摸屏上的手指标签,鼠标右键RMB Icon由双击屏幕触发(可使用代码更改此行为)。

重要调试覆盖层打开并接管键盘和/或鼠标输入时,GameMaker不会执行键盘和鼠标事件。模拟按键也不会执行事件。但是,您仍然可以在Step事件中使用键盘输入鼠标输入功能,例如,检查输入。您还可以使用event_perform功能及其类似的。

 

Gestures Icon手势手势

这个事件是由用户触摸屏幕(在手机上)或点击并移动鼠标(在所有其他平台上)而触发的。这些事件类似于鼠标事件,你有常规版本和全局 版本。这些事件的常规版本只有在触摸发生在有精灵(或掩码)的实例上,并且触摸发生在其边界框内时才会被触发。然而,这些事件的全局版本将由用户在屏幕上的任何地方触摸而触发。

手势事件 检测 如下。

Object Editor Gesture Events不同的事件总是包含一个名为"event_data"的DS地图,它将包含一些带有触摸/点击位置和移动数据的键/值对。关于所有可用的子事件以及它们如何工作的全部细节,请参见以下章节。

  

Other Icon其他其他

在用GameMaker制作游戏时,有一些特殊的事件,它们大多被分组在其他事件下,可以从你选择这个时出现的子事件的弹出菜单中选择。下面是所有这些其他事件的图片。

Object Editor Other Events关于上面图片中列出的每个事件的更多信息,请参见以下部分。

 

Draw Event绘制绘制

这个事件类别是支配你在运行游戏时在屏幕上看到的东西,它被分成各种不相关的事件。

Draw Events正如你所看到的,绘制事件类别有多种不同的事件类型。Draw BeginDrawDraw End是 "标准 "的绘制事件,你可能最常使用。默认情况下,每一个实例都会被调用主绘制事件,不管它是否有精灵,不过如果你将实例标记为不可见,该事件将不会被触发(所以如果你在不可见对象的绘制事件中设置了任何游戏逻辑,请记住这一点,因为它不会运行)。主绘制事件也是GameMaker默认绘制实例精灵的地方,当事件中没有代码或动作时(即:你没有把它添加到对象的事件列表中)。默认绘制使用与实例相关联的精灵,并将在代码中设置的任何转换或应用的动作中绘制。

标准的绘制事件是在绘制GUI事件之前Pre DrawPost Draw事件之间,这意味着在这个事件中绘制的所有东西都在绘制GUI事件的下面,而不考虑图层(即:在绘制GUI事件中绘制的东西总是在普通绘制事件中绘制的东西上面,而不考虑图层顺序)。

请注意,以上只是对Draw Events工作方式的概述,但关于所有可用的子活动的全部细节,请参见以下章节。

  

Async Event异步异步

这个事件类别很特别,因为它所包含的事件不是由GameMaker默认触发的,而是由其他一些动作的结束而触发的,比如加载一个文件,或者来自网络服务器的回复。该类别被分割成以下事件。

Object Editor Asynchronous Events

所以,说你想添加一个图像文件到GameMaker。那么,你可以在一个对象的另一个事件(也许是创建事件)中编码,然后让这个对象在等待时画一个加载条(例如),轮询适当的异步事件,直到告诉GameMaker文件已加载的回调。然后你可以使用这个事件中返回的数据来做其他事情,比如换房间,或者购买物品。

请注意,以上只是对异步事件如何工作的概述,但关于所有可用的子事件的完整细节,请参见下面的章节。

 

 

你还应该注意,你可以给事件命名,或者至少给它们一个简短的描述性文本,在事件编辑器中显示在它们旁边。要做到这一点,只需在事件的代码编辑器的第一行添加以下内容(当使用GML代码时)。

/// @description Your text here

因此,你可以在--例如--一个计时器事件中拥有这样的东西。

/// @description This is the AI Fight alarm

现在在你的事件编辑器中,你会看到这个:

Object Editor Named Events

对于 GML Visual用户来说,添加注释需要使用 Execute Code 动作,这个动作应该放在事件的动作的最上面,在所有其他动作之前。当你添加这个动作时,你再给它加上上面显示的那行代码,以命名该事件,例如。

Naming An Event In DnD关于上述一些活动的其他信息和一般活动的运行顺序,请见以下章节:

 

 

\ No newline at end of file +Object Events

对象事件

那么,什么是对象事件?基本上,这些都是游戏循环中的谨慎时刻,事情会根据你为它们编程的内容发生。GameMaker与这些事件的循环一起工作-从房间开始的那一刻到它结束的那一刻,有一个游戏循环在运行,每一都会运行或检查一系列事件,您可以选择将GML代码GML视觉动作放置在响应这些事件的对象中(每秒游戏帧数是游戏时间中的一个时刻,由每秒游戏帧数设置控制,也可以称为)。

让我们看看一个有事件和代码的典型对象设置。

Object Editor Events ViewAs你可以看到在我们的例子对象中列出了许多它应该响应的事件,但是最初当你创建一个对象时,这个列表是空的,你必须决定你需要哪些事件以及当这些事件被触发时该对象的实例应该做什么。要向对象中添加事件,按下事件列表底部的添加事件按钮,将弹出以下窗口:

Object Editor Events List这是一个对象可以响应的所有基本事件和事件类别的列表,每个类别中都有子事件来进一步细化行为。例如,如果你点击Key Press Key Press Icon 事件类别,你就会弹出一个进一步的窗口,让你选择对象应该对哪个键做出响应。

一旦你选择了你的事件,事件的编辑窗口 将被链到它,并在右边打开。

在这一点上,你可能会被要求在 GML Visual 和 GML Code之间选择。请参阅 GameMaker语言了解更多信息。

现在,您可以编辑GML代码(或块),以给予对象对该事件的特定行为或反应。

你可以在任何已添加到对象的事件上点击鼠标右键RMB Icon ,以获得以下菜单选项。

Object Editor Events Menu这些选项是:

删除事件时,您可以使用Shift Icon+LMB Icon选择多个事件,然后将它们一起删除。您创建的每个对象都有自己的独立事件列表,这些事件是从对象编辑器添加到其中的。这些事件分为两类:

事件的完整列表如下:

Create Event Icon创建创建

这个事件发生在对象的一个实例被首次创建时,也是通过房间编辑器放置在房间里的实例在进入房间时发生的第一件事。这意味着该事件是初始化变量、启动时间线、设置路径 等......以及其他任何通常只需要做一次或只在房间中首次创建实例时做的事情的理想场所。如果你的对象在对象编辑器或房间编辑器中添加了任何对象变量实例变量,那么这些变量将首先被初始化,然后创建事件将被运行。

记住,你可以从房间编辑器中的实例创建代码 中修改你在创建事件中设置的任何内容,因为那是在实例的创建事件之后直接运行的,可以用来创建实例变量 或覆盖作为对象变量或在实际创建事件中添加的任何变量。

注意 房间中的实例是按照一定的顺序创建的,它们的创建事件也是在逐一创建时执行的。这意味着,当你在创建事件中从其他实例中读取变量时,必须小心谨慎,因为其他实例可能还没有运行其创建事件!

例如:假设ObjectAObjectB之前被创建,而你在这些对象的创建事件里有以下代码:

ObjectA Create - myValue = objectB.myValue;
ObjectB Create - myValue = 10;

ObjectA先被创建,它的创建事件运行,然后游戏崩溃:

"Variable objectB.myValue(100003, -2147483648) not set before reading it."

这只是因为ObjectB还没有被创建,所以在其创建事件中初始化的任何变量还不存在。这就是为什么当你在创建事件中引用其他实例 时必须谨慎,包括在with()块内运行的任何代码。

 

Destroy Event Icon销毁销毁

这个事件是一个实例被销毁时要执行的事件。在给对象添加行为时,它经常被忽略,但它可以非常有用,例如,当敌人被杀死时,它可以产生爆炸或粒子效果,或者在房间的另一个地方重新生成对象的新实例,甚至可以在分数上加分。

 

Clean Up Event Icon清理清理

此事件将在任何从房间中删除对象实例的事件之后调用。因此,如果出现以下情况,则会触发此事件:

它被设计用于"清理"游戏中可能存在的任何动态资源(如表面、数据结构等),或者在实例以任何方式从游戏中移除时执行需要执行一次的任何任务。

请注意,此事件将在触发它的事件之后立即被调用,但直到当前事件结束时,实例才会实际从游戏中移除。例如,如果您在Step Event中调用instance_destroy(),则会调用Destroy Event,然后是Clean Up Event,然后步骤事件的其余部分将完成运行。这意味着在调用instance_destroy()之后,您拥有的任何代码仍将运行,并且如果您已经清理了代码所需的数据结构或其他资源,则可能会导致错误,因此在使用此事件时必须小心。

 

Alarm Event Icon计时器计时器

计时器类别被分成12个事件,每个事件对应一个实例中可能设置的计时器。因此,当你点击添加计时器类别时,你会看到这个窗口。

Object Editor Alarm Events在这里,你选择你想创建的计时器,一旦完成,你会看到它已经被添加到事件窗口,允许你像平常一样向它添加代码。但什么是计时器打响?嗯,它是一个特殊的事件,除非事先设置了计时器,否则它不会做任何事情,它将等待计时器倒计时到0,然后再运行你添加到它的动作或代码。

一旦计时器达到0并运行代码,它就会倒数到-1,在那里它将一直保持,直到再次设置(意味着你可以检查计时器的值是否大于-1,这将告诉你它是否正在运行)。所以,假设你在对象的创建事件中把alarm[0]设置为30,这意味着GameMaker将在运行放在alarm[0]事件中的动作或代码之前倒数30步。注意,将计时器设置为0将不会运行计时器代码,因为虽然事件被触发了,但计时器被立即设置为-1,所以代码被跳过。如果你需要一个计时器来运行下一个步骤,那么你应该把它设置为1。

这可能非常有用,因为它允许你用精确的时刻设置事物的运动,你甚至可以让它们重复,因为没有什么可以阻止你在计时器的事件中设置一个计时器。想象一下,你有一个怪物,你想让它每隔三秒钟向右转......好吧,你可以在它的创建事件中设置一个计时器,以room_speed*3(如果房间速度是30,那就是每秒30步,所以乘以3,你就得到了3秒!)然后在计时器事件中,你会有代码或动作来设置它的方向,以及动作(或代码)来设置其计时器为房间速度*3 ;再者。通过这种方式,你可以设置简单的游戏循环,事情只在特定的时间间隔发生。

值得注意的是,一个没有任何动作或代码的计时器将不会倒数。但是,如果 只有注释,没有代码或动作,那么计时器也会继续倒计时,可以像平时一样进行设置和检查。

 

Step Event Icon

GameMaker将时间划分为,游戏速度定义了每秒应该有多少步(一个步骤也可以被称为)。一个步骤,基本上是一个循环,不断运行的所有事件被检查和触发的必要,而游戏运行,所以你可以想象,步骤事件是当实例存在时在游戏的每一步都检查的事件。

步骤事件实际上由三个子事件组成,概述如下。

Object Editor Step Events

注意首先,所有实例运行其开始步骤事件。然后,所有实例运行其步骤事件。之后,所有实例运行其结束步骤事件。

对于大多数情况,使用标准步骤事件都很好,但有时您需要对运行的代码和运行时间进行更多控制,因此为您提供了开始结束步骤事件。每一步都会检查这三个事件,但它们的顺序永远不会改变,即使将来对GameMaker引擎的更新更改了其他事件,这意味着这是唯一可靠的方法来确保某件事总是在另一件事之前发生。

步骤事件可以用来做什么?嗯,它可以用于需要连续执行的动作或代码。例如,如果一个物体应该跟随另一个物体,在这里你可以对我们所跟随的物体的运动方向进行调整,以保持它在后面平稳地移动。不过要小心处理这个事件,不要在物体的步骤事件中放入很多复杂的动作,尤其是当你打算在游戏室里有很多物体的实例时,因为这可能会使游戏变慢。许多事情都可以放入计时器,或者使用一些其他事件设置为触发,而不是一直发生。

 

Collision Event Icon碰撞碰撞

显然,在制作游戏时,你必须知道一个物体的两个(或多个)实例发生了碰撞,为此我们有碰撞事件。这是一个你放置在一个对象中的事件,然后指定你应该针对哪个其他对象来检查碰撞。

当你没有开启物理时,这些碰撞将根据两个物体的遮罩(遮罩在精灵属性中定义,或者可以在物体属性中独立分配)以及它们是否重叠来计算。请注意,如果碰撞中的一个或另一个实例没有分配掩码(或者精灵掩码被设置为无),即使它正在绘制什么东西也不会被检测到碰撞。

如果物理是启用的,那么碰撞将基于你在物体的物理属性中为其定义的碰撞形状Fixture)的类型,以及它对碰撞的反应。这意味着你可能不需要任何代码来处理碰撞,但这个事件仍然需要至少有一个注释在里面,以便检测碰撞。

最后,应该注意的是,在碰撞事件被触发之前,所有的碰撞将在每个游戏步骤中被计算一次,这样,当碰撞事件运行时,所有的碰撞都已经被计算并预先分配了。这意味着,如果你在这个事件中创建了一个实例,然后试图用它来检查碰撞,那么在游戏循环的下一次迭代之前,碰撞将不会被检测到或解决。

 

Keyboard Icon键盘,键盘,   Keyboard Press Icon键盘按下,键盘按下,  Keyboard Release Icon 键盘松开键盘松开

让玩家控制你游戏的不同方面是非常重要的,为此GameMaker为你提供了一个非常全面的键盘事件列表,可以在三个主要的键盘类别中的任何一个使用。对于一般的键盘类别,只要选定的键被按下,它就会被连续触发 每一步 ,而按压和释放类别的事件只会在最初按压或释放键时被触发一次。

应该注意的是,每当使用一个键时,键盘事件实际上会在房间里的所有活动实例中被触发,但只有那些为该特定键定义了事件的实例才会做出反应,你可以在任何对象中创建多个键盘事件,在游戏运行时,该对象的实例会对所有事件做出反应。

当你向一个对象添加任何键盘事件时,你会看到键盘子事件菜单,你可以指定你要检查的键:

Object Editor Keyboard Events它们中的大多数是相当明显的,但让我们简单地浏览一下这些部分--在顶部我们有方向键,其次是最常用的修改键,然后是键盘的其他部分(分成更多的子部分,这样你就可以得到所需的确切键,如Escape Icon 或 Insert Icon),最后是两个非常特殊的子事件,No KeyAny Key。正如它们的名字所暗示的,这些是检查键被按下时或任何键被按下时的子事件。请注意,数字键盘上的按键只有在数字锁被启用时才会产生相应的事件。

键盘的PressRelease 事件与常规键盘事件几乎完全相同,只是它们不是连续触发,而是只触发一次。当键盘第一次记录到一个键被按下时,它将产生一个键盘按下事件(以及一个常规的键盘事件),之后第一次不再检测到一个键被按下时,它将触发一个键盘释放事件。

重要调试覆盖层打开并接管键盘和/或鼠标输入时,GameMaker不会执行键盘和鼠标事件。模拟按键也不会执行事件。但是,您仍然可以在Step事件中使用键盘输入鼠标输入功能,例如,检查输入。您还可以使用event_perform功能及其类似的。

 

 Mouse Icon鼠标鼠标

鼠标类别被分成一系列的事件,可以选择这些事件来给你一个更精确的控制你的游戏中发生的事情。在这里你可以看到这些事件到底是什么。

Object Editor Mouse Events左边LMB Icon,右边RMB Icon 和中间MMB Icon 按钮事件(无论是正常的,按下释放)都对具有事件的实例的遮罩起作用。这意味着当这些按钮被用于具有鼠标事件的实例的碰撞遮罩时,GameMaker将检查鼠标在房间中的位置。如果与实例边界框有"碰撞",则事件将被触发,因此,请确保具有这些事件的任何实例都有一个带有有效碰撞遮罩的精灵,或者对象有一个在对象属性中选择的遮罩精灵。正如它们的名称所暗示的那样,这些事件将在第一次按下或释放所选鼠标按钮时触发一次,或者在按钮保持不变的每一步中连续触发。

鼠标进入和离开事件也与按钮事件类似,它们也依赖于实例的掩码来工作,但这次它们是在鼠标第一次 "进入"(触摸)实例或鼠标 "离开"(停止触摸)实例时触发的。然而,这些事件不是连续的,每当鼠标进入或离开对象时只被触发一次--所以它们是一种理想的方法,例如,创建需要在鼠标悬停时改变的按钮,当鼠标移开时又恢复正常。

最后,我们还有一个鼠标事件的部分,叫做全局鼠标。在这个子菜单中,你会发现有一些事件是用来记录实例中的鼠标事件的,即使鼠标不在它们上面,甚至不在它们附近。这些事件是为所有实例生成的,如果有为指定事件定义的动作或代码,那么它将被运行,无论鼠标在游戏中的位置如何。

注意在移动的或触摸屏设备上,鼠标左键LMB Icon也可用于检查触摸屏上的手指标签,鼠标右键RMB Icon由双击屏幕触发(可使用代码更改此行为)。

重要调试覆盖层打开并接管键盘和/或鼠标输入时,GameMaker不会执行键盘和鼠标事件。模拟按键也不会执行事件。但是,您仍然可以在Step事件中使用键盘输入鼠标输入功能,例如,检查输入。您还可以使用event_perform功能及其类似的。

 

Gestures Icon手势手势

这个事件是由用户触摸屏幕(在手机上)或点击并移动鼠标(在所有其他平台上)而触发的。这些事件类似于鼠标事件,你有常规版本和全局 版本。这些事件的常规版本只有在触摸发生在有精灵(或掩码)的实例上,并且触摸发生在其边界框内时才会被触发。然而,这些事件的全局版本将由用户在屏幕上的任何地方触摸而触发。

手势事件 检测 如下。

Object Editor Gesture Events不同的事件总是包含一个名为"event_data"的DS地图,它将包含一些带有触摸/点击位置和移动数据的键/值对。关于所有可用的子事件以及它们如何工作的全部细节,请参见以下章节。

  

Other Icon其他其他

在用GameMaker制作游戏时,有一些特殊的事件,它们大多被分组在其他事件下,可以从你选择这个时出现的子事件的弹出菜单中选择。下面是所有这些其他事件的图片。

Object Editor Other Events关于上面图片中列出的每个事件的更多信息,请参见以下部分。

 

Draw Event绘制绘制

这个事件类别是支配你在运行游戏时在屏幕上看到的东西,它被分成各种不相关的事件。

Draw Events正如你所看到的,绘制事件类别有多种不同的事件类型。Draw BeginDrawDraw End是 "标准 "的绘制事件,你可能最常使用。默认情况下,每一个实例都会被调用主绘制事件,不管它是否有精灵,不过如果你将实例标记为不可见,该事件将不会被触发(所以如果你在不可见对象的绘制事件中设置了任何游戏逻辑,请记住这一点,因为它不会运行)。主绘制事件也是GameMaker默认绘制实例精灵的地方,当事件中没有代码或动作时(即:你没有把它添加到对象的事件列表中)。默认绘制使用与实例相关联的精灵,并将在代码中设置的任何转换或应用的动作中绘制。

标准的绘制事件是在绘制GUI事件之前Pre DrawPost Draw事件之间,这意味着在这个事件中绘制的所有东西都在绘制GUI事件的下面,而不考虑图层(即:在绘制GUI事件中绘制的东西总是在普通绘制事件中绘制的东西上面,而不考虑图层顺序)。

请注意,以上只是对Draw Events工作方式的概述,但关于所有可用的子活动的全部细节,请参见以下章节。

  

Async Event异步异步

这个事件类别很特别,因为它所包含的事件不是由GameMaker默认触发的,而是由其他一些动作的结束而触发的,比如加载一个文件,或者来自网络服务器的回复。该类别被分割成以下事件。

Object Editor Asynchronous Events

所以,说你想添加一个图像文件到GameMaker。那么,你可以在一个对象的另一个事件(也许是创建事件)中编码,然后让这个对象在等待时画一个加载条(例如),轮询适当的异步事件,直到告诉GameMaker文件已加载的回调。然后你可以使用这个事件中返回的数据来做其他事情,比如换房间,或者购买物品。

请注意,以上只是对异步事件如何工作的概述,但关于所有可用的子事件的完整细节,请参见下面的章节。

 

 

你还应该注意,你可以给事件命名,或者至少给它们一个简短的描述性文本,在事件编辑器中显示在它们旁边。要做到这一点,只需在事件的代码编辑器的第一行添加以下内容(当使用GML代码时)。

/// @description Your text here

因此,你可以在--例如--一个计时器事件中拥有这样的东西。

/// @description This is the AI Fight alarm

现在在你的事件编辑器中,你会看到这个:

Object Editor Named Events

对于 GML Visual用户来说,添加注释需要使用 Execute Code 动作,这个动作应该放在事件的动作的最上面,在所有其他动作之前。当你添加这个动作时,你再给它加上上面显示的那行代码,以命名该事件,例如。

Naming An Event In DnD关于上述一些活动的其他信息和一般活动的运行顺序,请见以下章节:

 

 

\ No newline at end of file diff --git a/The_Asset_Editors/The_Asset_Editors.htm b/The_Asset_Editors/The_Asset_Editors.htm index 45888b8f..0c58c97c 100644 --- a/The_Asset_Editors/The_Asset_Editors.htm +++ b/The_Asset_Editors/The_Asset_Editors.htm @@ -1 +1 @@ -The Asset Editors

资产编辑器

GameMaker有许多不同的编辑器,您可以使用它们来添加、删除和编辑游戏所需的不同资源。在开发过程中,您将需要使用一些——甚至全部——这些编辑器,并且记住每件事情所做的有时可能有点令人生畏。为了帮助解决这个问题,你可以找到下面列出的每一个不同的编辑器,点击其中的任何一个都会带你进入一个详细解释它是什么以及如何使用它的页面。

动画曲线
扩展
字体
笔记
物体
粒子系统
路径
房间
脚本
序列
着色器
声音
精灵
图块集合
时间线
图像

 

 

\ No newline at end of file +The Asset Editors

资源编辑器

GameMaker有许多不同的编辑器,您可以使用它们来添加、删除和编辑游戏所需的不同资源。在开发过程中,您将需要使用一些——甚至全部——这些编辑器,并且记住每件事情所做的有时可能有点令人生畏。为了帮助解决这个问题,你可以找到下面列出的每一个不同的编辑器,点击其中的任何一个都会带你进入一个详细解释它是什么以及如何使用它的页面。

动画曲线
扩展
字体
笔记
物体
粒子系统
路径
房间
脚本
序列
着色器
声音
精灵
图块集合
时间线
图像

 

 

\ No newline at end of file