Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

HTML5开发

Defold支持通过常规打包菜单为HTML5平台构建游戏,与其他平台一样。此外,生成的游戏会嵌入到一个常规HTML页面中,该页面可以通过简单的模板系统进行样式设置。

game.project 文件包含了 HTML5 相关设置:

Project settings

堆大小

Defold对HTML5的支持由Emscripten驱动(参见http://en.wikipedia.org/wiki/Emscripten)。简而言之,它为应用程序运行的堆创建了一个内存沙箱。默认情况下,引擎分配了大量的内存(256MB)。这对于典型游戏来说应该绰绰有余。作为优化过程的一部分,您可以选择使用较小的值。为此,请按照以下步骤操作:

  1. heap_size设置为您偏好的值。它应以兆字节表示。
  2. 创建您的HTML5包(见下文)

测试HTML5构建

对于测试,HTML5构建需要一个HTTP服务器。如果您选择Project ▸ Build HTML5,Defold会为您创建一个。

Build HTML5

如果您想测试您的包,只需将其上传到远程HTTP服务器或在包文件夹中创建本地服务器,例如,使用python: Python 2:

python -m SimpleHTTPServer

Python 3:

python -m http.server

或者

python3 -m http.server

您不能通过在浏览器中打开index.html文件来测试HTML5包。这需要HTTP服务器。

如果您在控制台中看到"wasm streaming compile failed: TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'."错误,您必须确保您的服务器对.wasm文件使用application/wasm MIME类型。

创建HTML5包

使用Defold创建HTML5内容很简单,并且遵循与所有其他支持平台相同的模式:从菜单中选择Project ▸ Bundle... ▸ HTML5 Application...

Create HTML5 bundle

HTML5 bundle 支持两种 WebAssembly 架构:

  • wasm-web - 常规的非线程 WebAssembly 引擎。
  • wasm_pthread-web - 可使用线程的 WebAssembly 引擎。

您可以包含其中一种架构,也可以同时包含两种。同时包含时,如果浏览器和托管环境支持,加载器会选择 wasm_pthread-web,否则回退到 wasm-web。规范的目标名称请参阅 Bob 手册

线程引擎要求在安全的跨源隔离页面中使用 SharedArrayBuffer。请通过 HTTPS(或 localhost)提供 bundle,并为服务器配置兼容的跨源隔离标头,通常为:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

页面加载的跨源资源也必须使用兼容的 CORS 或 Cross-Origin-Resource-Policy 标头。如果不满足这些要求,仅包含 wasm_pthread-web 的 bundle 将无法运行;如果游戏可能托管在不支持跨源隔离的网站上,请包含 wasm-web 作为后备。

Defold HTML5 bundle 需要支持 WebAssembly 的现代浏览器。不支持 Internet Explorer 11。

当您单击Create bundle按钮时,系统将提示您选择一个文件夹来创建您的应用程序。导出过程完成后,您将找到运行应用程序所需的所有文件。

已知问题和局限性

  • 热重载 - 热重载在HTML5构建中不起作用。Defold应用程序必须运行自己的小型Web服务器才能从编辑器接收更新,这在HTML5构建中是不可能的。
  • Chrome
    • 调试构建缓慢 - 在HTML5的调试构建中,我们验证所有WebGL图形调用以检测错误。不幸的是,在Chrome上测试时这非常慢。可以通过将game.projectEngine Arguments字段设置为--verify-graphics-calls=false来禁用此功能。
  • 游戏手柄支持 - 有关HTML5上可能需要采取的特殊考虑和步骤,请参阅游戏手柄文档

自定义HTML5包

当生成游戏的HTML5版本时,Defold提供了一个默认网页。它引用了样式和脚本资源,这些资源决定了游戏的呈现方式。

每次导出应用程序时,都会重新创建此内容。如果您希望自定义这些元素中的任何一个,您必须对项目设置进行修改。为此,请在Defold编辑器中打开game.project并滚动到html5部分:

HTML5 Section

有关每个选项的更多信息,请参见项目设置手册

您不能修改builtins文件夹中的默认html/css模板文件。要应用您的修改,请从builtins复制所需的文件,并在game.project中设置此文件。

画布不应使用任何边框或内边距进行样式设置。如果这样做,鼠标输入坐标将会出错。

game.project中,可以关闭Fullscreen按钮和Made with Defold链接。 Defold为index.html提供了深色和浅色主题。默认情况下设置浅色主题,但可以通过更改Custom CSS文件来更改。在Scale Mode字段中还有四种预定义的缩放模式可供选择。

如果您在game.projectDisplay部分)中打开High Dpi选项,所有缩放模式的计算都包括当前屏幕DPI。

