跳转到内容

生命周期与启动(Web)

SDK 需要在你游戏里完成三件事:

  1. 暂停和恢复主循环 —— 广告播放、标签页进后台、或渠道主动要求时。
  2. 静音和恢复音频 —— 触发条件相同,但分开一个回调,方便你做交叉淡入淡出。
  3. 加载期间显示一张启动画面,按渠道风格定制。

生命周期回调负责 (1) 和 (2);引导器负责 (3)。

FRVR.lifecycle.onSuspend      = () => game.pause();     // 必填 —— 冻结主循环
FRVR.lifecycle.onResume       = () => game.resume();    // 必填 —— 解冻
FRVR.lifecycle.onAudioSuspend = () => mixer.mute();     // 必填 —— 静音
FRVR.lifecycle.onAudioResume  = () => mixer.unmute();   // 必填 —— 取消静音
FRVR.lifecycle.onGamePause    = () => game.showPauseMenu();  // 必填 —— 渠道级暂停

每一个回调都要实现 —— 即便某个对你游戏来说是 no-op,也显式写出来,表明你考虑过了。空函数 () => {} 是允许的;漏掉一个就不允许。

它们什么时候会触发

回调触发场景
onSuspend / onResume插屏、激励广告。标签页/应用进后台。
onAudioSuspend / onAudioResume同上,但单独一份,方便你独立处理音频(比如交叉淡入淡出)。
onGamePause渠道级暂停事件(比如用户切走)。

不是每个渠道都会触发每个回调 —— 它们都是尽力而为。五个全实现,才能获得最大可移植性。

FRVR.bootstrapper.init()           // 显示渠道启动画面
  .then(() => loadGame(p => FRVR.bootstrapper.setProgress(p)))  // 0..1
  .then(() => FRVR.bootstrapper.complete());  // 隐藏启动画面
  • init() —— 渲染当前渠道的启动画面。立即 resolve,你就可以开始加载了。
  • setProgress(0..1) —— 想调多少次都行;支持的渠道会显示进度条。
  • complete() —— 隐藏启动画面,把舞台交还给你的游戏。

如果你没先调 setProgress(1) 就把启动画面藏掉,引导器一样能正常完成 —— 进度只是建议性的。

完整启动流程长这样:

// 1. 在 <head> 里同步加载脚本(不要 async/defer)。
//    本地开发:frvr-sdk.min.js + frvr-channel-dev.min.js。
//    生产环境:FRVR 会替你注入正确的渠道包。

// 2. 配置(通常由 FRVR 生成器提供)
FRVR.config = { gameId: 'my-game' };

// 3. 【必填】生命周期回调
FRVR.lifecycle.onSuspend      = () => game.pause();
FRVR.lifecycle.onResume       = () => game.resume();
FRVR.lifecycle.onAudioSuspend = () => mixer.mute();
FRVR.lifecycle.onAudioResume  = () => mixer.unmute();
FRVR.lifecycle.onGamePause    = () => game.showPauseMenu();

// 4. 初始化 SDK(同步;返回的 promise 可以无视)
FRVR.init();

// 5. 启动并运行
FRVR.bootstrapper.init()
  .then(loadGame)
  .then(() => FRVR.bootstrapper.complete());

开发期间给 init()'dev',会有更详细的日志和更宽松的默认值;生产环境省略或传 'prod'。详见 环境

FRVR.init('dev');

经验法则:FRVR.init() 之后,你想调哪个模块都行。任何需要网络的(内购目录、云端存储)在 complete() 触发之后才稳定可用。

如果有些代码必须等 FRVR 完整启动完才能跑 —— 即便不是你自己在调 complete() —— 注册一个钩子:

FRVR.setPostCompleteHook(() => {
  console.log('FRVR is fully ready');
});

如果在启动已经完成之后再注册,回调会立即执行。