# PlatformAdapter & KeyAdapter 使用说明
## 一、PlatformAdapter API
### 1.1 初始化
```typescript
// 在游戏入口处调用一次
await PlatformAdapter.init(
    "游戏中文名",      // cnName: string
    123456,            // minigameID: number
    FingerStyle.Normal // focusIcon: 焦点图标样式
);
```
// 关闭加载界面
```typescript
PlatformAdapter.closeLoading();
```
### 1.2 场景 / 窗口栈
```typescript
PlatformAdapter.showScene(mainMenuNode);
```
// 关闭一个预制体场景（从栈中移除，不销毁节点）
PlatformAdapter.hideScene(sceneNode);
### 4.2 弹窗页面
```typescript
PlatformAdapter.showWindow(popupNode, () => {
    popupNode.destroy();
    return true;
});
// 刷新导航
PlatformAdapter.refreshFocus(popupNode);
// 关闭界面窗口
PlatformAdapter.hideWindow(popupNode);
```
**场景 vs 窗口：**
| 特性 | showScene | showWindow |
|------|-----------|------------|
| 返回键处理 | 回溯到上一个场景，或退出确认 | 直接 `destroy()` 关闭 |
| 场景切换 | 自动隐藏上一个场景 | 不涉及场景切换 |
### 1.4 Toast
```typescript
PlatformAdapter.showTip("提示文本"); // 第二个参数：显示时长(ms),默认1500
```
### 1.5 广告
```typescript
const success = await PlatformAdapter.showRewardVideo(
    EVideoScene.GameOver,  // 场景枚举
    "coin_double",         // 奖励类型
    () => {
        console.log("广告看完给奖励，未看完或者报错会自动提示，不需要自己处理");
    }
);
```
### 1.6 帮助窗口（首次引导）
```typescript
// 首次启动时显示帮助窗口，按确认键或返回键关闭，触发回调
PlatformAdapter.showHelperWin('skeleton', () => {
    this.startGamePrepare();
});
```
### 1.7 数据上报
```typescript
// 单次上报
PlatformAdapter.report(AnalyticsEvent.StartGame, AnalyticsAction.Click);
// 批量上报
PlatformAdapter.reportBatch([AnalyticsEvent.StartGame, AnalyticsEvent.LevelComplete]);

```
## 二、KeyAdapter 按键适配
### 2.1 外部回调
```typescript
// 监听所有按键按下（在默认处理前执行）
KeyAdapter.onKeyDown = (key: KeyCode) => {
    if (key === KeyCode.Enter) {
        // 自定义处理
    }
};
// 监听所有按键抬起
KeyAdapter.onKeyUp = (key: KeyCode) => {
    if (key === KeyCode.Up) {
        // 自定义处理
    }
};
```
## 三、KeyCode / KeyAction 枚举
```typescript
enum KeyCode {
    Up    = 'up',
    Down  = 'down',
    Left  = 'left',
    Right = 'right',
    Enter = 'enter',
    Back  = 'back',
    Menu  = 'menu',
}
```
> 注意：`KeyCode` 枚举值是字符串（`'up'`、`'down'` 等），比较时用 `KeyCode.Up` 形式，不要直接写字符串字面量。
---
## 四、注意事项
1. **防重复机制**：`KeyAdapter` 内部有 150ms 防重复窗口，避免 AdSdk 和 `cc.systemEvent` 双路输入导致重复响应