独立开发一个存钱罐App,我用SpriteKit做了个硬币掉落动画,身边朋友最喜欢的就是这个
起因记账App太多存钱App太少去年年底我想找一个纯粹帮我攒钱的工具。注意不是记账是攒钱——我想设一个目标比如攒2万块去日本玩然后每次往里扔点钱看着进度条一点点涨上去。找了一圈发现要么是记账工具顺带有个储蓄目标功能藏得很深要么就是理财平台包装的导流入口。我就想要一个简单的东西设目标、存钱、看进度、有点成就感。没找到那就自己写一个。这就是「聚沙攒钱」的由来。两个核心模式想了挺久一开始我只做了愿望模式对应代码里的wishmode——设一个金额目标比如买AirPods Max要4399然后每次手动记一笔存入。很直觉零门槛。但做着做着我发现一个问题很多人包括我自己存钱坚持不下去不是因为没钱是因为没有节奏感。今天存500明天忘了后天又存200乱七八糟的。所以我加了聚沙模式对应代码里的freemode自由定投的意思。你设定每周存300App帮你算出多少周能到目标还有个简单的复利计算器。核心不是算得多精确是给你一个固定节奏——每周到了那天该存钱了。策略字段支持weekly、biweekly、monthly三种频率。这两个模式我纠结了大概两周试过合并成一个、试过加更多模式最后发现就这两个最清晰。短期愿望用 wish长期积累用 free。硬币掉落动画花时间最多的功能说实话整个App里花时间最多的不是数据层是那个存钱时硬币哗哗掉下来的动画。我用 SpriteKit 做了物理引擎驱动的硬币掉落效果。每次点存入屏幕上掉下来一堆金币带碰撞、带弹跳落到罐子里。核心场景配置大概长这样// 硬币掉落场景的关键配置funcspawnCoins(foramount:Double){letcountmin(Int(amount/10)3,60)// 存10块掉3枚500块掉一大堆上限60physicsWorld.gravityCGVector(dx:0,dy:-4.8)foriin0..count{letcoinSKSpriteNode(imageNamed:coin_gold)coin.sizeCGSize(width:28,height:28)coin.positionCGPoint(x:CGFloat.random(in:frame.midX-80...frame.midX80),y:frame.maxYCGFloat(i*12)// 错开高度不要一坨砸下来)coin.physicsBodySKPhysicsBody(circleOfRadius:14)coin.physicsBody?.restitution0.35// 弹性系数调了很多次coin.physicsBody?.friction0.3coin.physicsBody?.linearDamping0.1addChild(coin)}} restitution弹性系数这个参数调了很多次。0.6的时候硬币会弹得到处飞像弹力球一样0.1又完全没弹跳感像泥巴糊上去的。最后定在0.35看起来有真实感又不会飞出屏幕。 听起来是个花哨的小功能对吧但我发现这东西对坚持存钱的影响比我想象的大。存钱本身是个反人性的动作——你在限制当下的消费。如果存完了只是一个数字从1800变成2100那感觉跟在Excel里改个数没区别。但硬币哗啦啦掉下来配上触觉反馈UIImpactFeedbackGenerator那一瞬间是有获得感的。 我女朋友用了之后说存钱的时候听那个声音特别爽后来给几个同事装了反馈也差不多——功能层面大家觉得还行但提到最多的就是这个硬币动画。游戏设计里叫juice我只是把它搬到了一个理财工具里。 ## 成就徽章系统用游戏化对抗懒惰 另一个我觉得做对了的设计是徽章系统。每个徽章的解锁条件是一个闭包接收用户的统计摘要返回布尔值 swiftBadgeDefinition(id:streak_7,name:Week Streak,description:Deposit 7 days in a row,category:streak){$0.currentStreak7},BadgeDefinition(id:night_owl,name:Night Owl,description:Deposit 10 times at night,category:special){$0.nightDeposits10},BadgeDefinition(id:early_bird,name:Early Bird,description:Deposit 10 times early morning,category:special){$0.earlyDeposits10} 目前一共13枚徽章覆盖存款里程碑、连续打卡、目标数量、特殊时段这几类。13枚不算多但人真的会为了解锁某个徽章刻意去凑条件。我女朋友专门设了个闹钟早上6点存10块钱就为了攒Early Bird——连续攒了两周才攒够10次。 这个闭包的设计扩展性不错后来我想加什么新徽章写一个 BadgeDefinition 丢进数组就行不用动任何其他代码。 ## 每日语录324句组合拼接App里有个每日激励语录功能一开始我觉得太鸡汤想砍掉。后来决定自己写用了一个偷懒但效果不错的办法——主语谓语拼接18个主语一杯奶茶的钱、睡前的那一次点击、坚持7天的连续记录……配18个谓语会慢慢变成踏实的安全感、让计划不会停在第一天……按日期做哈希取模18×18324种组合够一年不重复。 这种方式写出来的语录比AI生成的有烟火气得多。而且偶尔会出现意想不到的搭配比如把红包攒起来是最便宜的安心保险——这句我自己都觉得挺好。 ## 数据备份踩的坑JSON体积爆炸 这个App后来我也做了HarmonyOSNEXT版本用ArkTS重写。在做数据备份功能时踩了一个印象深刻的坑。 iOS版用CoreData备份走系统的序列化机制体积控制不太用操心。但鸿蒙版用的是轻量级本地存储导出就是纯JSON。有个测试用例里灌了1200个目标每个关联20笔交易导出的JSON直接撑到几十MB在部分设备上解析卡死。 后来我加了8MB的硬上限MAX_BACKUP_TEXT_LENGTH8_000_000超过的时候按目标维度分片——每个分片包含一批目标及其关联的交易记录保证单个目标的数据完整性不被拆断。每个分片有自己的 schemaVersion 和 partIndex恢复时按 partIndex 顺序合并合并完做一次目标ID去重校验防止重复导入。 说实话这个方案不算优雅但对于一个本地工具来说够用了。真有用户攒到1200个目标……那他可能需要的不是存钱App而是心理咨询。 ## 目前的状态 聚沙攒钱 iOS 版目前1.8版本鸿蒙版也在华为应用市场上了。下载量说实话不大还在慢慢推。没做任何付费功能的硬推Pro版本只是解锁更多徽章和主题色基础功能全免费。 回头看做得最对的一件事是坚持把硬币动画做出来。很多时候我们做工具类App会觉得功能全了就行动画是锦上添花。但对于一个帮人养成习惯的产品那个花可能比锦重要。 ## 技术栈-iOS版SwiftUISpriteKit物理动画CoreDataAppIntents--HarmonyOS版ArkUIArkTSHvigor构建--纯本地存储用户数据不出设备 对了鸿蒙版我一直没找到好的方案来做类似SpriteKit那种物理动画效果ArkUI的动画能力和原生物理引擎之间差距还是挺大的。如果有做鸿蒙开发的朋友在这块有经验评论区聊聊 ## 相关链接-AppStore搜索「聚沙攒钱」ID:6758853486--华为应用市场搜索「聚沙攒钱」
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2559421.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!