与 Decker 相处的四年
摘要
John Loomis 的年度回顾,总结 Decker(受 HyperCard 启发的创作环境)过去一年在 1.61 到 1.71 之间的进展,包括 gamepad 支持、Lil 语言改进、新的 IMG3 图像压缩编码以及用户社区作品亮点。
暂无内容
查看缓存全文
缓存时间: 2026/10/21 06:23
## 与 Decker 共度四年
十月再次到来,照例是回顾 [Decker](https://beyondloom.com/decker/index.html) 过去一年进展的时候了,这次涵盖 1\.61 版到 1\.71 版之间的内容:
- [新地平线](https://beyondloom.com/blog/fouryearsdecker.html#newhorizons):扩展 Decker 可行项目范围的新能力。
- [语言的成长](https://beyondloom.com/blog/fouryearsdecker.html#growingalanguage):对 Lil(Decker 的脚本语言)的改进。
- [Deckerverse](https://beyondloom.com/blog/fouryearsdecker.html#thedeckerverse):来自 Decker 用户群的亮点。
- [对人类创造力的承诺](https://beyondloom.com/blog/fouryearsdecker.html#apledgeforhumancreativity):一个承诺。
## 新地平线
今年引入 Decker 的最引人注目的新功能之一是[手柄输入支持](https://beyondloom.com/decker/decker.html#gamepadinterface),在可用时回退到键盘控制。许多 Decker 用户正满怀兴趣地构建电子游戏,而 `gamepad` 让街机和动作类游戏触手可及:
[手柄测试器](https://beyondloom.com/decker/gamepad.html)
在这个功能的基础上,还有很大的空间来构建更多示例和库。首先,[推箱子示例](https://beyondloom.com/decker/goofs/sokoban.html)现在可以使用手柄或键盘游玩。[Dialogizer 模块](https://beyondloom.com/decker/dialog.html)则会悄悄升级任何使用它的游戏,使其支持用键盘推进对话框和在对话树中做出选择。Dialogizer 还利用了新的 `app\.cursor` 字段,在"同步"脚本中模拟普通按钮的悬停行为。
另一项重要的增强不需要用户做任何操作:更好的图像压缩。为了简单起见,Decker 最初在存储图形时依赖于简单的位打包和行程编码,但[数据块格式](https://beyondloom.com/decker/format.html#datablocks)为将来引入更好的编解码器留下了空间。新的 `IMG3` 图像编码器与 Decker 的 GIF 编解码器共享基于 LZW 的内核,对许多 deck 实现了 2–4 倍的文件大小改善,尤其是那些使用抖动色彩图形的 deck。当新编解码器的表现不优于 `IMG0`、`IMG1` 或 `IMG2` 时,会自动选择旧的编解码器。电子杂志作者们现在可以在一张软盘上装下多得多的内容了。
Decker 的[精巧装置](https://beyondloom.com/decker/decker.html#contraptions)随着新"属性类型"的引入而变得更加灵活,这些属性类型控制着配置精巧装置设置的自定义 UI。这些属性现在可以是 `"data"` 或 `"note"`。`"data"` 属性以 [LOVE](https://beyondloom.com/decker/format.html#lilobject-valueencoding(love)) 字段的形式展示并解析,使得更容易暴露结构化数据,而无需为描述它们发明一次性文本格式。`"note"` 属性则展示一段内联的说明文字,而不是提供编辑器,为精巧装置提供了更多自我文档化的方式:
一个带有 `note` 属性、说明使用方法的精巧装置
对颜色的支持也在持续扩展和改进。所有部件现在都有一个 `.pattern` 属性,与现有的 `.show` 和 `.font` 属性配合控制其外观。你可以通过菜单中的 *部件* → *图案...* 快速修改所选部件的图案,或者简单地点击右侧工具栏上的图案色块:
修改部件的 `.pattern` 属性
选中富文本后,你也可以使用右侧工具栏快速更改文本的图案或颜色:
修改富文本片段的图案
我也对现有功能做了许多改进,使 deck 的创作更加轻松和直观。例如,将图像粘贴到缩放后的画布中时,现在会调整画布"逻辑尺寸"的尺寸,以避免意外裁剪粘贴的图像;剪贴板中的图像还可以从任何编辑器模式作为新的画布部件粘贴:
将图像粘贴到画布中以及作为新画布
[Font/DA Mover](https://beyondloom.com/decker/decker.html#resources) 显示更多有用的资源信息,包括它们对 deck 磁盘大小的贡献。你现在还可以从此对话框访问 Lil 模块的脚本:
查看资源元数据
与往常一样,脚本 API 有各种各样的新增内容:
- [系统接口](https://beyondloom.com/decker/decker.html#systeminterface) 现在提供了 `sys\.z` 用于获取本地时区偏移量,以及 `sys\.ops` 用于测量 Lil 字节码解释器执行的工作量。
- [App 接口](https://beyondloom.com/decker/decker.html#appinterface) 新增了 `app\.gridsize`、`app\.penstroke` 和 `app\.penfill`,用于检查和修改 Decker 编辑工具的状态;`app\.kiosk` 用于在展示环境中锁定 Decker;以及 `app\.params` 用于访问提供给 Web\-Decker 的 URL 参数。
- [RText 接口](https://beyondloom.com/decker/decker.html#rtextinterface) 提供了 `rtext\.trim\[\]`,作为富文本表格中新的 `trim` 运算符的更通用版本。
- [Sound 接口](https://beyondloom.com/decker/decker.html#soundinterface) 在通过非整数采样索引访问时对采样进行线性插值,`sound\.scale\[\]` 函数可以按时间压缩、拉伸和反转波形,`read["sound" "samples"]` 重载可以将大型音频文件导入为采样数组。
- [Image 接口](https://beyondloom.com/decker/decker.html#imageinterface) 提供了 `image\.transform["turn"]` 作为将图像旋转 180 度的快捷方式,`image\.outline\[\]` 用于在图像中任何不透明区域的边缘添加边框,`image\.merge\[\]` 现在支持使用 `"^"` 运算符进行 XOR 合成。
- [Danger 接口](https://beyondloom.com/decker/decker.html#thedangerzone) 提供了 `danger\.open\[\]`,用于指示 Decker 打开特定文档,可以通过 URL/路径或[Deck 接口](https://beyondloom.com/decker/decker.html#deckinterface)指定,这使得构建启动器或从多个 deck 拼接出超大型项目成为可能。
- [Array 接口](https://beyondloom.com/decker/decker.html#arrayinterface) 现在支持对 `"f32l"`、`"f32b"`、`"f64l"` 或 `"f64b"` 进行*强制类型转换*,用于处理浮点值,`array\.value` 属性提供了一个便捷的快捷方式,可以将整个数组转换为原始列表或字符串。
## 语言的成长
Decker 的脚本语言 [Lil](http://beyondloom.com/tools/trylil.html) 的演进继续朝向稳定"降温",但仍有一些细化和新增内容,首先是对若干运算符行为的修正:
比较运算符 `<` 和 `>` 在给定一对数值参数时被重载以执行数值比较,在给定一对字符串时进行字典序比较。这非常方便!当给定*混合*类型的值时,这些运算符最初"倾向于"将两个参数都当作字符串来解释。在实践中,这种行为在常见场景中导致了一些极其愚蠢和令人困惑的结果,例如用户将数字存储在字段中,却访问字段的 `.text` 属性(字符串)而不是 `.data` 属性(在本例中应为数值):
```
theField.text # "23"
3 > theField.text # 1
```
`<` 和 `>` 运算符现在改为在任一参数为数值时"倾向于"数值解释,与 `|`(最大值)和 `&`(最小值)运算符的行为一致:
```
3 > "23" # 0
30 > "23" # 1
```
我还修正了 `table` 运算符行为中一个更微妙的缺陷。该运算符会检查其参数的结构,将字典列表和列表列表数据强制转换为 Lil 表值。随着 `nil` 值的引入,调整这种强制转换行为是有帮助的——将列表中的 nil 接受为空列表,将字典列表中的 nil 接受为空字典:
```
table "%j" parse "[[11,22],null,['a','b']]"
# +-----+-----+
# | c0 | c1 |
# +-----+-----+
# | 11 | 22 |
# | nil | nil |
# | "a" | "b" |
# +-----+-----+
table "%j" parse "[{'a':11},null,{'a':22}]"
# +-----+
# | a |
# +-----+
# | 11 |
# | nil |
# | 22 |
# +-----+
```
最后,我对 `raze` 运算符做了一些调整,该运算符负责如同反复应用 `,` 运算符一样归约列表。`raze` 的基础情况最初会将单元素值坍缩为原子值,修订后的行为则保留它们为列表,以获得更好的内部一致性:
```
raze list 23 # 原为 23 现为 (23)
raze 23 # 原为 23 现为 (23)
raze "AB" # 原为 ("A","B") 现为 ("AB")
```
---
Lil 新增了四个一元运算符来简化常见惯用写法:`trim`、`ceil`、`rev` 和 `distinct`。
`trim` 运算符移除字符串的开头和/或结尾的空白字符。它可以对整个列表进行符合(conform)操作,以便清理整列输入:
```
trim " ab c\n" # "ab c"
trim (" a"," b") # ("a","b")
```
`ceil`(向上取整)运算符将数字向上取整,是 `floor` 的对应运算。这也支持符合操作:
```
ceil (0.1,2.5,37.9) # (1,3,38)
```
`rev` 运算符反转字符串、列表或字典的元素顺序;这类似于 K 中的 `|:`:
```
rev "abc" # "cba"
rev (11,22,33) # (33,22,11)
rev "abc"dict"def" # {"d":"a","e":"b","f":"c"}
```
`distinct` 运算符从字符串、列表、字典或表中提取非重复元素;这类似于 K 中的 `?:`:
```
distinct "cabba" # "cab"
distinct (2,1,3,2,1) # (2,1,3)
```
`trim` 运算符在用于裁剪前缀时——如在许多解析器中——避免了不必要的内部字符串复制,而 `distinct` 使用内部哈希集,类似于 `in`。恰当地使用这些新运算符可以对性能产生显著的正面影响。对实际代码的基准测试还揭示了一些让 `while` 循环稍微更高效以及提升字典并集和修改性能的简单方法。
---
[Bits 接口](https://beyondloom.com/decker/decker.html#arrayinterface) 新增了 `.decode\[\]` 和 `.encode\[\]` 操作,分别用于将数字分解为二进制位列表(我们可以用 Lil 的符合算术运算符轻松操作)或将二进制位重新打包为数字。这有助于处理许多以前需要显式循环的常见数据准备任务:
```
bytes:112,112,32,112,168,32,80,80
i:image[8,count bytes]
i.pixels:bits.decode[8 bytes]
i.pixels
# ((0,1,1,1,0,0,0,0),
# (0,1,1,1,0,0,0,0),
# (0,0,1,0,0,0,0,0),
# (0,1,1,1,0,0,0,0),
# (1,0,1,0,1,0,0,0),
# (0,0,1,0,0,0,0,0),
# (0,1,0,1,0,0,0,0),
# (0,1,0,1,0,0,0,0))
bits.encode[8 i.pixels]
# (112,112,32,112,168,32,80,80)
```
另一个从 Lil 中榨取额外性能的工具是新近通用化的 [KeyStore 接口](https://beyondloom.com/decker/decker.html#keystoreinterface)。KeyStore 最初设计为模块序列化持久数据的手段,现在也可以用 `keystore\[\]` 函数自由构造,并作为通用的可变"字典构建器"使用——当不希望用 `dict` 一次性构建完整字典值时非常方便。这种通用化让 Lil 简洁的标准库更具力量!
```
# 一个通用的广度优先搜索例程,
# 使用 KeyStore 追踪状态前驱:
on bfs successors start do
local pred:keystore[]
local todo:list start
while count todo
local here:first todo
todo:1 drop todo
each there in successors[here]
if nil~pred[there]
pred[there]:here
todo:todo,list there
end
end
end
pred
end
```
## Deckerverse
今年 Decker 生态系统中涌现了许多有趣而令人兴奋的发展。
Decker 附带了五个便捷的新示例 deck:
在 [All About Transitions](https://beyondloom.com/decker/transitions.html) 中了解过渡效果。
使用 [Stats](https://beyondloom.com/decker/stats.html) 模块计算有用的统计指标。
使用 [Hershey](https://beyondloom.com/decker/hershey.html) 模块操作和绘制矢量文本。
使用 [Dfxr](https://internet-janitor.itch.io/dfxr) 生成程序化音效。
使用 [Qr](https://beyondloom.com/decker/qr.html) 模块生成二维码。
除了官方的 [Deck\-Month 3](https://itch.io/jam/deck-month-3) 和 [Decker Fantasy Camp 2026](https://itch.io/jam/decker-fantasy-camp-2026) 活动外,Decker 用户还组织了许多其他有趣的活动:
- Millie 的 [Hybrid Decker Zine Jam](https://itch.io/jam/hybrid-decker-zine-jam) 围绕一个模板展开,使得创建可以在网上查看或打印出来折成 8 页小册子的 deck 变得轻而易举。
- [Decker App Jam](https://itch.io/jam/decker-app-jam) 专注于用 Decker 创建工具和实用应用程序。
- Swanchime 的 [Decker VN Jam](https://itch.io/jam/deckervnjam) 关于用 Decker 制作视觉小说。
在我撰写本文时,这些 Jam 活动合计已在 itch\.io 上发布了超过 113 个新 deck。去年我在 itch\.io 上统计了 213 个标记为 [#decker](https://itch.io/games/tag-decker) 的游戏。如今这个数字已增至 353 个,如果算上书籍和漫画等其他类别则有 474 个!让我们来看看人们发布的一些作品吧。
迄今为止最令人愉悦的发布是 Phinxel 的 [Phield Notes](https://ahmwma.itch.io/phield-notes),这是一份*惊艳*的、适合初学者的多媒体指南,教人用 Decker 创作内容。[Ahmwma](https://ahmwwmaaa.neocities.org/) 自从发布 [Riddle of the Temple](https://ahmwma.itch.io/the-riddle-of-the-temple) 以来一直在精心打磨它。任何对 Decker 有哪怕最轻微兴趣的人都应该去看看——它有大量 Decker 能力的演示,每一页都充满了精彩的像素艺术:
[Phinxel](https://ahmwma.itch.io/phield-notes):人见人爱的热心小帮手。
Screwtapello 构建了一个[字体导入器工具](https://screwtapello.itch.io/decker-font-importer),可以适配多种现有的位图字体格式使其兼容 Decker。这是一个用 Decker *为* Decker *构建*工具的绝佳范例:
[字体导入器](https://screwtapello.itch.io/decker-font-importer):导入 `.fzx`、`.uf1`、`.uf2`、`.uf3`、`.yaff` 等字体!
Missooni 发布了许多[便捷的精巧装置](https://itch.io/post/15366665)和[各种小型艺术及日志工具](https://missooni.itch.io/),其中包括可爱的 [minart](https://missooni.itch.io/)——一个专为创建 16x16 图标而设计的绘图工具:
[minart](https://missooni.itch.io/minart):精致的微缩之作。
沿这股*工具*潮流,我还想推荐 Durian 的[一堆 Decker 工具](https://durianbean.itch.io/a-bunch-of-decker-tools),名副其实:一组可以在 Decker 中运行的小型实用程序集合。我喜欢看到用 Decker 构建的实用的个人程序:
[日志小应用](https://durianbean.itch.io/a-bunch-of-decker-tools):日志记录迷你应用。
Millie 自 Decker 最初发布后不久便开始[定期发布 Zine](https://zine.milliesquilly.com/)。如果你想以一种便捷的方式浏览她最近完结的 *EX* 系列,不妨看看 [Zine of Millie EX Compilation](https://micpp.itch.io/zine-of-millie-ex-compilation)!它非常适合搭配你的 [Deck Kiosk](https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/):
[Deck Kiosk](https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/):一台精心手工制作的沉浸式 Decker 设备。
Salty P\. Slug 的 [What 2000s Skate Video Are You?](https://saltedslug.itch.io/what-2000s-skate-video-are-you) 是一个经过精心研究、充满爱心制作的个性测试,充满了原汁原味的 2000 年代滑板文化和图标。感觉老了吗?
相似文章
@Saccc_c: 持续探索 Codex + HyperFrames 的应用边际 今天剪辑的主题是回忆杀:4399之那些我们玩过的热门游戏 我感觉现在很强,已经可以去闲鱼和抖音接商单了 Tips: 这类视频制作时间较长,不是一个小时能做完的
An exploration of using Codex and HyperFrames to create nostalgic gaming videos, noting the potential for commercial work despite long production times.
@wei_wang: https://x.com/wei_wang/status/2057666488530596258
本文详细介绍了如何利用Codex AI助手的CLI、Computer Use和MCP功能,在一天内零代码开发出一个类似NYT Connections的文字游戏网站Daily Word Categories,并分享了工具栈和操作步骤。
LittleJS 现在同时支持 2D 和 3D 了
LittleJS 发布了自推出以来的最大更新,新增完整的 3D 渲染器、内置关卡编辑器、粒子效果库、性能大幅提升,并加入了面向 AI 编码助手的工具包和 Claude Code 插件。
From Zero to Claude Code in 19 Minutes (no code)
本文介绍了如何使用 Claude Code(无需编码知识)通过自然语言构建项目,包括计划模式、持久记忆、MCP 连接器等核心功能,并演示了打字游戏和看板应用的实际构建过程。
@BenjaminDEKR:这简直有点天才
一位开发者分享了一个小游戏:让 LLM 守卫一个保险箱,玩家通过聊天、欺骗或直接破解来套出密码,并可扮演机器人或进行 AI 对 AI 实验,支持 Codex 应用和本地模型。