增加webassembly网页发布功能

This commit is contained in:
Ziyu
2026-01-28 10:41:26 +08:00
parent 21f9436c41
commit 018917a9b4
7 changed files with 405 additions and 10 deletions
+35 -10
View File
@@ -25,25 +25,50 @@ GameApp::~GameApp() {
}
}
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
void GameApp::run() {
if (!init()) {
spdlog::error("GameApp 初始化失败,无法运行游戏。");
return;
}
#ifdef __EMSCRIPTEN__
// WebAssembly 环境下使用回调函数
// 0 表示无限帧率(由浏览器 requestAnimationFrame 控制),1 表示模拟无限循环
emscripten_set_main_loop_arg([](void* arg) {
static_cast<GameApp*>(arg)->oneIter();
}, this, 0, 1);
#else
// 桌面环境下使用标准的 while 循环
while (is_running_) {
time_->update();
float delta_time = time_->getDeltaTime();
input_manager_->update(); // 每帧首先更新输入管理器
handleEvents();
update(delta_time);
render();
// spdlog::info("delta_time: {}", delta_time);
oneIter();
}
close();
#endif
}
void GameApp::oneIter() {
if (!is_running_) return; // 防止在退出标志设置后的额外调用
time_->update();
float delta_time = time_->getDeltaTime();
input_manager_->update(); // 每帧首先更新输入管理器
handleEvents();
update(delta_time);
render();
// spdlog::info("delta_time: {}", delta_time);
#ifdef __EMSCRIPTEN__
if (!is_running_) {
emscripten_cancel_main_loop();
close();
}
#endif
}
void GameApp::registerSceneSetup(std::function<void(engine::scene::SceneManager &)> func)
+6
View File
@@ -73,6 +73,12 @@ public:
*/
void run();
/**
* @brief 执行一次游戏循环迭代。
* 为了支持 Emscripten (WebAssembly),主循环体必须提取到单独的函数中。
*/
void oneIter();
/**
* @brief 注册用于设置初始游戏场景的函数。
* 这个函数将在 SceneManager 初始化后被调用。