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
Defold підтримує збирання ігор для платформи HTML5 через звичайне меню пакування, як і для інших платформ. Крім того, отриману гру вбудовано у звичайну HTML-сторінку, оформлення якої можна змінювати за допомогою простої системи шаблонів.
Файл game.project містить налаштування для HTML5:

Підтримка HTML5 у Defold ґрунтується на Emscripten (див. http://en.wikipedia.org/wiki/Emscripten). Якщо коротко, він створює ізольовану область пам’яті для купи (heap), у якій працює застосунок. За замовчуванням рушій виділяє значний обсяг пам’яті (256 МБ). Для типової гри цього має бути більш ніж достатньо. Під час оптимізації ви можете вибрати менше значення. Для цього виконайте такі кроки:
Для тестування збірки HTML5 потрібен HTTP-сервер. Defold створює його, якщо вибрати Project ▸ Build HTML5.

Щоб протестувати пакет, завантажте його на віддалений HTTP-сервер або створіть локальний сервер, наприклад за допомогою Python у папці пакета. Python 2:
python -m SimpleHTTPServer
Python 3:
python -m http.server
або
python3 -m http.server
Не можна протестувати пакет HTML5, просто відкривши файл index.html у браузері. Для цього потрібен HTTP-сервер.
Якщо в консолі з’являється помилка "wasm streaming compile failed: TypeError: Failed to execute ‘compile’ on ‘WebAssembly’: Incorrect response MIME type. Expected ‘application/wasm’.", переконайтеся, що ваш сервер використовує MIME-тип application/wasm для файлів .wasm.
Створювати вміст HTML5 за допомогою Defold просто: процес такий самий, як і для всіх інших підтримуваних платформ. Виберіть у меню Project ▸ Bundle... ▸ HTML5 Application...:

Пакети HTML5 підтримують дві архітектури WebAssembly:
wasm-web — звичайний рушій WebAssembly без підтримки потоків.wasm_pthread-web — рушій WebAssembly, який може використовувати потоки.Можна включити будь-яку з цих архітектур або обидві. Якщо включено обидві, завантажувач вибирає wasm_pthread-web, коли браузер і середовище розміщення підтримують її, а в іншому разі використовує wasm-web. Канонічні назви цільових платформ наведено в посібнику з Bob.
Для рушія з підтримкою потоків потрібен SharedArrayBuffer на захищеній сторінці, ізольованій від інших джерел. Надавайте пакет через HTTPS (або localhost) і налаштуйте на сервері сумісні заголовки ізоляції між джерелами, зазвичай такі:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Ресурси з інших джерел, які завантажує сторінка, також мають використовувати сумісні заголовки CORS або Cross-Origin-Resource-Policy. Пакет, що містить лише wasm_pthread-web, не може працювати, якщо ці вимоги не виконано; включіть wasm-web як запасний варіант, якщо гру можуть розмістити на сайті, який не підтримує ізоляцію між джерелами.
Пакети Defold HTML5 потребують сучасного браузера з підтримкою WebAssembly. Internet Explorer 11 не підтримується.
Після натискання кнопки Create bundle вам буде запропоновано вибрати папку, у якій потрібно створити застосунок. Після завершення експорту ви знайдете в ній усі файли, необхідні для запуску застосунку.
--verify-graphics-calls=false.Під час створення HTML5-версії гри Defold надає стандартну вебсторінку. Вона посилається на ресурси стилів і скриптів, які визначають вигляд вашої гри.
Щоразу під час експорту застосунку цей вміст створюється заново. Щоб налаштувати будь-який із цих елементів, потрібно змінити налаштування проєкту. Для цього відкрийте game.project у редакторі Defold і прокрутіть до розділу html5:

Докладнішу інформацію про кожен параметр наведено в посібнику з налаштувань проєкту.
Не можна змінювати файли стандартного шаблону html/css у папці builtins. Щоб застосувати власні зміни, скопіюйте потрібний файл із builtins і вкажіть його в game.project.
Не задавайте полотну рамок або внутрішніх відступів у стилях. Інакше координати введення мишею будуть неправильними.
У game.project можна вимкнути кнопку Fullscreen і посилання Made with Defold.
Defold надає темну й світлу теми для index.html. За замовчуванням установлено світлу тему, але її можна змінити, змінивши файл Custom CSS. Також у полі Scale Mode можна вибрати один із чотирьох попередньо визначених режимів масштабування.
Обчислення для всіх режимів масштабування враховують поточний DPI екрана, якщо ввімкнено параметр High Dpi у game.project (розділ Display)
У режимі Fit розмір полотна змінюється так, щоб усе ігрове полотно вміщувалося на екрані зі збереженням початкових пропорцій. Єдина відмінність режиму Downscale Fit полягає в тому, що розмір змінюється лише тоді, коли внутрішній розмір вебсторінки менший за початкове полотно гри, але не збільшується, коли вебсторінка більша за нього.

У режимі Stretch розмір полотна змінюється так, щоб воно повністю заповнювало внутрішній простір вебсторінки.

У режимі No Scale розмір полотна точно відповідає значенню, заданому у файлі game.project, у розділі [display].

Для створення файлу index.html ми використовуємо мову шаблонів Mustache. Під час збирання або пакування файли HTML і CSS проходять через компілятор, який може замінювати певні токени значеннями, що залежать від налаштувань проєкту. Ці токени завжди взято у подвійні або потрійні фігурні дужки ({{TOKEN}} або {{{TOKEN}}}), залежно від того, чи потрібно екранувати послідовності символів. Ця можливість корисна, якщо ви часто змінюєте налаштування проєкту або плануєте повторно використовувати матеріал в інших проєктах.
Докладнішу інформацію про мову шаблонів Mustache наведено в посібнику.
Будь-який параметр game.project може бути токеном. Наприклад, якщо ви хочете використати значення Width із розділу Display:

Відкрийте game.project як текст і перевірте [section_name] та назву поля, яке хочете використати. Потім його можна використати як токен: {{section_name.field}} або {{{section_name.field}}}.

Наприклад, у JavaScript в HTML-шаблоні:
function doSomething() {
var x = {{display.width}};
// ...
}
Також доступні такі спеціальні токени:
false, якщо html5.splash_image у game.project порожнє{{#DEFOLD_SPLASH_IMAGE}}
background-image: url("{{DEFOLD_SPLASH_IMAGE}}");
{{/DEFOLD_SPLASH_IMAGE}}
<style>
{{{DEFOLD_CUSTOM_CSS_INLINE}}}
</style>
Цей вбудований блок має з’являтися до завантаження основного скрипту застосунку. Оскільки він містить теги HTML, цей макрос слід брати в потрійні дужки {{{TOKEN}}}, щоб запобігти екрануванню послідовностей символів.
true, якщо html5.scale_mode дорівнює Downscale Fit.true, якщо html5.scale_mode дорівнює Fit.true, якщо html5.scale_mode дорівнює No Scale.true, якщо html5.scale_mode дорівнює Stretch.html5.heap_size файлу game.project, перетворений у байти.html5.engine_arguments файлу game.project і розділені символом ,.Якщо ви створюєте власний шаблон, можна змінювати параметри завантажувача рушія, призначаючи значення в глобальному об’єкті CUSTOM_PARAMETERS. Вбудований шаблон містить навмисно порожній блок <script id="engine-setup"> для цих налаштувань.
Розміщуйте блок engine-setup після скрипту, який завантажує dmloader.js, і перед блоком engine-start, який викликає EngineLoader.load().
Наприклад:
<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':
Filter function that will run for each archive path.
'unsupported_webgl_callback':
Function that is called if WebGL is not supported.
'engine_arguments':
List of arguments (strings) that will be passed to the engine.
'custom_heap_size':
Number of bytes specifying the memory heap size.
'disable_context_menu':
Disables the right-click context menu on the canvas element if true.
'retry_time':
Pause in seconds before retry file loading after error.
'retry_count':
How many attempts we do when trying to download a file.
'can_not_download_file_callback':
Function that is called if you can't download file after 'retry_count' attempts.
'resize_window_callback':
Function that is called when resize/orientationchanges/focus events happened
'start_success':
Function that is called just before main is called upon successful load.
'update_progress':
Function that is called as progress is updated. Parameter progress is updated 0-100.
Збірки HTML5 підтримують файлові операції, як-от sys.save(), sys.load() та io.open(), але внутрішня обробка цих операцій відрізняється від інших платформ. Під час виконання JavaScript у браузері немає повноцінного поняття файлової системи, а доступ до локальних файлів заблоковано з міркувань безпеки. Натомість Emscripten (а отже, і Defold) використовує IndexedDB, базу даних у браузері для постійного зберігання даних, щоб створити віртуальну файлову систему в браузері. Важлива відмінність від доступу до файлової системи на інших платформах полягає в тому, що між записом у файл і фактичним збереженням зміни в базі даних може бути невелика затримка. Консоль розробника браузера зазвичай дає змогу переглядати вміст IndexedDB.
Іноді потрібно передати грі додаткові аргументи до запуску або під час нього. Це може бути, наприклад, ідентифікатор користувача, токен сеансу або рівень, який потрібно завантажити під час запуску гри. Це можна зробити кількома різними способами, деякі з яких описано тут.
Під час налаштування й завантаження рушія можна вказати додаткові аргументи рушія. Їх можна отримати під час виконання за допомогою sys.get_config_string(). Призначте аргументи безпосередньо в CUSTOM_PARAMETERS.engine_arguments у блоці engine-setup файлу index.html:
<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 у поле Engine Arguments розділу HTML5 у game.project. Значення, розділені комами, додаються до CUSTOM_PARAMETERS.engine_arguments у згенерованому файлі dmloader.js.
Під час виконання значення можна отримати так:
local foo1 = sys.get_config_string("example.foo1")
local foo2 = sys.get_config_string("example.foo2")
print(foo1) -- bar1
print(foo2) -- bar2
Ви можете передавати аргументи як параметри запиту в 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")
-- get the query part of the url (the bit after ?)
local query = url:match(".*?(.*)")
if not query then
return {}
end
local params = {}
-- iterate over all key value pairs
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, рекомендовано зосередитися на таких напрямах:
В: У деяких випадках гру неможливо запустити в браузері безпосередньо з локальної файлової системи. Під час запуску з редактора гра обслуговується локальним вебсервером. Ви можете, наприклад, скористатися SimpleHTTPServer у Python:
$ python -m SimpleHTTPServer [port]
В: Зазвичай це трапляється, коли ви створюєте збірку у Windows і додаєте її до Git. Якщо завершення рядків у Git налаштовано неправильно, Git змінюватиме їх, а отже, і розмір даних. Щоб розв’язати проблему, дотримуйтеся цих інструкцій: https://docs.github.com/en/free-pro-team@latest/github/using-git/configuring-git-to-handle-line-endings