---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.2
alternate:
  - https://yandex.com/dev/games/doc/en/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/hi/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/ko/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/ru/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/tr/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/vi/sdk/sdk-events.md
  - https://yandex.com/dev/games/doc/zh/sdk/sdk-events.md
  - href: zh/sdk/sdk-events.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com/dev/games/doc/zh/llms.txt

# 事件

<!-- source: zh/_includes/script-common.md -->
<!-- source: zh/_includes/script/index-js.md -->

<!-- endsource: zh/_includes/script/index-js.md -->

<!-- source: zh/_includes/script/requirements-js.md -->

<!-- endsource: zh/_includes/script/requirements-js.md -->

<!-- source: zh/_includes/script/image-modal-js.md -->

<!-- endsource: zh/_includes/script/image-modal-js.md -->
<!-- endsource: zh/_includes/script-common.md -->

## 游戏暂停与恢复事件 {#pause-resume}

通过`game_api_pause`和`game_api_resume`事件，平台通知游戏需要暂停或恢复游戏进程。这些事件简化了与我们平台集成的过程，并有助于满足审核要求（参见[条款1.3](https://yandex.com/dev/games/doc/zh/concepts/requirements.md#1-3)和[条款4.7](https://yandex.com/dev/games/doc/zh/concepts/requirements.md#4-7)）。

支持暂停和恢复事件的游戏可以被额外分发至外部平台。


### `game_api_pause` 和 `game_api_resume`事件 {#pause-resume-events}

这些事件帮助您跟踪：

- 全屏或rewarded广告的显示与关闭；
- 购买窗口的打开与关闭；
- 浏览器标签页的切换；
- 浏览器窗口的最小化与最大化。

它们与[游戏玩法标记方法](https://yandex.com/dev/games/doc/zh/sdk/sdk-game-events.md#gameplay)保持一致。触发`game_api_pause`事件时，将调用`GameplayAPI.stop()`方法，而触发`game_api_resume`事件时，则调用`GameplayAPI.start()`。

如果游戏已经通过`GameplayAPI.stop()`方法停止（例如，当玩家打开菜单时），然后触发`game_api_pause`事件，在随后的`game_api_resume`事件中不会调用`GameplayAPI.start()`方法。这样可以在不破坏游戏玩法逻辑的情况下，保留游戏当前状态。

使用Yandex Games SDK中的`on()`和`off()`方法分别订阅事件和取消订阅。

#### 示例 {#pause-resume-example}

{% list tabs %}

- game_api_pause

    ```javascript showLineNumbers
    const pauseCallback = () => {
        pauseGame(); // 您的函数，用于暂停游戏循环和音乐。
        console.log('GAME PAUSED');
    };

    ysdk.on('game_api_pause', pauseCallback); // 订阅 'game_api_pause' 事件。
    ysdk.off('game_api_pause', pauseCallback); // 取消订阅 'game_api_pause' 事件。
    ```

- game_api_resume

    ```javascript showLineNumbers
    const resumeCallback = () => {
        resumeGame(); // 您的函数，用于恢复游戏循环和音乐。
        console.log('GAME RESUMED');
    };

    ysdk.on('game_api_resume', resumeCallback ); // 订阅 'game_api_resume' 事件。
    ysdk.off('game_api_resume', resumeCallback ); // 取消订阅 'game_api_resume' 事件。
    ```

{% endlist %}

&nbsp; {.empty}


### 游戏启动时全屏广告 {#startup-fullscreen-ad}

{% note warning %}

平台会在所有游戏启动时自动显示全屏广告。

{% endnote %}

与通过 [ysdk.adv.showFullscreenAdv()](https://yandex.com/dev/games/doc/zh/sdk/sdk-adv.md#full-screen-block) 调用的广告模块不同，启动广告没有直接的回调函数。要正确处理其展示，请监听 `game_api_pause` 和 `game_api_resume` 事件：

1. 收到 `game_api_pause` 事件时，关闭游戏音效并暂停游戏进程。
2. 等待 `game_api_resume` 事件后恢复游戏。

这对于音效和游戏进程立即启动的游戏尤为重要。

#### 启动广告处理示例 {#startup-ad-example}

```javascript showLineNumbers
let gameStarted = false;
let isPaused = false;

// 游戏初始化函数
function initGame() {
    // 订阅暂停和恢复事件
    ysdk.on('game_api_pause', handlePause);
    ysdk.on('game_api_resume', handleResume);

    // 检查当前是否处于暂停状态
    // 如果否，则直接启动游戏
    if (!isPaused) {
        startGame();
    }
}

function handlePause() {
    isPaused = true;
    // 停止音效和游戏进程
    console.log('GAME PAUSED - waiting for resume');
}

function handleResume() {
    isPaused = false;

    // 如果游戏尚未启动，则启动游戏
    if (!gameStarted) {
        startGame();
    } else {
        // 恢复音效和游戏进程
    }

    console.log('GAME RESUMED');
}

function startGame() {
    gameStarted = true;

    // 初始化音效
    // 启动游戏循环
    console.log('GAME STARTED');
}

// 执行游戏初始化
initGame();
```



## 其他事件 {#other-events}

您还可以监听用户与应用交互时触发的其他事件。

```typescript showLineNumbers
enum ESdkEventName {
    EXIT = 'EXIT',
    HISTORY_BACK = 'HISTORY_BACK',
    ACCOUNT_SELECTION_DIALOG_OPENED = 'ACCOUNT_SELECTION_DIALOG_OPENED',
    ACCOUNT_SELECTION_DIALOG_CLOSED = 'ACCOUNT_SELECTION_DIALOG_CLOSED',
}

ysdk = {
    EVENTS: {
        EXIT: ESdkEventName.EXIT,
        HISTORY_BACK: ESdkEventName.HISTORY_BACK,
        ACCOUNT_SELECTION_DIALOG_OPENED: ESdkEventName.ACCOUNT_SELECTION_DIALOG_OPENED,
        ACCOUNT_SELECTION_DIALOG_CLOSED: ESdkEventName.ACCOUNT_SELECTION_DIALOG_CLOSED,
    },

    dispatchEvent(eventName: ESdkEventName, detail?: object): Promise<unknown> {},

    on(eventName: ESdkEventName, listener: Function): () => void {}
};
```


### HISTORY_BACK 事件 {#history-back}

{% note alert %}

此事件仅在游戏在电视上运行时可用。

{% endnote %}

要跟踪**返回**按钮的点击行为，请使用以下方法：

```javascript showLineNumbers
ysdk.on(ysdk.EVENTS.HISTORY_BACK, () => {
    // 向用户显示自定义游戏对话框，其中提供用于
    // 确认退出游戏、转到内部设置、商店等的选项
});
```

### EXIT 事件 {#exit}

如果用户在点击**返回**之后打开的自定义对话框中确认退出游戏，则游戏应发送退出事件。为此，请使用以下方法：

```javascript
ysdk.dispatchEvent(ysdk.EVENTS.EXIT);
```


### 游戏账号选择对话框 {#account-selection-dialog}

平台会同时保存已授权和未授权玩家的游戏进度。玩家可以先不登录进行游戏，之后再登录账号。此时系统会保存两份不同的进度：一份与账号关联，另一份为匿名游玩数据。平台会显示对话框让玩家根据游戏时长、最后登录日期等参数比较存档，并选择要使用的进度。

如果您需要频繁同步玩家数据或将游戏进度存储在自己的服务器上，请监听账号选择对话框关闭后的进度变更事件。

SDK 为此提供两个事件：

- `ACCOUNT_SELECTION_DIALOG_OPENED` —— 对话框打开时触发
- `ACCOUNT_SELECTION_DIALOG_CLOSED` —— 对话框关闭时触发

对话框打开时可暂停定期同步玩家数据。对话框关闭后可返回主菜单或重启游戏，并重新请求玩家对象。

#### 示例 {#account-selection-dialog-example}

```javascript showLineNumbers
// 订阅账号选择对话框打开事件
ysdk.on(ysdk.EVENTS.ACCOUNT_SELECTION_DIALOG_OPENED, () => {
    // 暂停同步玩家数据
});

// 订阅账号选择对话框关闭事件
ysdk.on(ysdk.EVENTS.ACCOUNT_SELECTION_DIALOG_CLOSED, async () => {
    // 返回游戏主菜单或刷新页面
    // ...

    // 重新获取玩家数据
    const player = await ysdk.getPlayer();
    const data = await player.getData();
});
```



---

<!-- source: zh/_includes/sdk-support.md -->
{% note info %}

技术支持团队将协助您将已完成的游戏发布到 Yandex 游戏平台。关于开发和测试方面的具体问题，其他开发人员将在[Discord 频道](https://discord.com/invite/wU4p3whr4T){.external}中进行回答。

{% endnote %}

如果您遇到 Yandex Games SDK 方面的问题或有其他问题想要咨询，请联系支持部门：

<!-- source: zh/_includes/button-chat.md -->
<a href="https://yandex.com/chat/#/user/a4fa5c06-75db-9b38-6eea-b1673785f7d5">
  <span class="button">写入聊天信息</span>
</a>
<!-- endsource: zh/_includes/button-chat.md -->
<!-- endsource: zh/_includes/sdk-support.md -->
