放置RPG《StellarRise》已作为个人开发项目发布——在Android上踩过的坑与离线进度的实现方法
放置RPG『StellarRise』を個人開発でリリースしました──Androidで踏んだ沼とオフライン進行の作り方
StellarRise是什么
StellarRise 是一款自动生成、合成并强化武器来推进关卡的放置类RPG。已在 Google Play 上线。
几乎不需要操作。只要启动,武器就会自动生成,进行合成提升星级,战斗也会自动推进。要做的事情大概只有“合成积攒的武器”和“按下强化按钮”,即使只是在碎片时间稍微操作一下,培养也会推进,整体设计就是这样的。

想做这个的契机
我本来就很喜欢玩放置类游戏,在接触了各种作品之后,便产生了“想按自己的理想形态做一次”的念头,这就是起点。自动拾取武器、合成武器,然后看着数字不断增长——我想用自己觉得有趣的分配与节奏,把这个品类特有的爽快感搭建起来。
機能紹介
核心是武器合成。凑齐2把相同★的武器就能合成,升格为高1级的★。只要放着不管,武器就会不断积攒到槽位里,所以攒满之后合成即可。

持续提升★后,武器种类本身也会增加(★2解锁→★3解锁→…),在强化标签页中还能直接提高生成概率本身。用金币进行的固定强化只是前期的辅助,中期以后★生成和辉石(用于永久强化的转生通货)会成为成长的中心。

离线期间的进度会经过正确计算后返还。根据离开的时间长短,可以一次性领取战斗推进所获得的相应金币和宝石。

当攻击力的增长遇到瓶颈时,可以通过转生重置关卡和金币,从头再来。武器、宝石和永久强化在转生后也会继承,因此第二周目以后能比第一周目更快地通过相同的地点。
使用的技术
语言使用Kotlin,界面采用Android标准的View(Fragment + Navigation Component)搭建。画面状态用Flow统一管理,各画面都读取这份状态;存档数据用Room保存在设备内,带认证的云存档则通过服务器API和后台同步来实现。这里没有选用流行的Jetpack Compose,而是选择了传统的View体系。
接下来要讲的,是制作过程中实际遇到的烦恼之处和下的功夫。
离线进度做成了「把时间快进播放」的形式
放置类游戏的关键在于离线进度。即使没有打开应用,武器也在增加、被合成、关卡也在推进——如何计算这些,是最初的设计课题。
思路很简单:把离开的那段时间,用在应用启动时完全相同的处理,当场快进一遍。因为直接沿用了平时的进度计算,所以不容易出现「启动时算得对,只有离线计算的结果对不上」这种不一致。相比于准备两套不同的逻辑、并一直让两边对账,我判断把一套处理在两个场景中复用,做起来和维护起来都更轻松。
画面上方被遮挡、显示不全的故障
发布之后,我注意到在部分画面中,上方的显示会稍微潜到画面顶部的条带下面,被裁掉一部分。
起初我以为用自己计算系统留白并加上去的方式已经修好了,但在某些终端上并没有修好。进一步调查后发现,画面上方的通用导航组件(ActionBar)为了决定自己的显示位置,已经在内部把所需的留白用完了,位于它下方的自有内容一点留白都没剩下。也就是说,在看起来显示正常的条带背后,实际上发生着留白的争夺。
最终我停止使用那个通用部件,替换成了自己组装的工具栏,连余白的分配也改为自己亲手决定,从而解决了问题。也就是说,我不再依赖框架侧的行为,而是改成了全部由自己掌控的形式。
按下瞬间就会立即购买的按钮
在强化界面的连打购买按钮上,存在一个缺陷:明明只是想滚动页面,却会意外地触发购买。
原因在于,手指触碰到按钮的瞬间就调用了购买处理。原本的设计是为了实现长按连续购买,但这样一来,手指碰到按钮的那一刻购买就已经确定,之后再想切换为滚动已经来不及了。
修复的方式是把购买的判断推迟到“手指离开时”。只有普通点击时才购买 1 次,只有保持按住不放时才开�始连打购买,而想滚动页面、手指移动时则什么都不发生——我把它重新改成了极为普通的按钮行为。也就是说,由于追加了长按连打这种特殊动作,反而破坏了点击和滚动这些理所当然的普通动作。
启动时两个对话框同时出现
新玩家首次启动时,教程引导和登录奖励通知会同时叠加弹出,导致文字混在一起无法阅读,存在这样的缺陷。
原本通知类的弹窗已经有一套“避免同时弹出”的机制,但后来追加的教程引导却没有加入这套机制,而是被做成了单独显示的样式。平时倒不会出问题,但仅在首次启动时,多条通知的触发条件几乎同时满足,于是这里就发生了冲突。
修复方式是让教程引导也加入这套机制,统一为按固定顺序逐个弹出。这也算是一个教训:对于“本意是避免冲突”的机制,需要每次都确认后来追加的元素是否能够纳入其中。
已公开
StellarRise
武器自动生成、合成、强化,离线推进,通过转生进行周回——无论是想把它当作放置游戏来玩的人,还是对 Android 实现中踩过的具体坑感兴趣的人,如果能有所收获,我会很高兴。
来源:zenn · 游戏开发社区 · zenn.dev