needlestack/gmc64

GitHub: needlestack/gmc64

gmc64 是经典 Commodore 64 GameMaker 的 JavaScript 浏览器重制版,让用户在现代浏览器中以现代化交互方式创作 C64 风格游戏并与原始软盘镜像双向兼容。

Stars: 8 | Forks: 0

# gmc64 gmc64 是 Garry Kitchen 面向 Commodore 64 的 GameMaker 的 JavaScript 重新实现。本项目记录了其图形与声音格式、虚拟机、指令集和运行时行为,并包含一个可处理原始 GameMaker 项目的基于浏览器的版本。

Intro Demo

Sprite Maker

Scene Maker

Sound Maker

Music Maker

Program Editor
## 如果你曾使用过 GameMaker 你可能还记得逐像素绘制 sprite 动画、绘制背景、编写小游戏和 demo、调整 SID 音效以及创作音乐的乐趣。 如果你曾尝试在 C64 模拟器上重温那份乐趣,你可能会发现,原版基于摇杆的 UI 在今天看来实在难以接受,而且缓慢的磁盘操作也让人非常头疼。 gmc64 解决了这个问题。它是完全现代化的 GameMaker 的 JavaScript 重制版,具备现代的便利性:你可以使用鼠标或触控板,即时预览、加载和保存文件,以及复制、粘贴、撤销等。此外,还支持导入和导出 GIF、PNG 和 MIDI 文件。 它不是一款模拟器,而是一次重制,扫清了所有的绊脚石。 ## 如果你保留了你的原版作品 你手头还有保存在软盘上的原版作品吗?gmc64 可以读取 `.d64` 软盘镜像以及所有的 GameMaker 文件格式。只需拖放软盘或使用内置的文件浏览器即可。 接着,你可以打开编辑器、添加 sprite、修改音乐,并将其重新保存回软盘镜像。你甚至可以将你的作品导出为一个独立的 HTML 文件,并发布到网络上。 gmc64 也能将文件保存回 `.d64` 镜像,你甚至可以将其重新导入到原版的 GameMaker 中。 ## 如果你是 GameMaker 的新手 GameMaker 是由 Garry Kitchen 开发、并于 1985 年由 Activision 发行的一款面向 Commodore 64 的游戏创作工具。它允许用户构建真正可运行的 C64 游戏,而无需学习汇编语言,也无需手动编写图形和声音代码。 作为早期的图形化 IDE,你可以通过它绘制 sprite 和背景、创作音乐、录制音效,并从一系列简单的指令中编写游戏逻辑。 ``` sprite 1 is player sprite 1 x position = 160 sprite 1 y position = 100 if joystick 1 is left then sprite 1 direction = left endif ``` 许多后来成为游戏开发者的人都是从这里起步的。在现代社会,它很大程度上已经难以访问;即便通过模拟器,其可用性也受到了原始 C64 局限性的严重影响。 gmc64 将它带回来了。相同的 sprite、相同的指令、相同的声音,一切都能在你的浏览器中瞬间呈现。 ## 双向兼容性 gmc64 不仅能打开旧文件。它还实现了相同的格式:`/PRG`、`/SPR`、`/PIC`、`/SND` 和 `/SNG` —— 并且它们在两个方向上都能完美转换。 在这里构建的游戏可以保存为真实的软盘镜像,并能在运行原版 1985 GameMaker 软盘的实际 Commodore 64 上加载。在该硬件上制作的任何内容都能在此处直接加载,无需转换。新作品可以发布到 1541 软盘上。旧作品也可以发布到网络上。 ## 快速开始 点击本页面顶部的任意图片链接即可开始体验。 然后: - **尝试 demo** - `disks/gmc64-demo.d64` 随本项目一同发布,包含了可运行的程序以及可编辑的 sprite、场景、声音和曲目 - **从零开始** — 创作属于你自己的 sprite、场景、声音和音乐 - **将 `.d64` 拖放到任意 gmc64 工具中** - editor、sprite-maker、scene-maker、sound-maker 和 music-maker 都会弹出一个文件选择器。 - **托管 `.d64`** - 你也可以指向在线的 `d64`:`editor.html?disk=https://your-host/game.d64` 会打开相同的文件选择器 当你的游戏准备就绪后,点击 **Export Game** 即可获取包含你作品的单一 HTML 文件。 ## 分享你的作品 每个编辑器都接受 URL 参数,因此你可以向他人提供指向特定程序的直接链接,或者将播放器嵌入到你正在开发的页面中。并且,每个编辑器都支持将 `.d64` 拖放到其窗口中 —— 文件选择器会自动过滤并显示该工具对应的文件类型(例如 editor 中是 `.PRG`,sprite-maker 中是 `.SPR` 等)。 ### Player (`play.html`) — 无界面干扰,对 iframe 友好 | 参数 | 用途 | |-------|---------| | `disk` | `.d64` 的 URL,或使用魔术值 `demo` 来加载自带的 demo 软盘 | | `file` | 磁盘上的程序名称(不区分大小写) | | `nocredit=1` | 隐藏角落处的 `gmc64.com` 链接 | | `poster_seconds` | 为播放按钮背后的预览画面模拟游戏的秒数。默认为 `2`,最大为 `10`,设为 `0` 则完全跳过预览画面。允许使用小数。 | 示例 — 直接链接: ``` https://gmc64.com/play.html?disk=demo&file=aliens/prg&nocredit=1 ``` ### Editor (`editor.html`) — 加载到编辑器中,可选播放 | 参数 | 用途 | |-------|---------| | `disk` | 同上 | | `file` | 同上 | | `play=1` | 页面打开时显示带有预览画面的播放按钮遮罩层。访客点击播放以运行,点击停止按钮则进入编辑器。如果没有此标志,文件将直接打开进行编辑。 | | `poster_seconds` | 同上;仅在设置了 `play=1` 时有意义 | | `play_demo=1` | 别名 — 等同于展开为 `disk=demo&file=gmc64i/prg&play=1&poster_seconds=8.5` | 示例 — 向他人发送一个可运行的链接,同时允许他们进入编辑器查看代码: ``` https://gmc64.com/editor.html?disk=https://your-host.com/game.d64&file=GAME/PRG&play=1 ``` 其他编辑器(`sprite-maker.html`、`scene-maker.html`、`sound-maker.html`、`music-maker.html`)也接受 `disk` 和 `file` 参数,可直接深度链接到特定的素材进行编辑。 ### Iframe 嵌入 有两种方式可以获得可嵌入的游戏,具体取决于你打算如何托管。 **选项 A — 独立的 HTML。** 使用编辑器中 **file** 下的 **Export Game** 按钮。它会下载一个包含你的程序、软盘镜像和运行时的单一 HTML 文件。你可以将其托管在任何地方(GitHub Pages、Netlify、S3 或你自己的服务器),然后进行嵌入。导出对话框还会为你生成 iframe 代码片段 —— 只需粘贴你要托管该文件的 URL 即可: ``` ``` **选项 B — `play.html` + 托管的 `.d64`。** 跳过导出。如果你的软盘镜像已经拥有公开 URL,直接让 `play.html` 指向它即可: ``` ``` 注意:disk=demo 是一种特殊情况,会从自带的 demo 软盘中加载。 **跨域软盘:** 对于选项 B,如果你的 `.d64` 与托管 `play.html` 的页面不在同一个域,那么该源需要允许跨域获取 (CORS)。选项 A 则完全避免了这个问题 —— 因为软盘数据就在 HTML 内部。 ## 包含内容 | 文件 | 编辑内容 | |------|---------------| | `editor.html` | 程序指令 + 运行时 + 素材分配 | | `sprite-maker.html` | Sprites(支持多色、多帧、多部件) | | `scene-maker.html` | 背景(160×200 的 4 索引色场景) | | `sound-maker.html` | 音效(SID 风格) | | `music-maker.html` | 曲目(3 通道、乐谱风格的五线谱编辑器) | 所有五个编辑器都对同一个浏览器内的 `.d64` 镜像进行读写,因此你的 sprite 会如同在 C64 上一样,顺畅地流转到场景和程序中。 ## 依赖项 **运行和编辑:无。** 它们是纯静态的 HTML 和 JavaScript。只需在浏览器中打开这些文件即可使用。它们也可以通过 `file://` 在本地运行。 **重新构建独立包:** 需要 Node.js。仅使用内置功能,不需要执行 `npm install`。在编辑了 `play.html` 或任何它从 `js/` 加载的文件后,请运行: ``` node tools/bundle-standalone.js ``` 这会重新生成 `js/standalone-source.js` —— 这是将 `play.html` 及其引用的每一个 `