ssjhhj/fishdesk

这个代码将在屏幕上创建一只游动的鱼作为桌面宠物,与桌面边缘的碰撞模型,前进模型以及与用户的交互有待进一步开发

★ 0Forks 0PythonGitHub ↗Compare

README

FISHdesk - 参数化方程桌面宠物

本项目实现了一个桌面宠物,它基于一组参数化方程来渲染一个动态的、类似鱼的形状。程序运行在一个透明的、无边框的窗口中,从而创造出宠物直接在您的桌面上游泳的错觉。

功能特性

  • 透明背景: 在一个无边框窗口中运行,并具有透明背景(仅限Windows)。
  • 动态形态: 宠物的形状是使用数学方程实时生成和动画化的。
  • 自主移动: 宠物会在屏幕上四处游荡,并能智能地避开边缘。
  • 高度可配置: 动画速度、颜色、点密度等关键参数可以轻松调整。

环境要求

  • Python 3.x
  • Pygame
  • NumPy
  • PyWin32 (用于Windows环境下的透明效果)

您可以使用 pip 安装所需的库:

pip install pygame numpy pywin32

注意: pywin32 仅在Windows上实现透明效果时需要。该脚本为其他操作系统提供了备用方案,但背景将不透明。

如何运行

直接执行Python脚本即可:

python FISHdesk.py

按 ESC 键关闭应用程序。

工作原理

程序的主要逻辑封装在 DesktopPet 类中。

1. 初始化与窗口设置

  • 创建一个无边框的全屏 Pygame 窗口。
  • 在 Windows 上,使用 win32gui 库来设置 WS_EX_LAYERED 窗口样式。然后将一个特定的颜色键(例如黑色)设置为完全透明,使窗口背景不可见。
  • 宠物的初始状态(位置、角度)是随机的。

2. 主循环

run() 方法包含主循环,该循环不断执行三个关键操作:

  1. handle_events(): 监听键盘输入(例如按 ESC 退出)。
  2. update_state(): 更新宠物的位置、朝向和内部动画计时器。
  3. draw(): 将宠物渲染到屏幕上。

3. 渲染管线

draw() 方法是视觉呈现的核心。在每一帧中:

  1. 用透明色键清除屏幕。
  2. 局部坐标计算: 使用 NumPy 解算复杂的参数方程,生成构成宠物身体的 NUM_POINTS 个点的坐标。这些坐标是相对于原点 (0, 0) 的,并使用时间变量 t 进行动画处理。
  3. 旋转: 生成的点围绕原点进行旋转,以匹配宠物当前的朝向角度 (pet_orientation_angle)。
  4. 平移: 旋转后的点被平移到宠物在屏幕上的全局位置 (pet_x, pet_y)。
  5. 绘制: 每个点作为一个小圆圈被绘制在屏幕上。

4. 移动与行为

  • 宠物有一个 pet_target_angle(它想去的方向)和一个 pet_orientation_angle(它当前面对的方向)。
  • 在 update_state() 中,朝向会平滑地插值到目标角度,从而创造出自然的转向动作。
  • check_bounds() 函数防止宠物离开屏幕。当它离边缘太近时,会施加一个“排斥力”来修改 pet_target_angle,使其转身离开。

参数配置

所有主要参数都位于 FISHdesk.py 的顶部,可以修改它们进行实验:

  • NUM_POINTS: 用于绘制宠物的点的数量。影响密度和性能。
  • TARGET_FPS: 目标帧率。
  • DOT_SIZE: 每个点的大小。
  • PET_COLOR: 宠物的颜色。
  • PET_SPEED: 宠物在屏幕上移动的速度。
  • ROTATION_SPEED: 宠物转向目标方向的速度。
  • WANDER_STRENGTH: 宠物方向每帧随机变化的程度。
  • WALL_REPULSION_STRENGTH: 宠物从屏幕边缘弹开的力度。

给未来开发者的建议

代码结构

  • DesktopPet 类: 包含所有逻辑。
    • __init__(): 设置pygame、窗口和初始变量。
    • handle_events(): 输入处理。
    • update_state(): 所有非渲染逻辑(移动、物理)。
    • draw(): 所有渲染逻辑(计算、变换、绘制)。
    • check_bounds(): 边缘碰撞逻辑。
    • run(): 主应用程序循环。

未来可改进的方向

  • 物理系统改良:作者认为现在的碰撞系统和移动方式仍然有很大的进步空间
  • 交互性: 添加宠物对鼠标移动做出反应的行为(例如,跟随、逃跑)。
  • 配置文件: 将硬编码的参数移动到外部配置文件(如 config.ini 或 config.json),让用户无需编辑代码即可自定义宠物。

Contributors

Caster-binyingssjhhj

Issues