diff --git a/assets/prefabs/PageLevel.prefab b/assets/prefabs/PageLevel.prefab index 5f04a91..5e4eff8 100644 --- a/assets/prefabs/PageLevel.prefab +++ b/assets/prefabs/PageLevel.prefab @@ -1612,7 +1612,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -220, + "x": -180, "y": 0, "z": 0 }, @@ -1653,7 +1653,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 160, + "width": 320, "height": 100.8 }, "_anchorPoint": { @@ -1689,7 +1689,7 @@ "b": 0, "a": 255 }, - "_string": "这是", + "_string": "答案是:", "_horizontalAlign": 1, "_verticalAlign": 1, "_actualFontSize": 80, @@ -1771,7 +1771,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -150, + "x": -70, "y": 0, "z": 0 }, @@ -1904,7 +1904,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -110, + "x": -30, "y": 41.081, "z": 0 }, @@ -6023,6 +6023,9 @@ "clockLabel": { "__id__": 48 }, + "liveLabel": { + "__id__": 30 + }, "levelConfigs": [ { "__id__": 250 diff --git a/assets/prefabs/PageLevel.ts b/assets/prefabs/PageLevel.ts index 60aa45c..999c62a 100644 --- a/assets/prefabs/PageLevel.ts +++ b/assets/prefabs/PageLevel.ts @@ -1,6 +1,7 @@ import { _decorator, Node, EditBox, instantiate, Vec3, Button, Label, Sprite, SpriteFrame, AudioClip, AudioSource } from 'cc'; import { BaseView } from 'db://assets/scripts/core/BaseView'; import { ViewManager } from 'db://assets/scripts/core/ViewManager'; +import { StorageManager } from 'db://assets/scripts/utils/StorageManager'; const { ccclass, property } = _decorator; /** @@ -70,6 +71,9 @@ export class PageLevel extends BaseView { @property(Label) clockLabel: Label | null = null; + @property(Label) + liveLabel: Label | null = null; + // ========== 配置属性 ========== @property([LevelConfig]) levelConfigs: LevelConfig[] = []; @@ -104,6 +108,7 @@ export class PageLevel extends BaseView { */ onViewLoad(): void { console.log('[PageLevel] onViewLoad'); + this.updateLiveLabel(); this.initLevel(); this.initIconSetting(); this.initUnlockButtons(); @@ -116,6 +121,7 @@ export class PageLevel extends BaseView { */ onViewShow(): void { console.log('[PageLevel] onViewShow'); + this.updateLiveLabel(); } /** @@ -480,6 +486,17 @@ export class PageLevel extends BaseView { * 点击解锁线索 */ private onUnlockClue(index: number): void { + // 检查生命值是否足够 + if (!this.hasLives()) { + console.warn('[PageLevel] 生命值不足,无法解锁线索'); + return; + } + + // 消耗一颗生命值 + if (!this.consumeLife()) { + return; + } + // 播放点击音效 this.playClickSound(); @@ -607,6 +624,50 @@ export class PageLevel extends BaseView { // 可以在这里添加游戏结束逻辑 } + // ========== 生命值相关方法 ========== + + /** + * 更新生命值显示 + */ + private updateLiveLabel(): void { + if (this.liveLabel) { + const lives = StorageManager.getLives(); + this.liveLabel.string = `x ${lives}`; + console.log(`[PageLevel] 更新生命值显示: ${lives}`); + } + } + + /** + * 消耗一颗生命值(用于查看提示) + * @returns 是否消耗成功 + */ + private consumeLife(): boolean { + const success = StorageManager.consumeLife(); + if (success) { + this.updateLiveLabel(); + console.log('[PageLevel] 消耗一颗生命'); + } else { + console.warn('[PageLevel] 生命值不足,无法消耗'); + } + return success; + } + + /** + * 增加一颗生命值(用于通关奖励) + */ + private addLife(): void { + StorageManager.addLife(); + this.updateLiveLabel(); + console.log('[PageLevel] 获得一颗生命'); + } + + /** + * 检查是否有足够的生命值 + */ + private hasLives(): boolean { + return StorageManager.hasLives(); + } + // ========== 答案提交与关卡切换 ========== /** @@ -641,6 +702,9 @@ export class PageLevel extends BaseView { // 播放成功音效 this.playSuccessSound(); + // 通关奖励:增加一颗生命值 + this.addLife(); + // 延迟后进入下一关 this.scheduleOnce(() => { this.nextLevel(); diff --git a/assets/scripts/utils/StorageManager.ts b/assets/scripts/utils/StorageManager.ts new file mode 100644 index 0000000..3232f79 --- /dev/null +++ b/assets/scripts/utils/StorageManager.ts @@ -0,0 +1,87 @@ +import { sys } from 'cc'; + +/** + * 本地存储管理器 + * 统一管理用户数据的本地持久化存储 + */ +export class StorageManager { + /** 生命值存储键 */ + private static readonly KEY_LIVES = 'game_lives'; + + /** 默认生命值 */ + private static readonly DEFAULT_LIVES = 10; + + /** 最小生命值 */ + private static readonly MIN_LIVES = 0; + + // ==================== 生命值管理 ==================== + + /** + * 获取当前生命值 + * @returns 当前生命值,新用户返回默认值 10 + */ + static getLives(): number { + const stored = sys.localStorage.getItem(StorageManager.KEY_LIVES); + if (stored === null || stored === '') { + // 新用户,设置默认值 + StorageManager.setLives(StorageManager.DEFAULT_LIVES); + return StorageManager.DEFAULT_LIVES; + } + const lives = parseInt(stored, 10); + // 防止异常数据 + if (isNaN(lives) || lives < 0) { + StorageManager.setLives(StorageManager.DEFAULT_LIVES); + return StorageManager.DEFAULT_LIVES; + } + return lives; + } + + /** + * 设置生命值 + * @param lives 生命值 + */ + static setLives(lives: number): void { + const validLives = Math.max(StorageManager.MIN_LIVES, lives); + sys.localStorage.setItem(StorageManager.KEY_LIVES, validLives.toString()); + console.log(`[StorageManager] 生命值已更新: ${validLives}`); + } + + /** + * 消耗一颗生命 + * @returns 是否消耗成功(生命值不足时返回 false) + */ + static consumeLife(): boolean { + const currentLives = StorageManager.getLives(); + if (currentLives <= 0) { + console.warn('[StorageManager] 生命值不足,无法消耗'); + return false; + } + StorageManager.setLives(currentLives - 1); + return true; + } + + /** + * 增加一颗生命 + */ + static addLife(): void { + const currentLives = StorageManager.getLives(); + StorageManager.setLives(currentLives + 1); + console.log(`[StorageManager] 获得一颗生命,当前生命值: ${currentLives + 1}`); + } + + /** + * 检查是否有足够的生命值 + * @returns 是否有生命值 + */ + static hasLives(): boolean { + return StorageManager.getLives() > 0; + } + + /** + * 重置生命值为默认值 + */ + static resetLives(): void { + StorageManager.setLives(StorageManager.DEFAULT_LIVES); + console.log('[StorageManager] 生命值已重置为默认值'); + } +} diff --git a/assets/scripts/utils/StorageManager.ts.meta b/assets/scripts/utils/StorageManager.ts.meta new file mode 100644 index 0000000..ff5e7c3 --- /dev/null +++ b/assets/scripts/utils/StorageManager.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "3a09bd59-6481-4e26-8b61-c6e4b0003e59", + "files": [], + "subMetas": {}, + "userData": {} +}