Downscale Fit和Fit

对于Fit模式,画布大小将更改为以原始比例在屏幕上显示完整游戏画布。Downscale Fit的唯一区别是,仅当网页内部大小小于游戏的原始画布时才更改大小,但当网页大于原始游戏画布时不会放大。

HTML5 Section

Stretch

对于Stretch模式,画布大小将更改为完全填充网页的内部大小。

HTML5 Section

No Scale

使用No Scale模式,画布大小与您在game.project文件[display]部分中预定义的大小完全相同。

HTML5 Section

标记

我们使用Mustache模板语言来创建index.html文件。当您构建或打包时,HTML和CSS文件会通过一个编译器,该编译器能够用取决于您的项目设置的值替换某些标记。这些标记总是用双大括号或三重大括号({{TOKEN}}{{{TOKEN}}})括起来,取决于字符序列是否应该被转义。如果您经常更改项目设置或打算材料在其他项目中重用,此功能可能很有用。

有关Mustache模板语言的更多信息,请参见手册

任何game.project都可以是一个标记。例如,如果您想使用Display部分中的Width值:

Display section

game.project作为文本打开,并检查您想使用的字段的[section_name]和字段名称。然后您可以将其用作标记:{{section_name.field}}{{{section_name.field}}}

Display section

例如,在HTML模板中的JavaScript中:

function doSomething() {
    var x = {{display.width}};
    // ...
}

此外,我们还有以下自定义标记:

