国补之后到底有没有便宜?
主要是大家电 2024 年 9 月突然来了个国补,当时也不明白是个啥,等到我反应过来想去买的时候( 12 月),发现好像价格也没便宜啊?无良商家先涨价再国补? 说是 2024 年 12 月结束就没有国补了,这两天又看到淘宝上已经开始 2025 国补了
主要是大家电 2024 年 9 月突然来了个国补,当时也不明白是个啥,等到我反应过来想去买的时候( 12 月),发现好像价格也没便宜啊?无良商家先涨价再国补? 说是 2024 年 12 月结束就没有国补了,这两天又看到淘宝上已经开始 2025 国补了
多补充维 c ,蛋白? 多休息还是也需要活动活动?
我尝试了多种赚取外快(所谓副业)的方式:做站长接流量主广告、有偿答疑、开知识星球、写专栏、做视频教程、卖软件、基金股票、做公众号接商单推广,甚至还参加过喜马拉雅的配音培训、帆书的社群运营师培训。
说实话,大部分都赚不到钱(当然也可能是我的操作水平不行),少部分赚辛苦钱,比如有偿答疑远程帮别人解决问题、开知识星球,这部分总共也就赚了几千块钱,还不如捐给腾讯公益的多。长期赚钱的是极客时间的专栏(我曾经写过一个《运维监控系统实战笔记》的专栏)和公众号偶尔的商单,这俩加起来平均每月也就是千八百块的。算是较稳定收入。基金股票就是一年挣钱一年亏钱,最近改成长期持有银行股稍微好了点。
不知道 V 友们都是怎么赚外快的?大家觉得哪种方式靠谱?亦或,还不如把时间花在提升工作技能上,老老实实谋个工作岗位,时间投入的性价比反而更高?
每一个游戏玩家心中, 都有一个自己做一款游戏的梦, 费劲千辛万苦后, 我成功制作了一款独立游戏并在 2025 年 1 月 1 日上架了 Steam.
本文既是对这个过程的一种纪念, 也是对游戏制作这个话题留下一些自己的思考和总结, 如果能让后来者少踩几个坑, 就更好了.
我将按时间线索将整个游戏制作和发行过程展现出来, 文章较长, 感谢你的耐心阅读.
我是一个 80 后, 在 90 年代伴随着电子游戏成长起来的一代人, 在读书的时候曾经有一段时间沉迷游戏, 玩三国志和文明系列玩到深夜.
我父亲实在看不下去了, 对我说了一句话: "玩游戏厉害算什么, 有本事自己做一个啊", 当时还小, 也没有能力制作一款游戏, 可能是年少时的那种不服气吧, 这句话我就一直记在了心里.
后来参加工作了, 和大多数社畜一样, 每天累得跟狗一样, 回家就只想躺着休息, 连打开电脑玩一把游戏的兴趣都没有了.
2018 年下半年, Steam 上的独立游戏中国式家长火热, 我正好也玩到了这款游戏, 并向我的朋友推荐了它.
然后在 2019 年春天, 我晚上加班加得心烦意乱, 工作堆积如山, 一眼瞥见了加班了一小会儿就想溜的胡大胖同学, 我说: "你陪我加班吧, 我做完这点事情, 我们就玩暗月来袭", 然后胡大胖同意了.
暗月来袭是当时很火的一款 DOTA2 地图, 我们之前从来没有通关过, 就在那个晚上, 我们打到了历史最佳记录-倒数第二关.
然后在黎明到来前, 胡大胖说:
"加班其实是有一定概率猝死的"
我说:
"要不我们做一款游戏吧, 就叫**中国式加班**"
胡大胖表示同意, 然后我们一起构思了这么一个特别的游戏, 当时胡大胖还并不知道, 他将是这个加班游戏的主角原型.
所以在 2019 年五月, 我初始化了这个游戏项目的 Git 仓库.
虽然对制作游戏一无所知, 但是我知道很多游戏引擎, 比如 rpgmaker,cocos2d,unity,虚幻 3, 当时实在没有心思再投入时间学习这些引擎.
所以我就在想, 能不能用我现有的技术栈来做这个游戏?
我就决定先用前端(Vue)+Electron 先做一个 DEMO 出来.
然后 DEMO 很快就出来了, 它大概长这个样子:
点击新建游戏后出现几个对话, 就这么简单.
懵懂间, 我意识到了自己需要制作一个游戏脚本引擎系统,不过作为一个 DEMO ,我还没有把脚本引擎添加进来。
一切似乎都很顺利, 然后我开始盘算我还需要什么东西才能完成这个游戏, 很明显, 我需要 2D 美术资源用来表达人物立绘和场景, 需要有音效和背景音乐.
我决定先从最简单的音效和背景音乐开始, 音效在网上免费可商用的很多, 背景音乐我选择直接从 audiojungle 购买, 总共花了 800 人民币左右.
然后是美术资源, 我从淘宝上找了一个画手来绘图, 当时想得很好, 一边制作游戏, 一边按照规划输出美术资源.
我当时是以 200 一张的价格向画手定制的, 我们很快敲定并输出了基础的 UI 图.
在输出场景和人物图时, 我和画手都付出了相当大的代价.
当时我们输出一张图需要以下几个流程:
我文字描述想要的场景/人物特色, 尽可能地详细, 并配上例图
画师制作线稿
我和画师敲定线稿, 如果和我的想法有偏差, 会对线稿进行调整
画师细化线稿并上色
画师根据我的反馈, 对成品进行优化和调整
刚开始还不觉得, 但是后来我发现, 这样出一张图的实在是太大大大大大大啦!
当时我们做了一些这样的图:
![贴图]( https://hhacker.com/wp-content/uploads/2025/01/小型公司 1.png)
然后我意识到这样一个问题, 我根本没有足够的资源去得到这些我想要的美术素材, 所以在付出了 8700 元之后, 我选择了将这个项目封存, 不再继续.
不管是时间成本还是金钱成本, 都不是当时的我能够承受得了的.
就这样又过了几年, 我时不时还想起这个游戏项目来, 带着深深地遗憾, 因为我从来不是一个喜欢烂尾的人, 但是人到中年, 也学会了接受很多的客观现实.
转机出现在 2022 年, stable diffusion 横空出世, 同年 12 月, chatgpt 正式上线, 我很快意识到, 也许我现在有机会完成中国式加班了.
在研究了 sd 很久之后, 我确信这个东西生成的图片即便存在这样或那样的瑕疵, 但却是我唯一能够低成本获得 2D 美术资源的方法.
于是我决定重启中国式加班项目.
重启的第一件事, 我决定制作一个路线图表格, 这是这个表格在游戏最终完成后的样子:
我决心按照这个表格严格执行,立马开始了游戏玩法设定的工作。
在设计玩法时,我考虑到了自己的精力有限,所以把整个游戏的玩法设定得特别简单,心里想着玩法的短板可以用丰富的剧情去补充,游戏类型确定为SLG 模拟经营。
其实对于独立游戏而言,剧情代表着巨大的工作量,不过对于当时的我而言,并没有这种认知。
我用自学不到一个星期的 Adobe XD 尝试制作了这样一个原型,以下是抽取的几张原型图片:
这个原型很粗糙,它的最大的价值就是把我脑海里这个游戏的样子用图片的形式展现出来,并且我知道后续原型里这些设定不会有特别大的改动了。
我还需要彻底解决美术素材的问题,所以我特意购买了一台电脑,因为预算有限,显卡是用的 4060Ti 。
然后我开始尝试使用 sd 进行 AI 出图,在这个过程中,我遇到的最大的问题是,如何保持人物/场景风格的一致性,想了很多办法,最终采用的是在 prompt 前置风格描述的方式。
最开始的时候,我是把出图 prompt 用中文描述出来,再用 DeepL 翻译为英文,最后在 sd 里炼丹出图。
但是这种方式有个弊端,对 prompt 的要求非常高,写 prompt 也不是一件容易的事,然后我想了个办法,让 Chatgpt 去帮我写 sd 的 prompt ,Claude 出来之后我就把 Chatgpt 换成了 Claude 。
AI 写的 prompt 非常详细,sd 也能更好的理解 prompt ,但是仍有一个问题,就是无法生成同一场景或人物的细微变化,比如一个人在不更换服装和发型的情况下,要出一张不同动作的图,这就很难,即便我用了 ControlNet 去约束,新出来的图,在服装或发型上,总有些细微的差别,无法做到一致性。
所以我干脆放弃了人物立绘的动作多样化,直接一个人物一张图用到大结局,这样就简单多了。
解决了美术素材的问题,我开始从 0 研发一个简单的游戏引擎,说是引擎,但其实最核心的部分只有一个,就是游戏事件脚本引擎,因为整个游戏都是以事件驱动的。
很快我就构建好了事件脚本系统, 我把事件脚本分为两部分, 一部分是事件条件, 一部分是事件内容, 我把它们都写入一个 Sqlite 数据库中, Sqlite 的数据库其实就是一个文件, 也比较简单且易于管理.
事件条件主要就是人物的一些属性和时间/前置任务等等, 单独使用了一张表保存.
事件内容要稍微复杂一些, 我基于 Markdown 设计了它的基础语法, 最终看起来是这样的:
1. 对话
新垣结衣: 今天我带着**里美酱**一起来的噢.
2. 场景切换
<帝企鹅大楼 3301>
<过场场景>$ /* 隐藏 UI */
<游戏结束>+ /* 直接切换 */
<> /*空场景, 延迟事件执行 1s*/
3. 定义分支
# 相信陌生人
陌生人:你好,我是陌生人.
4. 选项跳转分支
1. 要相信他吗?@相信陌生人
2. 不相信他!@不相信陌生人
3. (角色属性.幸运 > 80) ? 我想赌一把 @相信陌生人
5. 场景加载/取消 NPC
* NPC1
* NPC2
~ NPC3
6. 跳转分支
(角色属性.上级满意度 < 20) ? @条件跳转某分支
(角色属性.名字 == "新垣结衣") ? @条件跳转某分支
(系统属性.随机数 < 0.7) ? @随机跳转某分支 /* 70%概率*/ @直接跳转某分支 7. 画外音 > 平等地剥削劳动力,是资本的首要的人权。
8. 提示
[**里美酱**对你的好感度提升了]+
[你受到了暴击伤害]-
9. 属性修改
(系统属性.某角色 = 解锁)
(角色属性.精神上限 = $ + 100)
(角色属性.底层螺丝钉 = 已激活 @3 天)
(角色属性.休息日 23 点 = 睡觉*) /* 带*号为锁定卡牌 */
10. 播放音乐
{平静 1.mp3}
然后我再根据事件脚本的语法去实现整个游戏引擎, 当时为了学点新东西, 放弃了第一个 DEMO 时使用的 Vue, 转而使用了 React.
其实我对 React 一无所知, 但是好在有 Github copilot 的帮助, 很快就上手了
整个游戏引擎前后耗时约 6 个月, 然后我用这个引擎又做了一个 DEMO 版本, 以测试事件脚本引擎能否正确运行.
结果很幸运, 它真的可以运行起来.
然后我兴高采烈地开始写游戏大纲, 包括游戏背景大纲和游玩角色大纲, 当时计划的游玩角色总共有四个, 分别是胡图巴(倔强的韭菜),肖望荣(中年悲歌),孙西里(小目标),赵浩(拖延症患者的梦), 第三个角色赵浩其实就是以我自己为原型设计的.
大纲写好以后我开始按照原定计划为每一个角色剧本写配套的小说, 第一个角色胡图巴的配套小说写了几万字后, 我突然感觉, 这东西写不完了.
人这种生物一旦在付出努力未能实时获得反馈时, 就会变得极其懒惰.
我也是这样, 我就在步子迈大了小说完不成了和我再抽点时间写写之间反复徘徊.
最终进度非常缓慢.
后来有一天我实在忍不了了, 我就想, 这个小说真的是有必要的吗?
我是在做游戏, 又不是在写小说.
所以我干脆把整个小说系统在游戏里给去掉了, 去掉之后浑身舒坦, 游戏研发进度飞速发展.
经过了一段时间剧情脚本编写之后, 我又开始偷懒了, 因为我感觉自己的的确确没有享受做游戏这种事.
做游戏和玩游戏完全不一样, 做游戏不止很困难, 并且你获取不到玩游戏的那种快乐, 也就是在游戏交付测试之前, 你基本得不到什么正向的反馈.
然后我在做加班游戏的时候开始摸鱼.
这一摸又是很久, 久到我自己都受不了了, 我打开手机写下了这样几段话:
中国式加班从去年到今年已经两年了还没完成,需要进行反思和总结,找到加快开发进度的方法。
## 原因
1. 惰性
人总是趋向于做容易的事,容易取得成就感的事,所以把空闲时间大量花在了看视频玩游戏上
2. 难以进入心流
开发过程中无法全神贯注,并且不享受游戏开发的过程,创作和和玩游戏的感觉完全不一样,无法受到实时激励
3. 没有紧迫感,没有计划
整个事情没有时间节点的压力,现在时间比较充足,也没有经济上的压力,就无法高效地推进任务
## 解决方法
1. 加长那些简单获取多巴胺的事项的路径
比如删除游戏,限制抖音等 app 的使用时间,解放碎片时间,使得专注时间更长
2. 设定截止日期和任务计划
每天回顾这个计划并坚定按照计划的时间和工作量去推进,尽可能的分解大的任务为小的任务
3. 让创作的过程变得更有趣
让创作游戏脚本的过程更简单并且更有趣,甚至像玩游戏一样去做游戏,或者边做边玩
4. 将做游戏这个事放入重要且紧急的象限里
放弃对部分品质和细节的追求,尤其是场景图和人物图等资源的生成,把做游戏这件事设定为目前最重要且需要快速完成的事,放弃对销售量的预期,只专心到“完成它”这一件事上,哪怕因为过于粗糙导致最终玩家评价不好,至少这件事我“完成了”,也许有瑕疵,也许压根就不好玩,但是“完成了”对我而言就很有意义
5. 使用合作的力量,引入其他人参与,以更多的空间力量去执行任务
6. 把路线图表格保持打开状态,随时提醒自己,根据进度更新路线图,预计好工期
这样游戏的研发进度再一次飞速推进, 到了接近胡图巴的游戏大纲中最后一段主线剧情时, 我又陷入了畏难情绪中.
我一想到就算这个做完了, 还有 3 个游戏角色要做, 我就浑身难受, 觉得根本完不成了.
然后我找胡大胖吐槽, 说做游戏好难啊, 胡大胖说, 那你就做简单一点啊, 先做出来再说.
我想了想, 要怎么才能加快整体的进度呢? 要不直接减少可游玩的角色吧.
然后我就把除了胡图巴之外的其他三个角色都给删掉了.
这下进度条狂奔, 直接到了 90%.
然后我开始赶工, 只以完全主线剧情为唯一目标, 原本计划了很多的分支剧情, 不想做就不做了吧.
就这样游戏主体很快就完成了.
给游戏设置背景音乐的时候, 我一开始仍然是使用的几年前购买的音乐素材包, 后来一想, 时代已经变了, 为什么不用 AI 来生成游戏的背景音乐呢?
说干就干, 我注册并购买了 Suno 的会员, 花费 10$, 然后生成了乐器伴奏的纯音乐作为游戏的背景音乐.
后来我想, 要不要在游戏的主菜单界面放一首人声的主题曲呢?
我觉得这个主意很棒,并且很简单, 成本又低, 因为 Suno 刚好也支持生成人声的歌曲, 于是我开始写歌词.
一开始的时候想让 claude 帮我写一首押韵的歌词, 但是 AI 生成的歌词达不到我预期的效果.
于是我决定自己写一首歌, 歌名就叫《天命打工人》, 最终完成的歌词如下:
verse 1:
清早闹钟又响起
地铁里面深呼吸
打卡上班很着急
工作已在等着你
chorus:
九九六, 九九六
熬夜加班伤身体
零零七, 零零七
摸鱼才是硬道理
九九六, 九九六
咖啡续命撑到底
零零七, 零零七
我要变成万人敌
verse 2:
这个需求很简单
怎么实现我不管
老板画饼要吃饱
生活娱乐全扔掉
chorus:
九九六, 九九六
熬夜加班伤身体
零零七, 零零七
摸鱼才是硬道理
九九六, 九九六
咖啡续命撑到底
零零七, 零零七
我要变成万人敌
bridge:
打工人, 打工魂
打工人打开一张门
打工实在太费神
打工人要做人上人
verse 3:
凌晨四点的夜光
照亮回家的方向
忘了加班的烦恼
生活多一点希望
ending:
九九六, 九九六
熬夜加班伤身体
零零七, 零零七
摸鱼才是硬道理
九九六, 九九六
咖啡续命撑到底
零零七, 零零七
我要变成万人敌
当我用 Suno 生成歌曲时, 意外出现了, Suno 生成的中文人声歌曲总是有部分吐词不清楚, 而且有一些词会怪异地使用粤语的发音(推测 Suno 使用了很多粤语歌曲进行训练), 不管我怎么调整都没有用, 我甚至用带声调的拼音作为歌词放 Suno 里生成, 也还是不行.
然后我想, 外国的月亮也不圆, 我们国内有没有同类的 AI 音乐网站呢?
欸, 还真让我找到了, 就是国内的海绵音乐(字节系), 我用同样的歌词贴进海绵音乐了, 不到 5 分钟我就得到了发音清楚的摇滚音乐, 虽然海绵音乐生成的音乐没有 Suno 那么音色饱满且充满细节, 但是胜在发音清楚, 让人有听下去的欲望.
如果想听一听的, 可以打开这个抖音链接试听:
https://v.douyin.com/iyMKtt8p/
最后要做的是多国语言翻译, 因为一开始我就使用了 i18n 库, 所以这部分工作主要就是翻译 i18n 字符串.
我为游戏提供了几种语言, 简体中文, 繁体中文, 英语, 日语.
我尝试使用 claude 去翻译 json 字符串, 经过一系列尝试后, 使用以下 prompt 获得了很好的效果:
以下是一些游戏的 i18n 对话文本, 将其 value 翻译为英文, 请不要修改 key, 翻译后的内容需要全年龄段适用, 请一次性翻译完成, 请务必一次性翻译完成, 文本中的**标记或其它可以转义的标记请对其进行保留, 输出内容为 json, 用 inline code 的方式输出
但是手动调用 claude 去翻译的工作量实在是太大了, 我就想能不能调 claude 的 api 呢? 结果卡在了付费这一步, 没有合适的外卡进行支付, 我的国内 visa 卡并不能支付 claude 的费用.
经过一番搜索, 我找到了 rapi 的 claude api 服务, 其实这个服务的提供者也只是转发了 claude 的 api 服务(不知道这样是不是违反 claude api 的 tos 的), 好处是 rapi 的支付渠道很好, 可以接受国内的 visa 卡付款.
搞定了 api, 我直接在 copilot 的帮助下写了一个 python 脚本去批量地使用我研究出的 prompt 对 i18n 文本进行翻译.
这个脚本在翻译完后还会自动检查是否有漏掉没有翻译的 i18n key.
然后翻译工作就简简单单完成了, 前后没有超过半天.
这个时候我其实就已经想发布内测版本, 把游戏发给我的朋友们玩了.
但是当我表达出这个意图时, 他们纷纷表示, 坐在电脑前玩游戏太奢侈了, 有没有手机版?
好吧, 虽然不打算发行移动版本, 但还是移植一个安卓版本吧.
然后我学习了Cordova的使用, 并打出了一个 apk 包.
放手机上运行, 直接白屏, 想想也对, 移植工作可不只是打包 apk 这么简单.
我需要把原来所有涉及到文件读取的地方, 改造成调用安卓 API.
因此我重新设计了 Files 库, 区分对待 PC 和安卓, 游戏中所有涉及到文件的地方统统使用这个 Files 库.
折腾了两天之后, 游戏终于可以在手机里运行了.
我兴高采烈地发了一条关于游戏内测的朋友圈:
第一时间就发给了胡大胖, 结果胡大胖说, 运行白屏.
我当时的表情是: ????????????
我的第一反应是: 在我的机器上好好的啊
一问才知道, 他的手机是安卓 11, 所以肯定是一些兼容方面的问题, 安卓 11 的 webview 没有后面的安卓版本高.
我又花了两天通过调试安卓 11 的虚拟机解决了这个兼容问题.
胡大胖对游戏开始了非常严谨地测试, 一直到最后我点下游戏发行的前一刻, 他还在废寝忘食地测试游戏, 一遍一遍地玩已经玩过很多遍地剧情, 在此再次对胡大胖表示感谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!
在游戏的测试中, 不断发现有新的 bug, 但是改 bug 并不让我感到痛苦, 所以整个过程都很顺利.
在测试游戏的过程中, 我想起要去注册 Steamworks 去发行游戏了(其实这一步应该更早的进行), 赶忙注册了一个 Steamworks 账号.
注册账号的过程中, 支付了 100$用于购买发行坑位, 按照 Steam 的说法, 当游戏销售额达到 1000$时, 这 100$会还给我.
然后是填写美国的税务表, 就按身份证上的信息填写就可以了.
填写完, 很快 steamworks 会提示需要上传补充信息, 其实就是身份证的正反面和手持身份证的正面照, 照做就可以了, 我一开始没有仔细看英文的提示, 没有上传手持身份证的正面照, 税务表被打回来了一次, 最后提供了手持身份证正面照就成功了.
这个税务表的审核如果顺利的话 2-3 个工作日即可完成.
注册好 steamworks 后我做的第一件事, 就是给游戏定价.
因为我也没有打算能够回本, 当然也不奢望销量会爆, 所以我想要不就把价格设置得低一点吧, 回本是不可能回本了, 那就国区卖 9.9 人民币, 美区卖 1.99$.
其实我还可以定得更低一些, 但又觉得那未免也太不尊重自己了, 就算了.
(如果有实在囊中羞涩又想玩这个游戏的朋友, 可以通过商店页面的联系方式找到我, 我可以免费送你 CD-KEY.)
接着我开始准备 Steam 的商品页, 按照 Steamworks 里的表单一项项填写就可以了, 虽然这个商店管理后台诡异且充满了屎山的味道, 但还是勉强可以使用.
唯一要注意的是上传商店图片素材时它是根据图片尺寸来自动填充到对应的表单位置的, 所以图片的尺寸一定要符合它的要求.
我电脑上没有 ps,我是直接到 Photopea 网站上调整的素材大小.
然后我用剪映制作了一个极其粗糙的宣传片, 因为我觉得商店页面有个游玩视频感官上会更好一些.
这里因为我游戏提供了繁体/英语/日语, 游戏商店我也进行了繁体/英语/日语的本地化设置, 主要是游戏描述的文本.
全部设置好后提交商店审核, 然后因为一些小细节, 审核被打回来了一次, 修改后, 重新提交审核就通过了.
审核通过后, 商店就可以在 Steam 里搜索并被玩家看到了, 这个时候 Steam 会赠送一些曝光, 游戏愿望单每天都有增加.
这里前后花了一个星期的时间, 这里我犯了一个错误, 商店审核后没有立刻点击商店发布, 导致游戏发行时间延后了, 因为游戏正式发行时间必须在商店页面发布两周以后.
接着是游戏主体的审核, 这里其实并不需要提供游戏的最终版本, 而是只需要一个接近最终版本的游戏版本的就行了, 所以即便有 bug, 也可以提交上去供 Steam 审核.
第一次审核时 Steam 又找了一个商店页面的问题打回来了, 并且说最好是支持一下 steam overlay, 就是进入游戏后按 shift+tab 出来的那个东西.
我想这应该不难吧, 把商店的问题改好后, 就找了 steamworks.js 库去适配 steam 的 api, 结果出来的效果不行, 一按 shift+tab 界面就卡死了.
后来在网上一篇文章里找到了原因, 是因为 electron 渲染的网页是不会实时刷新的, 这和普通的游戏不一样, 按下 shift+tab 后 steam overlay 虽然有出来, 但是就消不掉了, 我在那篇文章里也找到了对应的 workaround:
function initSteamOverLay() {
function fakeGameloopForSteam() {
const canvas = document.getElementById(
"fake-refresh-steam"
)
const styler = canvas
styler.style.width = `100vw`
styler.style.height = `100vh`
const ctx = canvas.getContext("2d")
ctx.clearRect(0, 0, 1, 1)
// Not sure if this could work if fully transparent or if setting CSS opacity to 0, I haven't tried yet
ctx.fillStyle = "rgba(0, 0, 0, 0)"
ctx.fillRect(0, 0, 1, 1)
requestAnimationFrame(fakeGameloopForSteam)
}
const canvas = document.createElement("canvas")
canvas.id = "fake-refresh-steam"
canvas.width = 1
canvas.height = 1
const styler = canvas
styler.style.position = "fixed"
styler.style.top = "0px"
styler.style.bottom = "0px"
styler.style.pointerEvents = "none"
styler.style.zIndex = "30000"
document.body.appendChild(canvas)
fakeGameloopForSteam();
}
然后我又提交了一次 steam 游戏审核, 这次审核通过了.
在这个过程中, 我得到的教训是, 其实可以更早一些注册 steamworks 并发布商店页面, 因为商店和游戏审核至少要用掉 2 周,而商店发布后又需要等 2 周才能点发行, 所以提前 2 个月甚至 3 个月去做发行相关的事情是比较合理的, 这样就不会出现游戏做完了却无法点击发行的尴尬场景.
游戏做到这一步, 我感觉已经差不多了, 但是在等待 steam 审核的时候, 我又写下了这样一段话:
从一个玩家的视角,如何去判断一个游戏是否好玩?
我觉得最重要的是有没有在游戏中体会到乐趣。
游戏玩家其实是一个特别容易讨好的人群,他会因为游戏中一些精巧的设计捧腹大笑,也会在看到一些新奇的很小的东西时感到开心。
并且游戏玩家富有同理心,他们对游戏的代入感特别强,你在游戏里讨好他,他心里清清楚楚并且很享受。
作为设计者,我们的游戏是对真实世界的拙劣的模仿和放大,在其中设定一些真实世界不常见甚至是完全不可能的事情。
我们在设计游戏的时候,需要迎合受众的寻求,增加相应的机制去满足玩家的心理需求,这些机制可以是以下几种形式:
1. 独一无二的特殊事件,通常以游戏主线或分支剧情的形式展开
2. 基于随机性过程和结果重复的循环事件,就像是钓鱼一样,你永远不知道今天自己会钓上来什么
3. 与真实世界形成反差的任何游戏设定,现实中越难得到的,在游戏中越容易得到,所以连欢乐豆都会有人喜欢攒
4. 与真实世界可以形成对照和代入的罕见事件,游玩过程中玩家并不具体期待某一件事情,但是永远在期待好的事情
5. 玩家需要轻微的挫折,人性都是如此,太容易得到的就不会珍惜,因此玩家在某个方面违反了设计者设定的机制时,便会在游戏中受到数值或其它方面上的惩罚
我又根据这些思考, 对游戏的部分剧情进行了补全, 尤其是恋爱事件, 因为我发现胡大胖特别痴迷于和美女们搞好关系.
这样, 等待发行的这段时间就也充分利用起来了.
随着可发行日期越来越近, 在胡大胖还在疯狂测试的同时, 我决定录制一个游戏的游玩视频, 到时候进行 steam 循环直播, 因为我看了 steamwork 的文档, steam 是允许录播的, 前提是你在页面里有表明是录播(Replay).
在第一次录制这个游玩视频的时候, 中后期我自己又发现了一个不可原谅的 bug, 就是游戏中就职的公司可能会在发薪日不发工资给玩家!
所以只好又匆忙修复这个 bug, 然后我发现, 修复的这个 bug 解决了一些游戏中潜在的一些隐性问题.
这是一件很值得开心的事, 现在就发现 bug, 比玩家玩的时候发现 bug 要好, 作为一款低成本的剧情向独立游戏, 我知道玩家并不会给我第二次机会, 如果因为 bug 导致主线剧情无法正常游玩, 玩家虽然不至于退款, 但也不会再有兴趣打开游戏了.
然后我第二次开始录制游戏的游玩视频, 这次非常顺利, 录制完后我把游戏实机视频用 OBS 软件推流到 steam 直播, 并且循环播放, 很快我的 steam 商店页面就能看到我在直播了.
2025 年 1 月 1 日零点, 我终于点下了游戏的发行按钮, 一切都画上了句号, 也许不圆满, 但我实现了一个梦想, 付出了很多, 但是在最后这一刻, 我深深地感到了自豪.
游戏首发第一天就收获了一条好评, 果然爱玩游戏的都是好人!
原本发行后, 如果没有 bug 需要修复, 做一个独立游戏这件事就应该画上句号了, 但我觉得应该把自己这些经历写出来, 给后来者一个参考, 也是给自己一个反思的机会.
于是见缝插针写了本文, 其中肯定有疏漏或错误的地方, 欢迎各位大侠指正.
最后, 祝大家都能做自己喜欢做的事!
有点选择困难症,但是都没重度使用过,平时也不重度写码。只想业余研究。
有个亲戚的小孩,专科学的计算机,gap 快一年,在深圳找了半年前端工作,想转测试都没人要。 外卖好像都饱和了,估计只有进厂一条路了。
目前市面上大多数客户端都是基于 Electron 或 HTML 开发,我个人不太喜欢这种“塑料的感觉”(并不是贬义,缺乏真实触感的体验)。因此,我选择使用 Java Swing 开发一个桌面端客户端。
核心部分采用 Kotlin 开发,最终目标是通过 Kotlin Multiplatform 打造一款全平台的 SSH/终端 工具。
目前尚不支持 SFTP/FTP 等
使用 Kotlin 实现了 XTerm 协议(尚未完全实现)。桌面端的渲染层基于 Java Swing ,未来计划将这一部分迁移到 KMP ,从而实现真正的跨平台支持(包括移动端)。
在实现协议的过程中,参考了许多经典的客户端,例如:
这是一个长期发展的项目。
希望大家给点建议 🙏
7 年前的台式机了,最近玩那个新出的游戏 [燕云十六声] ,可能是显存爆了,居然直接绿屏了,然后再也无法显示了。准备在京东上买个二手的网吧拆机卡 1080Ti, 不知道靠谱不。目前的主板是技嘉 AB350M gaming-3, CPU AMD R5 1500x, 然后考虑到电源功率可能不够,再整个 750W 的全模组电源,这配置应该匹配吧
因为各种 PT 站总是很难注册,有层神秘的面纱,对于我这种从来没玩过的人来说非常好奇里面到底有什么东西
目前我对于影视的需求就是各种电影、电视剧,对于这种,感觉只是需要:
就完事了,99% 的影视资源,115 都能成功秒传到网盘,然后跑满家庭千兆带宽高速取回本地。之后刮削完打开 infuse 直接看就完事了。
如果是 PT 的话,还要费劲调试种子客户端,还要记得不能忘记下载完成后再上传一段时间避免被 PT 封号,还要预留一部分 NAS 的磁盘空间去存储 PT 上热门的资源,以及各种五花八门的规矩/守则等等,感觉麻烦很多啊?
难道是同一个电影,PT 站上有更高的清晰度?可我都已经从 pirate bay 下载到 4K REMUX 了,难道 PT 上有独家 8K 版本?
或者是有「冷门资源」?可是什么样的冷门资源呢?难道是类似上个世纪的古早电视剧、纪录片这种?这种感觉需求量应该也不会很大呀?
有钱确实可以解决 99%的穷人烦恼~ 不会失业, 不会中年焦虑, 可以做真正喜欢的事情 可以拒绝不喜欢的事情
甚至身边的人都友善了起来
从小到大配眼镜的方式基本上都是,找一家线下的眼镜店,验光,配镜,选镜框,拿货走人。但是多年来的体验差距很大,有的配的没啥问题,有的就觉得质量很差。上次配的尤其差,戴了一年感觉度数提高了不少。之前听说有人在线下找眼镜店验光,拿到处方后给网店配镜。但感觉这样更没法信得过,并且白嫖线下店验光也有点说不过去。那么在 2025 年有什么更好的模式吗?
最近因为偶然的原因, 不得不用了一段时间的 go. 经过这一段时间的使用, 发现这门语言实在是有太多不爽的地方, 所以就在这里吐槽一下, 看看是不是因为我理解不对, 还是这就是 go 语言以及生态的缺陷.
go 的控制流非常简单: for, if, else, switch and defer 就是全部了 当然, 你如果之前对计算机语言所有的认知都来自于命令范式的语言(比如 C), 这并没有什么, 甚至觉得够用了.
但是对于偏函数式风格的语言, 这简直太简陋了, 函数式的控制流不仅有 for, if-else, 对于 switch 来说有更加强大的 pattern-match, 对于 defer 这种玩意, 有更好 try-catch-finally 替代, 而且你想怎么写就怎么写. 而且支持 unit, filter, map, flatMap 等等统一的操作.
golang 控制流的简陋直接造成了 golang 的语法表达能力差. 解决同样的问题, 需要更多更长的代码, 就像当年不支持 Lambda 特性的 Java 一样.
我就奇怪了: Java 没有支持 Lambda 以前, 人人骂 Java 代码啰嗦, 写起来累人, 到了 golang 了这么差的语法表达力, 怎么就成了简单清爽?
我接触到其它语言在写后端业务逻辑是, 对于 public 方法的入参是采取完全不信任的态度的. 原因很简单, 传进来的值在运行时存在非常多的可能, 最典型的就是 null 值一定要处理. 如果存在 a.b.c.d 等这样取值方式, 恐怕要不得不采用 Option 一层层去拿. 我可以理解有人说 Option 麻烦, 不管你用什么方式, 至少判空的逻辑是少不了的.
但是, Golang 是没有 Option 和 Try 的, golang 甚至连三元表达式都没有, 所以一般 Golang 是这样做的:
if a == nil { return nil, someError("...") }
b, err := a.b
if(err != nil) { return nil, someError("...") }
后面一大长串的 if(err != nil).......
如果你天天是写这样的代码, 你觉得这叫简洁?
其实 golang 的集合就只有个 array 和 map.
还有人说 array 的 slice 支持操作很方便啊? 我劝你醒醒, 看看其它语言吧, 就这几个操作哪个语言不支持啊?
Go 默认集合类型就是可变的, 所以所有对集合的操作, 实际上是修改集合自身. Go 是没有不可变集合这个概念的.
嗯, 找了找居然有人写了类似于 Linq 的 go-linq, 但是你看看相同的操作, go 得写多少代码吧, 而且每个操作结束时输出的变量居然时实现声明好再传进去的, 连直接输出到一个不可变集合的能力都没有.
其实我认为 Java 的数据库处理已经够老旧了. JDBC 标准已经很久没更新了, 而且很可能也不再更新了, 之前很多人期待的原生异步处理能力很可能不会再有了. Java 比较流行的 ORM 框架, hibernate 和 MyBatis 也已经非常老了, 老到都没办法在多线程环境下正常运行, 因为 Context 默认是单线程环境的. 但就这么老的 ORM 框架, 或许没办法跟.Net 的 linq 处理效率比一比, 但跟 Go 比起来也是好太多了.
来来来, Go 现在访问数据库, 有好的 ORM 框架吗? 有一个 sqlc 代码生成器, 大家已经觉得好太多了, 比自己写实在是快多了, 怎么不骂 Go 的数据库处理低效了, 就这??? 连个像样的 ORM 框架都没有.
Go 有泛型, 但又不支持方法级别的泛型.
Go 也没有泛型型变的概念.
所以你在接口上做一定程度的抽象, 绑定更多操作, 生成新的类型的实例是做不到的.
Golang 其实真的只是一个 Better C 的定位, 当然这还是在开发效率上来说的, 就是仅仅** Better-Than-C **. 但 Golang 这简陋的语法, 相对于其它非常多的现代语言来讲, 还是差的很多的.
可能 Go 语言的那几个掌舵人就是典型的命令范式计算机语言的拥趸, "嗯, 我们可绝不会加入任何函数式的特性, 这会增加这个语言的复杂度, 降低编译速度, 让语言不纯粹...."
您说您的, 但是 Go 写写底层就好了, 毕竟比 C 好. C 可是连数据类型概念都没有, 从来只操作内存的.
现在结构体都允许写接收方法了, 也能写点泛型了, 内存都帮你回收了, 你还想怎样?
什么? 你说用 Go 写业务逻辑很痛苦???
谁让你用 Go 写业务逻辑了, 跟你说了别去跟那帮写 Java 的混一起, 他们就只会 spring, 除了 spring 啥都不会.
postman 的开发者是没有别的产品了吗, 一直在 postman 加功能, 越来越臃肿,m1pro 都要启动一分钟出不来。
受不了。
求推荐个 mac 下性能好,功能便捷的 postman 替代品。curl 就别推荐了,用起来还是不方便。
麻烦问下大佬们,2025 年了,有什么稳定(不损失本金)收益高点的理财方式?期望收益能在 3%以上
保本!保本!保本!
而且房地产中介不卷中介费 比如降到 0.5%
绿中介普遍都是 2%,甚至 2.5%
按道理一个自由竞争市场,这个费用理论上会卷到 0 ,因为总有平台为了流量冲。
这是为何?
小学的时候家长不让玩电脑,就喜欢看读者文摘这样的杂志。杂志的内容很丰富,既有新闻,又有一些笑话、艺术插图、摄影作品。
长大后发现很多人认为读者文摘这样的杂志只是鸡汤,不建议阅读
随着互联网的无孔不入,现在网络上的内容已经变得很无聊,比如刷抖音刷成了只会上下滑动的大猩猩
互联网只是技术在不断变更,内容却越来越傻。小时候抱着读者文摘读,反而很充实
像这种周刊杂志,在目前这个快节奏的社会,应该很难生存吧。也算是劣币驱逐良币了。
不知道现在有什么类似这种书的读物、网络上的网站
如果只是刷 v2 这种技术论坛,也很是无聊,得不到心灵上的放松和舒适,毕竟人不想下班后继续讨论技术,也不想同质化的内容刷个不停。
今年 youtube 好像升级了不少反下载措施
以前用的工具都失效了
现在还有什么工具能稳定下载吗, 当然最好是免费的
最有名的 yt-dlp 也不能用了, 提示登录反 bot 之类
光阴荏苒,日月如梭,转眼间又到了新的一年。
这已经是 OP 在 V2 的第十个年头,也是第三年踢楼活动了,这几年搞的副业也得到 V2er 的支持,已经和上千位 V2er 达成交易,并得到一致的好评。
为了感谢大家,在下准备了几份小小礼品,借此机会回馈一下 v2er ,祝大家新年快乐,更高的收入,更少的烦恼。
请允许我介绍一下我的业务,目前在租的业务有:
1.Youtube Premium 家庭版(美、港、日、加、新、澳)
2.YouTube Premium 家庭版 整车订阅
3.YouTube Premium 个人版
4.美区 Google One + Youtube Premium
5.有香港 0 月租卡,香港流量卡等等
PS:合租的业务是 2021 年至今了,差不多已经四年了,续费率达 85%(不用担心跑路)
交流群 https://t.me/youtuhezu_group
E-Mail: youtuhezu@gmail.com
开奖日期:2025 年 1 月 5 日
中奖规则: 取 1 月 4 日 Google BTC 兑 USD 整数后三位数值
例如 2024 年 12 月 13 日的 99999.12 ,那么就取值 999 。 个位数 9 楼,十位数 99 楼,百位数 999
2-9 楼:10%
10-99 楼:1.11%
100-999 楼:0.111%
2.中奖楼层十位数为 0 时,那么该数值改为 1 ,例如 01 那么中奖楼层就是 11 。
3.中奖楼层百位数为 0 时,那么该数值改为 1 ,例如 012 那么中奖楼层就是 112 。
4.YouTube Premium 为美区合租车,包含 music ,不限制使用地区 IP 。
5.本次发放的京东 E 卡为电子卡,面值 100 。
6.每个 ID 只能参与一次,多次回复无效,若中奖,奖品顺延下一楼层。
7.T 楼没有口号限制,直接参与即可。
2024 年 T 楼活动: https://www.v2ex.com/t/1004976
烦死
开车上头了
想追前车
结果前车没注意到路口的红灯急刹了(红绿灯放在地上的那种)
我也没刹住
我后车是个老司机 直接向左打了下盘子 避开了
...
提车开了不到 5000 公里
算上这次出了三次事故(头两次是别人的全责)
我已经怀疑我该不该买车
或者该不该买新车
我有时候开车的确有个问题
一些情况下会别车,前车如果慢下来,还会来一脚刹车...(之前自己还没意识到)
...
我还是反省一下吧