## Понимание и использование объекта window.external для взаимодействия с нативными функциями в JavaScript-играх
Инструкция:
Описание статьи:
Проблемы и решения при работе с `window.external` в JavaScript-играх: доступность функций и их проверк
Понимание и использование объекта window.external для взаимодействия с нативными функциями в JavaScript-играх
Введение
Объект window.external позволяет JavaScript-сценариям взаимодействовать с нативными функциями, написанными на Delphi. Это особенно полезно для разработки игр, где необходимо обеспечить высокую производительность и низкую задержку, что характерно для веб-игр, выполняемых в веб-вью или встроенном браузере.
Описание проблемы
Разработчик столкнулся с проблемой, когда объект window.external в веб-виве/встроенном браузере на Windows отображается как пустой объект, но при этом все же возможно вызвать методы, такие как window.external.vibrate(500). При попытке проверить наличие свойств или методов, например, typeof window.external.vibrate, результатом является undefined. Это затрудняет тестирование и использование объекта window.external как "настоящего" внешнего объекта и не позволяет увидеть, какие функции поддерживаются.
Решение проблемы
Подход с использованием IDispatchEx
Для того чтобы итерировать по свойствам и методам объекта window.external, необходимо реализовать интерфейс IDispatchEx. Это включает в себя методы GetNextDispID и GetMemberName, которые позволяют JavaScript обращаться к свойствам и методам нативного кода.
Альтернативный подход
Можно использовать простой подход с TObjectDispatch, который позволяет создавать методы, вызываемые из JavaScript, без необходимости в реализации тиблицы типов или интерфейса IDispatchEx.
Пример использования TObjectDispatch:
uses MSHTML_EWB, ObjComAuto;
type
{$METHODINFO ON}
TJavascriptReceiver = class
procedure MyMouseMove(event: variant);
procedure MyClick(event: variant);
function MyGet(msg: string): string;
end;
{$METHODINFO OFF}
// реализация методов и т.д.
Подтвержденное решение
Создание функций в тиблице типов в Delphi происходит путем объявления параметров с указанием указателя типа и атрибута retval, что позволяет преобразовать методы с возвратом HRESULT в функции с возвратом типа указанного параметра retval.
Альтернативное решение
Если типовая библиотека не поддерживает создание функций, можно использовать TObjectDispatch для реализации как процедур, так и функций, доступных для вызова из JavaScript.
Заключение
Проверка наличия функций в JavaScript можно осуществить, используя оператор in:
Для более сложных задач, когда требуется итерация по всем методам, необходимо реализовать IDispatchEx или использовать TObjectDispatch.
Подсказка для разработчиков
Если вы используете старую версию Delphi, например Delphi 5, и не можете обновить, можно воспользоваться альтернативным ответом, который представляет функцию TJavascriptReceiver для создания функций на стороне Delphi, совместимых с JavaScript, без необходимости в реализации тиблицы типов или полной поддержке интерфейса IDispatchEx.
Объект `window.external` используется в JavaScript-играх для взаимодействия с нативными функциями, написанными на Delphi, и важно понимать, как работать с этим объектом для корректного взаимодействия между JavaScript и нативным кодом, особенно
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.