应用定位 :宠物养成模拟类小应用
技术栈 :HarmonyOS NEXT + ArkTS + Stage模型
源码行数 :145行
核心亮点:多维属性管理、后台自动衰减、onPageShow生命周期、定时器跨页面保持
一、引言
养猫模拟器是系列中第一个引入多维属性系统 和后台自动衰减的应用。它模拟了养护一只真实宠物所需的多个维度关注:
饥饿 → 需要喂食
快乐 → 需要玩耍
精力 → 需要睡觉
干净 → 需要洗澡
这四个属性构成了一个互相影响的系统------例如,玩耍会增加快乐但消耗精力和降低干净度。这种多维交叉影响使养猫模拟器成为系列中状态交互最复杂的应用之一。
二、需求分析
2.1 功能需求
| 需求ID | 功能 | 描述 |
|---|---|---|
| F1 | 多维属性 | 饥饿/快乐/精力/干净 四个维度 |
| F2 | 定时衰减 | 属性值随时间自动下降 |
| F3 | 喂食 | 增加饥饿+快乐 |
| F4 | 玩耍 | 增加快乐,消耗精力和干净 |
| F5 | 洗澡 | 增加干净,降低快乐 |
| F6 | 睡觉 | 增加精力,降低饥饿 |
| F7 | 属性警报 | 饥饿过低时自动提示 |
| F8 | 年龄增长 | 随时间增长月龄 |
| F9 | 重置 | 重新领养小猫 |
2.2 四维属性模型
arkts
@State hunger: number = 50; // 饥饿度 0-100
@State happiness: number = 50; // 快乐度 0-100
@State energy: number = 80; // 精力 0-100
@State cleanliness: number = 70; // 干净度 0-100
@State age: number = 0; // 年龄(月)
初始值设计:新领养的小猫各项属性处于中等偏上水平,让用户有调整空间。
三、多维属性管理
3.1 属性关联
每个交互操作会影响多个属性:
| 操作 | hunger | happiness | energy | cleanliness |
|---|---|---|---|---|
| 喂食 | +20 | +5 | - | - |
| 玩耍 | - | +15 | -15 | -5 |
| 洗澡 | - | -5 | - | +30 |
| 睡觉 | -5 | - | +30 | - |
设计理念:
- 喂食:主要解决饥饿,次要增加快乐
- 玩耍:最大快乐收益,但有双重消耗
- 洗澡:最高干净收益,但轻微降低快乐(猫讨厌洗澡)
- 睡觉:恢复精力,但轻微降低饥饿(猫睡觉消耗能量)
这些关联关系使游戏有了策略深度------玩家不能只关注某一属性,需要平衡照顾。
3.2 属性变化的守卫
arkts
// 玩耍时的守卫
if (this.energy < 10) {
this.message = '猫咪太累了,让它休息吧😴';
return;
}
这是前置条件守卫------在消耗精力类操作前检查精力是否足够。
3.3 属性上限/下限保护
所有属性更新都使用 Math.min() 和 Math.max() 保护:
arkts
// 上限保护
this.hunger = Math.min(100, this.hunger + 20);
// 下限保护
this.cleanliness = Math.max(0, this.cleanliness - 5);
四、后台自动衰减系统
4.1 onPageShow生命周期
arkts
.onPageShow(() => {
if (this.intervalId === -1) {
this.intervalId = setInterval(() => {
this.hunger = Math.max(0, this.hunger - 3);
this.happiness = Math.max(0, this.happiness - 2);
this.energy = Math.min(100, this.energy + 1);
this.age++;
if (this.hunger < 10) {
this.message = '⚠️ 猫咪饿了,快喂食吧!';
}
}, 3000);
}
})
onPageShow 是ArkTS中页面生命周期钩子,与 onPageHide 对应。它在页面每次显示时触发------不仅仅是首次加载,还包括从其他页面返回时。
4.2 定时衰减策略
| 属性 | 变化 | 每3秒 | 每分钟变化 |
|---|---|---|---|
| 饥饿 | -3 | 下降 | -60 |
| 快乐 | -2 | 下降 | -40 |
| 精力 | +1 | 上升 | +20 |
| 年龄 | +1 | 增长 | +20月 |
设计意图:
- 饥饿和快乐持续下降 → 需要玩家定期关注
- 精力自动缓慢恢复 → 鼓励合理分配活动时间
- 年龄增长 → 提供长期养成的成就感
4.3 自动警报
arkts
if (this.hunger < 10) {
this.message = '⚠️ 猫咪饿了,快喂食吧!';
}
当饥饿低于10%时触发警报,提醒玩家喂食。这是阈值触发模式------实时监控状态,在危险边界主动通知用户。
五、UI布局设计
5.1 四维进度条
arkts
Column() {
Row() {
Text('🍖 饥饿: ')
Progress({ value: this.hunger, total: 100, type: ProgressType.Linear })
.color('#FF5722')
.width('60%')
}
Row() {
Text('😊 快乐: ')
Progress({ value: this.happiness, total: 100, type: ProgressType.Linear })
.color('#FF9800')
.width('60%')
}
Row() {
Text('⚡ 精力: ')
Progress({ value: this.energy, total: 100, type: ProgressType.Linear })
.color('#4CAF50')
.width('60%')
}
Row() {
Text('🧹 干净: ')
Progress({ value: this.cleanliness, total: 100, type: ProgressType.Linear })
.color('#2196F3')
.width('60%')
}
}
四种颜色对应四种属性,视觉上易于区分:
- 饥饿:红色
#FF5722 - 快乐:橙色
#FF9800 - 精力:绿色
#4CAF50 - 干净:蓝色
#2196F3
5.2 猫咪展示
arkts
Text('🐱')
.fontSize(72)
使用固定的大号emoji作为猫咪形象。可扩展的方案是:
- 根据属性值显示不同表情(开心/难过/饥饿)
- 根据年龄显示不同大小
5.3 猫咪名字
arkts
Text(this.catName)
.fontSize(20)
.fontWeight(FontWeight.Bold)
.fontColor('#FF9800')
支持自定义猫咪名字,让玩家产生情感连接。
六、交互按钮设计
6.1 四按钮系统
arkts
Row() {
Button('🍖 喂食')
Button('🎾 玩耍')
}
Row() {
Button('🛁 洗澡')
Button('😴 睡觉')
}
四个主要操作按钮分两行排列,视觉规整。每个按钮都有独立的颜色和图标。
6.2 按钮效果
arkts
Button('🎾 玩耍')
.onClick(() => {
if (this.energy < 10) {
this.message = '猫咪太累了,让它休息吧😴';
return;
}
this.happiness = Math.min(100, this.happiness + 15);
this.energy = Math.max(0, this.energy - 15);
this.cleanliness = Math.max(0, this.cleanliness - 5);
this.message = '🎉 猫咪玩得很开心!';
})
每个操作都包含:先守卫检查→多属性更新→反馈消息。
七、数值平衡
7.1 饥饿衰减与喂食
- 饿死前允许的最长时间:
50 / (3/3秒) × 3 = 150秒 ≈ 2.5分钟 - 喂食恢复 20,需 20/3 ≈ 6.7秒 衰减完
- 建议玩家至少每2分钟喂食一次
7.2 快乐衰减与玩耍
- 快乐从50降到0需要:
50 / (2/3秒) × 3 = 75秒 ≈ 1.25分钟 - 玩耍一次恢复 15
- 建议频繁互动以保持快乐
7.3 精力与玩耍的平衡
- 精力从80降到10可玩耍的次数:
(80-10) / 15 = 4.67次 - 精力恢复:入睡一次 +30
- 每次玩耍消耗15精力 → 每玩3次需要睡1次
八、与其他模拟器的对比
| 维度 | 养猫模拟器 | 吃饭/喝水模拟器 | 跑步/睡觉模拟器 |
|---|---|---|---|
| 属性维度 | 4维 | 1维 | 1-2维 |
| 自动衰减 | ✅ 是 | ❌ 否 | ❌ 否 |
| 多维关联 | ✅ 是 | ❌ 否 | ❌ 否 |
| 生命周期 | onPageShow | 无 | onPageShow |
| 策略深度 | 高 | 低 | 中 |
养猫模拟器在复杂度上显著高于前面的模拟器,是系列中的一个重要里程碑。
九、扩展思路
9.1 条件解锁的操作
arkts
// 只有干净度>50时才能上床睡觉
if (this.cleanliness < 50) {
this.message = '猫咪太脏了,先洗澡再睡觉吧!🛁';
return;
}
9.2 特殊状态
arkts
if (this.happiness >= 100 && this.hunger >= 80) {
this.message = '😊 猫咪打起了呼噜,很满足!';
// 解锁特殊动作
}
9.3 不同品种
arkts
private catTypes: CatType[] = [
{ name: '🐱 橘猫', hungerRate: 4, happinessRate: 1.5 },
{ name: '😺 黑猫', hungerRate: 2, happinessRate: 2 },
{ name: '😸 布偶', hungerRate: 3, happinessRate: 3 },
];
9.4 死亡线保护
防止属性归零导致"猫咪消失"的极端情况:
arkts
if (this.hunger <= 0) {
this.hunger = 5;
this.message = '⚠️ 猫咪快饿坏了!';
}
十、总结
养猫模拟器是系列中第一个真正的多维养成系统。它展示了:
- 四维属性管理:饥饿、快乐、精力、干净的并行管理
- 操作的多维影响:每个操作同时影响多个属性
- 后台自动衰减:使用 onPageShow + setInterval 实现属性随时间下降
- 阈值警报:饥饿低于10%时自动提醒
- 生命周期集成:定时器与页面生命周期的关联
养猫模拟器为后面的宠物模拟器(Index20)提供了直接的技术基础,两者共享了绝大部分设计模式。