DEFOLD_SPLASH_IMAGE
写入启动图像文件的文件名,如果game.project中的html5.splash_image为空,则为false
{{#DEFOLD_SPLASH_IMAGE}}
		background-image: url("{{DEFOLD_SPLASH_IMAGE}}");
{{/DEFOLD_SPLASH_IMAGE}}
exe-name
不包含不可接受符号的项目名称
DEFOLD_CUSTOM_CSS_INLINE
这是我们在game.project设置中指定的CSS文件内联的地方。
<style>
{{{DEFOLD_CUSTOM_CSS_INLINE}}}
</style>

这个内联块出现在主应用程序脚本加载之前很重要。由于它包含HTML标签,此宏应该出现在三重大括号{{{TOKEN}}}中,以防止字符序列被转义。

DEFOLD_SCALE_MODE_IS_DOWNSCALE_FIT
如果html5.scale_modeDownscale Fit,则此标记为true
DEFOLD_SCALE_MODE_IS_FIT
如果html5.scale_modeFit,则此标记为true
DEFOLD_SCALE_MODE_IS_NO_SCALE
如果html5.scale_modeNo Scale,则此标记为true
DEFOLD_SCALE_MODE_IS_STRETCH
如果html5.scale_modeStretch,则此标记为true
DEFOLD_HEAP_SIZE
game.projecthtml5.heap_size中指定的堆大小,转换为字节。
DEFOLD_ENGINE_ARGUMENTS
game.projecthtml5.engine_arguments中指定的引擎参数,以,符号分隔。
build-timestamp
当前构建时间戳(以秒为单位)。

额外参数

如果创建自定义模板,您可以通过在全局 CUSTOM_PARAMETERS 对象中赋值来更改引擎加载器的参数。内置模板为这些自定义项提供了一个特意留空的 <script id="engine-setup"> 块。

请将 engine-setup 块放在加载 dmloader.js 的脚本之后,并放在调用 EngineLoader.load()engine-start 块之前。

例如:

    <script id="engine-setup" type="text/javascript">
        CUSTOM_PARAMETERS.disable_context_menu = false;
        CUSTOM_PARAMETERS.unsupported_webgl_callback = function() {
            console.log("Oh-oh. WebGL not supported...");
        };
    </script>

CUSTOM_PARAMETERS 可能包含以下字段:

'archive_location_filter':
    将为每个存档路径运行的过滤函数。

'unsupported_webgl_callback':
    如果不支持WebGL则调用的函数。

'engine_arguments':
    将传递给引擎的参数列表(字符串)。

'custom_heap_size':
    指定内存堆大小的字节数。

'disable_context_menu':
    如果为true,则在canvas元素上禁用右键单击上下文菜单。

'retry_time':
    错误后重试文件加载之前的暂停时间(以秒为单位)。

'retry_count':
    尝试下载文件时我们进行多少次尝试。

'can_not_download_file_callback':
    如果在'retry_count'尝试后无法下载文件则调用的函数。

'resize_window_callback':
    当发生调整大小/方向更改/焦点事件时调用的函数。

'start_success':
    成功加载后调用main之前调用的函数。

'update_progress':
    进度更新时调用的函数。参数进度更新为0-100。

HTML5中的文件操作

HTML5构建支持诸如sys.save()sys.load()io.open()之类的文件操作,但这些操作的内部处理方式与其他平台不同。当Javascript在浏览器中运行时,没有真正的文件系统概念,并且出于安全原因阻止了本地文件访问。相反,Emscripten(因此Defold)使用IndexedDB,这是一个用于持久存储数据的浏览器内数据库,在浏览器中创建虚拟文件系统。与其他平台文件系统访问的重要区别在于,写入文件和更改实际存储在数据库之间可能存在轻微延迟。浏览器开发者控制台通常允许您检查IndexedDB的内容。

向HTML5游戏传递参数

有时有必要在游戏启动之前或启动时向游戏提供额外的参数。例如,这可能是用户ID、会话令牌或游戏启动时要加载的关卡。这可以通过多种不同的方式实现,其中一些在此描述。

引擎参数

可以在配置和加载引擎时指定额外的引擎参数。这些额外的引擎参数可以在运行时使用 sys.get_config_string() 获取。请在 index.htmlengine-setup 块中将参数直接分配给 CUSTOM_PARAMETERS.engine_arguments

    <script id="engine-setup" type="text/javascript">
        CUSTOM_PARAMETERS.engine_arguments = [
            "--config=example.foo1=bar1",
            "--config=example.foo2=bar2"
        ];
    </script>

分配新数组会替换 game.project 中配置的所有引擎参数。要保留这些参数并添加另一个参数,请改用 CUSTOM_PARAMETERS.engine_arguments.push("--config=example.foo3=bar3")

您也可以将 --config=example.foo1=bar1, --config=example.foo2=bar2 添加到 game.project 的 HTML5 部分的 Engine Arguments 字段中。这些用逗号分隔的值会添加到生成的 dmloader.js 中的 CUSTOM_PARAMETERS.engine_arguments

在运行时,您可以这样获取值:

local foo1 = sys.get_config_string("example.foo1")
local foo2 = sys.get_config_string("example.foo2")
print(foo1) -- bar1
print(foo2) -- bar2

URL中的查询参数

您可以将参数作为页面URL中查询参数的一部分传递,并在运行时读取这些参数:

https://www.mygame.com/index.html?foo1=bar1&foo2=bar2
local url = html5.run("window.location")
print(url)

一个完整的辅助函数,用于将所有查询参数作为Lua表获取:

local function get_query_parameters()
    local url = html5.run("window.location")
    -- 获取url的查询部分(?号后面的部分)
    local query = url:match(".*?(.*)")
    if not query then
        return {}
    end

    local params = {}
    -- 迭代所有键值对
    for kvp in query:gmatch("([^&]+)") do
        local key, value = kvp:match("(.+)=(.+)")
        params[key] = value
    end
    return params
end

function init(self)
    local params = get_query_parameters()
    print(params.foo1) -- bar1
end

优化

HTML5游戏通常对初始下载大小、启动时间和内存使用有严格要求,以确保游戏在低端设备和慢速互联网连接上加载快速并运行良好。要优化HTML5游戏,建议重点关注以下领域:

常见问题

Q: 为什么我的 HTML5 应用程序在 Chrome 中启动画面处冻结?

A: 在某些情况下,无法从本地文件系统在浏览器中本地运行游戏。从编辑器运行时,游戏会从本地 Web 服务器提供。例如,您可以在 Python 中使用 SimpleHTTPServer

$ python -m SimpleHTTPServer [port]

Q: 为什么我的游戏在加载时因出现”意外的数据大小”错误而崩溃?

A: 当您使用 Windows 进行构建并将其提交到 Git 时,通常会发生这种情况。如果您的 Git 中行尾配置不正确,它将会更改您的行尾,从而也会更改数据大小。请按照以下说明解决问题:https://docs.github.com/en/free-pro-team@latest/github/using-git/configuring-git-to-handle-line-endings