ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

做一个“心情罐”

做一个“心情罐” 心情罐功能在有这么强的AI加持下我实现这个效果前后应该花了一天的时间刚开始是让AI按照设计图去实现无论让它怎么调都是堆叠的像搭积木堆金字塔没有空间感就像瓶子被拍扁了。我知道应该是缺少什么关键的知识导致无法实现效果我就去github 上.问 copilot 让它找找有没有相关效果的的demo。感谢github 上的前辈们的无私分享解决了我的问题。记录一下这个探索过程。找一下 瓶子里装珠子效果的demo找到了demo但是又想到跟我的需求又不一样不能直接用于是根据我遇到的难点继续问。我需要一个实现思路珠子的层级和摆放怎么控制的这次提问的总结我不知道怎么选则于是继续发问。有没有成熟的堆叠算法呢进入一组珠子层级有些在前有些在后的不好把控这次我毫不犹豫选择了 空间分割。给的代码class SpatialGrid { constructor(width, height, cellSize) { this.width width; this.height height; this.cellSize cellSize; this.cells new Map(); } getKey(x, y) { return ${Math.floor(x / this.cellSize)},${Math.floor(y / this.cellSize)}; } add(particle) { const key this.getKey(particle.x, particle.y); if (!this.cells.has(key)) { this.cells.set(key, []); } this.cells.get(key).push(particle); } // 获取附近的珠子只检测相邻的几个格子 getNearby(particle) { const cx Math.floor(particle.x / this.cellSize); const cy Math.floor(particle.y / this.cellSize); const nearby []; for (let dx -1; dx 1; dx) { for (let dy -1; dy 1; dy) { const key ${cx dx},${cy dy}; if (this.cells.has(key)) { nearby.push(...this.cells.get(key)); } } } return nearby; } clear() { this.cells.clear(); } } // 改进的碰撞检测 handleCollisions(particle, grid) { const nearby grid.getNearby(particle); for (let other of nearby) { if (particle other) continue; // ... 碰撞检测逻辑 } }在选择好实现思路后我就将这个思路和代码 发给 codex然后架构搭好后只需要调整一些细节就实现了这个效果。实现了效果后让AI 总结了一个提示词发给任何AI 都可以实现这个效果了。可直接交给任何 AI 的 Flutter 实现提示词你是一名资深 Flutter 动画、几何算法和性能优化工程师。请直接在现有项目中实现一个“粒子掉入透明容器并自然堆叠”的组件不要只提供思路、伪代码或孤立示例。 项目输入 - 容器背景资源[背景图路径] - 玻璃高光或前景资源[前景图路径] - 粒子资源[粒子图片列表及业务类型映射] - 数据来源[接口模型或状态字段] - 容器设计尺寸[宽×高] - 内部可用区域[位置、宽高或可推导的设计参数] - 最大展示数量[默认100] - 状态管理方式[GetX/Provider/Bloc/Riverpod/其他] - 目标页面或组件[路径] - 项目规范[AGENTS.md 或其他规范路径] 实施要求 在修改代码前先读取项目规范、目标页面、直接依赖、资源声明、路由和现有状态流。能够从仓库中确认的信息不要询问用户。保持最小改动不修改无关业务行为不顺手重构。 一、业务数据适配 1. 将分类统计数量展开为带稳定 key 和 type 的粒子列表。 2. 忽略未知分类、空分类和负数。 3. 数量不超过上限时按真实数量展示。 4. 超过上限时使用最大余数法按真实比例分配最终展示数量必须严格等于上限。 5. 稳定 key 不得依赖接口没有提供的 ID可以使用“数据周期类型序号”。 二、视觉结构 1. 使用三层 Stack容器背景、经过内部路径裁剪的粒子、玻璃高光前景。 2. 背景和高光层不参与点击。 3. 使用独立几何模型描述容器侧壁、瓶底和内部安全区域。 4. 离线模板生成和运行时 ClipPath 必须共享相同的几何公式禁止维护两套不一致的边界。 5. 粒子必须完整限制在容器内部不能仅依赖图片遮挡越界内容。 三、离线模板生成 1. 提供一个可以独立运行的 Dart 工具预生成1最大数量的全部最终落点模板。 2. 不允许在 Flutter 运行时执行完整物理求解。 3. 离线工具使用三维球体近似粒子模拟重力、速度衰减、球体碰撞、侧壁约束和瓶底约束。 4. 使用确定性随机种子使相同参数每次生成相同结果。 5. 粒子视觉尺寸从100%逐步尝试到70%空间不足时自动选择更小尺寸。 6. 尝试多个随机种子和相机角度优先选择无越界、可见度更高、遮挡更少的投影。 7. 低数量建议每个数量生成3套变体更高数量生成1套。 8. 每个槽位至少保存 left、top、size、rotation、depth。 9. 所有坐标必须归一化不能绑定具体设备像素。 10. 推荐使用10字节二进制结构 left:uint16 top:uint16 size:uint16 rotation:int16 depth:int16 11. 每个数量单独保存一个模板文件运行时只加载当前数量对应的文件。 12. 生成时强制校验数量范围、槽位数量、重复槽位、有限数值、容器越界、文件长度和编码反解误差。 13. 将模板目录注册到 Flutter assets。 四、运行时模板加载 1. 根据当前粒子数量异步读取对应模板并严格校验文件长度。 2. 缓存当前模板相同数量的进行中请求必须复用。 3. 模板读取失败时降级为空容器不得阻断页面其他内容。 4. 使用 LayoutBuilder根据实际容器尺寸反解归一化坐标。 5. 使用页面级随机种子选择低数量模板变体。 6. 使用稳定哈希将粒子映射到模板槽位保证普通 rebuild 不改变位置。 7. 缓存模板解析结果、稳定哈希和粒子 Widget。 8. 粒子列表变化时清理相关缓存但普通状态重建不能触发布局变化。 五、入罐动画 1. 每颗粒子从容器入口上方进入单颗动画总时长约900ms。 2. 动画分为下落、第一次回弹、滚向最终位置、阻尼收敛四段。 3. 多颗粒子错峰进入数量越多间隔越短整段动画最长控制在约2秒。 4. 所有动画必须基于模板落点计算相对 offset。 5. 动画结束时 offset 必须严格归零rotation 必须严格等于模板 rotation。 6. 后落粒子可以向附近最多两颗已落粒子施加短促位移和旋转反馈但不得修改最终模板位置。 7. 粒子的方向、旋转和动画幅度必须使用稳定哈希禁止逐帧随机。 8. 首次进入页面播放动画切换数据周期、刷新数据或普通状态重建不重复播放。 9. MediaQuery.disableAnimations 为 true 时直接展示最终状态。 10. 动画控制器必须正确释放不得造成内存泄漏。 六、动态遮挡和性能 1. 使用二维空间网格查询附近粒子避免每帧进行全量两两检测。 2. 中小数量只为真实重叠的粒子建立前后关系。 3. 根据模板 depth、当前纵坐标和稳定索引计算绘制顺序。 4. 中小数量可以使用有向图加拓扑排序出现关系环时按稳定最终顺序兜底。 5. 高密度数量使用量化后的 depth、当前纵坐标和稳定索引直接排序避免构建稠密拓扑图。 6. 设置明确的粒子数量上限不引入不必要的第三方实时物理引擎。 7. 逐帧回调中不得重新加载模板、创建图片资源、生成随机数或执行物理结算。 8. 尽可能复用粒子 Widget、布局结果和邻接数据。 七、代码质量 1. 业务状态、粒子数据、模板数据、离线生成器和运行时动画组件必须职责分离。 2. 为新增或修改的类和方法添加必要注释注释只解释设计原因、边界和约束。 3. 不修改生成代码不重构无关模块。 4. 资源统一使用项目已有的资源常量方式引用。 5. 日志、状态管理、路由和命名方式遵循项目现有规范。 6. 如果仓库存在 AGENTS.md、README 或开发规范必须优先遵守。 八、验收场景 至少验证以下数量 0、1、2、15、16、30、31、60、100、超过最大数量。 同时验证 - 单一类型和多类型混合 - 超量数据的展示比例正确 - 页面 rebuild 后位置不跳动 - 切换数据周期不重复播放首次动画 - 粒子不穿出容器 - 动画过程中无明显闪层 - 最后一帧精确回到模板落点 - 模板缺失、损坏或长度异常时正常降级 - 系统关闭动画时直接展示最终状态 - 不同屏幕宽度下布局保持一致 - 最大粒子数量下无明显掉帧 - 页面销毁后没有未释放的动画控制器。 请直接完成代码实现、模板生成、资源注册和必要验证不要只回复实现建议。 最后按以下格式汇报 1. 变更摘要 2. 核心算法和关键取舍 3. 未改变的现有行为 4. 执行的验证命令及结果 5. 仍需人工视觉验收的项目。这段提示词最关键的地方是明确要求 AI 采用离线确定终点运行时只负责演绎过程。如果只告诉 AI“实现一个自然掉落的粒子罐”它很可能选择随机定位或运行时实时碰撞。效果可能很快出现但通常也会很快遇到穿模、闪层、重建跳动、性能不稳定和结果无法复现等问题。
返回列表