基于 Cocos Creator 3.8.6 的麻将消除游戏首页,核心演示了从零手写的虚拟列表排行榜功能。
| 项目 | 版本 |
|---|---|
| 引擎 | Cocos Creator 3.8.6 |
| 语言 | TypeScript (strict: false) |
| 平台 | Web / 移动端 |
assets/
├── prefabs/mahjong/
│ ├── RankItem.prefab # 排行榜单项预制体(虚拟列表复用)
│ └── popup/RankPanel.prefab # 排行榜弹窗预制体(包含虚拟列表 ScrollView)
└── scripts/mahjong/
├── MJRankManager.ts # 排行榜虚拟列表管理器(核心)
├── MJRankItem.ts # 排行榜单项组件
├── MJDataManager.ts # 玩家数据管理(提供玩家分数用于排行榜插入)
└── MJHomeManager.ts # 首页控制器(控制排行榜面板的打开/关闭)
排行榜基于 ScrollView + NodePool 手动实现虚拟列表,不依赖 Cocos Creator 内置的 VirtualList 或任何第三方插件。
- 内容伪装高度 — 将 ScrollView content 的 UITransform 高度设为整个列表的理论总高度,使滚动条正确反映数据量
- 可见区域计算 — 根据当前滚动位置和可视区域高度,计算当前可见的数据索引范围,上下各加
bufferCount(默认 2 行)作为缓冲 - 差量更新策略 — 滚动时仅对离开可见范围的节点进行回收,仍在范围内的节点不做任何操作,避免不必要的 CPU 计算和渲染开销
- 对象池复用 — 使用 Cocos Creator 的
NodePool管理节点生命周期,离开视野的节点回收到池中,进入视野时优先从池中获取 - 滚动驱动渲染 — 监听
ScrollView.EventType.SCROLLING事件,每次滚动触发可见项渲染,并使用_isRefreshing标志防止重入
interface RankData {
rank: number; // 排名 (1-based)
name: string; // 昵称
score: number; // 分数
}当前使用 Mock 数据(100 条),代码中已预留 TODO 标记,后续可无缝替换为服务端 API。
首页 → 点击排行榜按钮 → 弹出排行榜面板
├─ 加载数据,更新 content 高度
├─ 渲染可见项
├─ 用户滚动时差量更新可见项
└─ 支持平滑滚动到自己的排名
