From e05a6a1f8c8414d022c84f5e14772a8a658db8e0 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Tue, 7 Apr 2026 15:46:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=80=9A=E5=85=B3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/prefabs/PageLevel.ts | 3 +- assets/prefabs/PageWriteLevels.ts | 37 +++++++++++++++++++---- assets/scripts/utils/UserAssetsManager.ts | 5 ++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/assets/prefabs/PageLevel.ts b/assets/prefabs/PageLevel.ts index 9c5f42e..a0d594c 100644 --- a/assets/prefabs/PageLevel.ts +++ b/assets/prefabs/PageLevel.ts @@ -691,7 +691,8 @@ export class PageLevel extends BaseView { // 通关奖励:分享模式下不增加积分 if (!this._isShareMode) { const levelId = this._currentConfig?.id ?? ''; - await UserAssetsManager.instance.earnPoint(levelId); + const timeSpent = 60 - this._countdown; + await UserAssetsManager.instance.earnPoint(levelId, timeSpent); this.updatePointsLabel(); } diff --git a/assets/prefabs/PageWriteLevels.ts b/assets/prefabs/PageWriteLevels.ts index f0d0525..7930032 100644 --- a/assets/prefabs/PageWriteLevels.ts +++ b/assets/prefabs/PageWriteLevels.ts @@ -243,6 +243,13 @@ export class PageWriteLevels extends BaseView { // 设置默认名称和选中状态(封面由 _loadAndRefreshCover 异步填充) this._initItemState(item, index); + + // 禁用 Button 组件,防止它拦截触摸事件导致 ScrollView 无法滑动 + const button = item.getComponent(Button); + if (button) { + button.enabled = false; + } + this._setupItemClick(item, index); return item; @@ -323,14 +330,32 @@ export class PageWriteLevels extends BaseView { } private _setupItemClick(item: Node, index: number): void { - // 只用 Button click 统一处理选中/取消,避免 Toggle 事件与 Button 事件同时触发导致双重调用 - const button = item.getComponent(Button); - if (button) { - button.node.on(Button.EventType.CLICK, () => { + // 用触摸事件代替 Button,区分点击和滑动: + // 短距离松手 = 点击(切换选中),长距离 = 滑动(交给 ScrollView) + let touchStartPos: Vec2 | null = null; + + item.on(Node.EventType.TOUCH_START, (event: EventTouch) => { + touchStartPos = event.getUILocation(); + }, this); + + item.on(Node.EventType.TOUCH_END, (event: EventTouch) => { + if (!touchStartPos) return; + const endPos = event.getUILocation(); + const dx = endPos.x - touchStartPos.x; + const dy = endPos.y - touchStartPos.y; + const distance = Math.sqrt(dx * dx + dy * dy); + touchStartPos = null; + + // 滑动距离小于阈值才算点击 + if (distance < 20) { const isCurrentlySelected = this._selectedIndices.has(index); this._onItemToggle(index, !isCurrentlySelected); - }, this); - } + } + }, this); + + item.on(Node.EventType.TOUCH_CANCEL, () => { + touchStartPos = null; + }, this); } /** diff --git a/assets/scripts/utils/UserAssetsManager.ts b/assets/scripts/utils/UserAssetsManager.ts index 23813b5..3010ac2 100644 --- a/assets/scripts/utils/UserAssetsManager.ts +++ b/assets/scripts/utils/UserAssetsManager.ts @@ -85,9 +85,11 @@ export class UserAssetsManager { /** * 获得积分(通关奖励) + * @param levelId 关卡ID + * @param timeSpent 通关耗时(秒) * @returns 获得后的积分数 */ - async earnPoint(levelId: string): Promise { + async earnPoint(levelId: string, timeSpent: number): Promise { if (!AuthManager.instance.isLoggedIn) { StorageManager.addPoint(); return StorageManager.getPoints(); @@ -99,6 +101,7 @@ export class UserAssetsManager { { reason: POINT_REASONS.LEVEL_COMPLETE, levelId, + timeSpent, }, API_TIMEOUT.SHORT );