2026-10-10-desktop-pet-design.md 15 KB

浠艾福桌面宠物设计文档

日期: 2026-10-10 版本: v1.0 状态: 设计确认


一、项目概述

1.1 目标

构建一款 Windows 桌面宠物应用,通过浠艾福品牌吉祥物(浠宝/福宝)展现用户当前健康状态与任务执行情况,同时支持与用户互动完成打卡任务。

1.2 核心能力

能力 说明
状态展示 实时反映五维能量值、任务完成进度、健康打卡状态
互动提醒 支持喝水、吃药等定时提醒,用户可通过点击宠物确认完成
形象自定义 支持上传 PNG 形象 + JSON 配置,用户可完全自定义
小游戏 内置舒尔特方格等小游戏,宠物陪伴用户完成
顽皮行为 支持"偷图标"、"吃文档"等随机互动,增强陪伴感

二、系统架构

┌─────────────────────────────────────────────────────────────┐
│                     WPF 主进程 (C#)                         │
│                                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │
│  │  API Client  │  │  状态管理器  │  │  托盘 / 快捷手势  │  │
│  │  (HttpClient)│  │  (StateMgr)  │  │  (NotifyIcon)    │  │
│  └──────┬───────┘  └──────┬───────┘  └────────┬─────────┘  │
│         │                 │                    │            │
│  ┌──────▼─────────────────▼────────────────────▼─────────┐  │
│  │                  WebView2 渲染层                       │  │
│  │  ┌──────────────────────────────────────────────────┐  │  │
│  │  │  HTML/JS 宠物引擎                                 │  │  │
│  │  │  - 精灵渲染 / CSS 动画 / 状态机                   │  │  │
│  │  │  - 拖拽 / 点击 / 悬停交互                         │  │  │
│  │  │  - 对话框气泡                                     │  │  │
│  │  └──────────────────────────────────────────────────┘  │  │
│  └────────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌───────────────────────────────────────────────────────┐  │
│  │            JS ↔ C# Bridge (CoreWebView2)              │  │
│  │  C# → JS: window.cfcPetAPI.notifyState(data)         │  │
│  │  JS → C#: await chrome.webview.hostObjects.sync...    │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
                            │
                            ▼
                  ┌──────────────────┐
                  │  CFC Backend     │
                  │  localhost:9082  │
                  │  JWT Bearer Token│
                  └──────────────────┘

模块职责

模块 职责
API Client 定时轮询 / 事件触发时拉取任务、能量、打卡数据;JWT 缓存与刷新
State Manager 将 API 数据转换为宠物状态(idle/happy/sad/busy/sleeping 等)
Bridge C# 调用 JS 函数推送状态,JS 回调 C# 处理点击/拖拽事件
托盘 / 快捷手势 右键菜单(设置/最小化/退出)、键盘快捷键(显示/隐藏/唤醒)
WebView2 渲染层 接收状态数据,驱动精灵动画,处理用户交互

三、数据流(API → 宠物状态映射)

数据来源

CFC API 轮询频率 用途
POST /api/tasks/today 30s 当前用户今日任务列表
POST /api/tasks/my-pending 30s 待审核任务数
POST /api/energy/overview 60s 五维能量当前值
POST /api/daily/checkin 60s 今日打卡状态(身/智/心)
POST /api/user/mascot/get 首次 / 手动刷新 获取用户已选形象

状态映射表

数据字段 映射宠物状态 触发动作
今日任务全完成 happy 翅膀展开/甩尾巴 + 说话气泡"完成了!"
今日任务进行中(有1+未开始) busy 低头看时间 / 来回踱步
今日任务超过2个未完成(截止后) worried 皱眉 / 叹气
健康打卡完成 excited 转圈 / 蹦跳
健康打卡未做(下午未打卡) remind 用爪子戳屏幕提示
身维度能量高 energetic 活跃动作,跳跃
身维度能量低 tired 趴下 / 打哈欠
智维度能量高 curious 歪头思考
所有维度都低(< 30%) sad 垂头丧气 / 沉默
用户长时间无操作(>15min) sleeping 闭眼蜷缩,呼吸起伏
用户正在操作键盘/鼠标 watching 抬头注视光标
等待用户互动(如喝水提醒) waiting_for_interaction 戳屏幕 + 气泡提示
小游戏激活(如舒尔特) mini-game 进入专注状态 + 数字/方块出现

状态流转时序

C# 侧 Timer (30s) ──► POST /api/tasks/today
          │
          ▼
StateMgr.Update(tasks, energy, checkin)
          │
          ▼
  计算宠物状态
          │
          ▼
window.cfcPetAPI.notifyState(state)
          │
          ▼
WebView2 JS 接收 → 触发对应动画帧 → 播放音效(可选)

四、形象配置格式(JSON Schema)

配置文件结构

{
  "version": "1.0",
  "type": "animal|human|custom",
  "species": "cockatiel|british_shorthair|human|other",
  "gender": "male|female|neutral",

  "image_base_url": "./assets/pets/xibao/",
  "default_image": "standing.png",

  "actions": {
    "idle": "wings_idle",
    "happy": "wings_spread",
    "busy": "head_tilt",
    "waiting_for_interaction": "hand_gesture",
    "success_animation": "celebrate",
    "sleeping": "breath_loop",
    "mini_game": "puzzle_active",

    // 【新增】用户自定义状态映射
    // 键为用户自定义状态名,值为对应的 CSS 动画类名或帧序列
    "custom_state_1": "user_animation_1",
    "custom_state_2": "user_animation_2"
  },

  "sounds": {
    "click": "pip.mp3",
    "complete": "cheer.mp3",
    "remind": "water_please.mp3"
  },

  "parameters": {
    "move_distance": 15,
    "animation_speed": 1.0,
    "interaction_timeout": 300
  }
}

用户自定义流程

  1. 用户放置 PNG 图片到 ~/.xaf-pet/images/<pet-name>/
  2. 同目录放置 pet-config.json(使用上述 Schema,可在 actions 中添加 custom_state_N 键值对)
  3. 应用启动时扫描所有配置文件夹
  4. 用户在"设置 → 自定义状态"界面管理自定义状态映射
  5. C# 侧通过 window.cfcPetAPI.setCustomState("custom_state_1", data) 发送自定义状态

要求:

  • 每只宠物需要一张基准 PNG(透明背景)+ 可选的动作帧图
  • CSS 动画驱动,无需多帧精灵图
  • 支持最多 10 种用户自定义状态(通过配置文件 key 如 custom_state_1~custom_state_10 定义)

C# ↔ JS Bridge 新增接口

// C# → JS:设置自定义状态
public void SetCustomState(string stateName, object stateData);

五、交互规则与动作库

核心交互动作(内置库)

分类 动作名称 触发条件 说明
基础表情 nod 任务完成、确认打卡 缓慢上下点头
shake 任务被拒绝、错误 横向摇头
blink 默认/定时 3-5秒一次
look_around 进入新环境 左右扫视
动物特有 whistle 用户登录、任务开始 鹦鹉吹口哨
ear_scrape 用户有新提醒 耳朵抖动
tail_flick 能量充足 尾巴摆动
paw_press 完成打卡确认 前爪按压
belly_rub 能量低 + 用户抚摸 腹部摩挲
人形动作 wave 问候/离开 手挥动
stretch 早上唤醒 全身拉伸
clap 任务成功 双手鼓掌
bow 表达歉意/感谢 身体前倾
状态动作 celebrate 任务全完成 跳跃 + 爱心飞出
sad_animation 任务连续失败 垂头、缓慢呼吸
worried_animation 任务超过期限 皱眉、踱步
用户互动 pet 用户按住宠物 2s 触摸波纹 + 依偎动作
feed 右键→喂食 吃掉食物动画
play_game 点击宠物进入 小游戏模式
dismiss 长按 3s 宠物飞走/消失
顽皮行为 steal_icon 随机(间隔 >10min) 宠物靠近某个图标,假装偷走
eat_document 随机(用户保存文件后) 宠物做出"吃东西"动作
hide 用户快速移动鼠标 宠物躲起来,几秒后重新出现

交互流程示例:喝水提醒

  1. C# 侧检测:每 30s 轮询,发现今日未喝到水卡
  2. 状态变更:StateMgr 将状态设为 waiting_for_interaction,原因 drink_water
  3. 推送通知:window.cfcPetAPI.notifyState({state: "waiting_for_interaction", reason: "drink_water"})
  4. JS 侧响应:宠物竖起爪子 + 气泡"该喝水啦~"
  5. 用户点击确认:window.cfcPetAPI.onInteract("confirm")
  6. C# 处理:调用 POST /api/daily/checkin(水分项)
  7. 反馈循环:宠物播放 celebrate 动画,气泡"喝好啦!"

六、核心功能细节

6.1 拖拽与置顶

  • 拖拽:左键按住拖动,支持多显示器
  • 置顶:WPF TopMost=true,确保始终在其他窗口上方
  • 自动隐藏:配置 auto_hide_when_idle=true 后,>15min 无操作自动隐藏到托盘
  • 唤出:恢复任意点击、任务提醒触发

6.2 五维能量可视化

宠物颜色随五维能量值动态变化:

维度 颜色 能量高表现 能量低表现
身 #FF8C42 身体橙色发光 身体灰暗
智 #6366F1 眼睛亮紫色 眼睛黯淡
富 #F59E0B 金色光环环绕 光环消失
行 #10B981 翅膀/尾巴翠绿 颜色褪去
心 #FF6B9D 腮红/颈圈鲜艳 颜色淡出

6.3 声音策略

  • 默认开启系统音效
  • 每个状态可配置独立音频
  • 用户可在设置中静音

6.4 游戏模式

支持的游戏类型: | 游戏 | 描述 | 入口 | |------|------|------| | 舒尔特方格 | 16格数字顺序点击 | 点击宠物 → "玩游戏" | | 记忆翻牌 | 翻牌配对 | 点击宠物 → "玩游戏" | | 数独 | 9×9 数独 | 点击宠物 → "玩游戏" |

游戏结束后,宠物播放 celebrate 或 sad_animation。


七、技术栈

层级 技术 说明
UI 框架 WPF (.NET 6) 原生 Windows 桌面框架
渲染引擎 WebView2 Edge 内核,支持现代 CSS/JS
API 调用 HttpClient + HttpClientFactory 异步轮询,JWT 缓存
动画 CSS Animation + JavaScript 跨状态动画驱动
配置存储 JSON 文件 用户配置 + 宠物形象
打包 MSIX / ClickOnce 单文件 exe 部署

八、文件结构

XafPet.Desktop/
├── src/
│   ├── App.xaml / App.xaml.cs           # 入口
│   ├── MainWindow.xaml / MainWindow.xaml.cs  # 主窗口
│   ├── PetEngine/
│   │   ├── WebViewHost.xaml             # WebView2 容器
│   │   ├── StateManager.cs              # 状态管理
│   │   ├── ApiClient.cs                 # CFC API 客户端
│   │   └── PetState.cs                  # 状态模型
│   ├── Assets/
│   │   ├── default-pet/                 # 默认浠宝/福宝
│   │   │   ├── standing.png
│   │   │   └── pet-config.json
│   │   └── sounds/                      # 音效
│   ├── Scripts/
│   │   ├── pet-engine.js                # 宠物渲染引擎
│   │   └── interactions.js              # 交互逻辑
│   └── Styles/
│       └── animations.css               # 动画定义
├── config/
│   └── app.json                         # 应用配置
└── user-data/                           # 用户数据(运行时生成)
    └── pets/
        └── <user-pet-name>/
            ├── standing.png
            └── pet-config.json

九、部署说明

  • 目标平台:Windows 10/11
  • 依赖:WebView2 Runtime(已预装在 Win10+,旧版需单独安装)
  • 网络:需要能访问 http://localhost:9082(CFC 后端)
  • 首次启动:引导用户输入 JWT Token 或扫码登录
  • 自动更新:可选配置 GitHub Releases 自动检查更新

十、验收标准

  • 宠物可正常显示在桌面,可拖拽移动
  • 宠物置顶功能正常工作
  • 五维能量变化时宠物颜色和状态正确反映
  • 任务完成/未完成时宠物动画触发正确
  • 喝水提醒可触发,用户点击后可完成打卡
  • 小游戏(舒尔特方格)可正常运行
  • 用户可上传自定义 PNG 形象并配置
  • 应用可正常最小化到托盘
  • 所有操作无内存泄漏,资源占用 < 50MB

十一、非功能性需求

需求 说明
性能 内存占用 < 50MB,CPU < 5%
响应 状态刷新延迟 < 2s
兼容性 Windows 10 (1803+)、Windows 11
安全性 JWT Token 加密存储,不记录密码
可用性 支持中文、英文语言包
可维护性 代码注释完整,支持后续扩展新游戏

下一步:编写实现计划(writing-plans)