用SGDK开发世嘉MD游戏:入门篇

管理员

用SGDK开发世嘉MD游戏:入门篇


0. github上的wiki教程(推荐英语好的看,英语不好的就看我写的教程吧)

https://github.com/Stephane-D/SGDK/wiki


1. 【安装SGDK(仅针对windows系统)】

  • 安装 java 8 或更高版本的 jre

    如果已经安装了 jdk 就不需要再单独安装 jre 了,jdk 包含 jre。

    jdk 是开发 java 用的,jre 是运行 java 用的,咱们这里只需要运行 java,并不需要开发 java,因此 jre 足够使用。这里我只给出了 64位 jre 下载地址,想要 jdk 的可以自己到 java 官网下载。

    64位 jre 下载地址:http://icy.bioimageanalysis.org/upload/jre-8u281-windows-x64.exe

  • 下载SGDK

    SGDK_v1.80.zip

    下载完了把 zip 解压到自己喜欢的位置,可以直接解压到 C盘 根目录,也可以解压到 D盘 根目录,我的位置是 E:DevelopMD

  • 编译测试

    win+r 打开运行窗口,输入 cmd 打开终端,运行以下代码进行编译测试:

    SGDK_PATHbinmake -f SGDK_PATHmakelib.gen

    【SGDK_PATH】指的是刚才解压的SGDK压缩包的位置。
    编译过程中终端窗口会嗖嗖嗖打印出很多很多信息,如果没有出现 Error 这个单词就说明安装成功了,如果有 Error 单词出现,一般会告诉你错误信息,作为一个开发者要学会查看报错信息,我刚才试的时候就出现如下信息了:

    java -jar E:/Develop/MD/SGDK/bin/rescomp.jar E:/Develop/MD/SGDK/res/libres.res E:/Develop/MD/SGDK/res/libres.rs -dep E:/Develop/MD/SGDK/res/libres.o
    E:/Develop/MD/SGDK/bin/sh.exe: java: command not found
    make: *** [E:/Develop/MD/SGDK/res/libres.rs] Error 127

    大体意思就是 java 命令没找到,因为我是在 vscode 中编译的,我刚刚安装了 java,vscode 中的终端还没识别到我刚安装的 java,如果我关闭 vscode 再重新打开 vscode 就不会出现这个报错了,大家用的 win+r 打开的 cmd 终端应该不会出现报错的。

  • 小技巧(把SGDK设置成全局环境变量):

    如果觉得输入完整的 SGDK_PATH 目录太麻烦(比如 D:FolderAFolderBFolderCSGDK),可以把 SGDK 目录配置成全局环境变量,具体做法如下(以 win10 系统为例):
    依次找到:设置 -> 系统 -> 关于 -> 高级系统设置 -> 环境变量
    在系统变量中新建一个系统变量,变量名随便取,我就叫它 SGDK 了,变量值就是你的 SGDK 根目录

    找到系统变量中的 Path 这一项,点右下角的编辑按钮

    然后把 %SGDK% 填进去,两边的%不要忘记,然后一路点确定确定确定就行了,以后就不需要输入完整的 SGDK_PATH路径了,直接以 %SGDK%代替就ok了,以后编译的时候会经常用到的。


2. 【SGDK的用法】

SGDK编译项目用的是自己的makefile,为了项目能被makefile正确识别,需要按以下方式组织项目的文件夹结构(这是必须要遵守的规范):

项目根目录

  • src
    src目录(存放源代码文件,子文件夹最多支持2级深度,例如:src/engine/enemy/*)

  • inc
    inc目录(存放头文件)

  • res
    res目录(存放资源文件)

  • out
    out目录(编译输出游戏rom的目录,这个文件夹会自动创建,不需要自己建,自己建也是可以的)

文件类型说明

  • 源代码文件可以是 .c(C语言源文件)、.s(68k汇编源文件)或 .s80(z80汇编源文件)
  • 头文件可以是 .h(C语言头文件)或者 .inc(汇编头文件)
  • 主资源文件应为 .res(由 rescomp 工具编译的资源定义文件,详请参阅 SGDK_PATH/bin/rescomp.txt 文件)
  • 其他资源文件可以位于任何位置(虽然但是,还是推荐都放到 res 目录中),你需要在 .res 文件中正确引用其他资源文件,java 会帮助我们编译成SGDK可使用的资源。
    • .bmp 图像文件(仅限索引颜色格式)
    • .png 图像文件(仅限索引颜色格式)
    • .vgm vgm音乐文件(仅限megadrive专用的vgm)
    • .xgm xgm音乐文件
    • .wav wav音频文件(用来做音效)
    • .bin 二进制数据文件
    • .c C语言源文件
    • .s 68k汇编源文件

makefile支持3种不同的编译模式

  • release 正式发布的时候用这个模式,这个模式会对代码做一些优化,这是默认模式。
  • debug Gens KMod 模拟器用来调试程序用的模式,详见 GensKMod模拟器调试
  • asm 用来生成汇编列表

要编译项目,你需要从项目文件夹中使用以下命令

SGDK_PATHbinmake -f SGDK_PATHmakefile.gen

但是咱们已经把SGDK设置成全局环境变量了,那么命令就变成如下所示了:

%SGDK%binmake -f %SGDK%makefile.gen

注意 命令最后其实是有一个选项的,就是前面说过的release、debug、asm这些,如果什么都不加默认就是release版本,如果想编译调试版,后面就要加上debug:

%SGDK%binmake -f %SGDK%makefile.gen debug

如果一切正常,在 out 文件夹中应该能看到一个 rom.bin 文件,你可以用MD模拟器加载rom文件运行游戏,或者如果你有烧录卡可以烧录到卡带里实机运行。


3. 【制作第一个MD游戏 - Hello World (以 vscode 为例)】

环境是不是配好了,最好的办法就是亲自写一个hello world,这是程序员圈子里亘古不变的真理,开发世嘉MD游戏也是一样的。

  • 安装C/C++扩展

SGDK用的是C语言作为开发语言,也能用汇编语言,但由于我太菜不懂汇编,也就只能用C语言班门弄斧一下了。
vscode 安装 C/C++ 扩展很简单,打开扩展选项卡,直接搜 C/C++ 就能找到,然后安装就完了。

  • 新建工程

然后在电脑里随便一个位置新建一个空文件夹,我这里就直接在桌面上建了,文件夹名字就叫 helloworld 吧,然后在 helloworld 文件夹里面新建 src、inc、res 三个空文件夹,也就是前面提到过的工程目录结构的规范。

  • 编写代码

在工程根目录(也就是 helloworld 文件夹)下鼠标右键,选择【通过 code 打开】,在 src 目录中新建 main.c 源代码文件,写上以下代码:

#include <genesis.h>

int main()
{
    while (true)
    {
    }
    return 0;
}

这几行代码很简单,相信已经成为大家的本能了,唯一要说明的就是

include <genesis.h>

这个头文件是 SGDK 中的头文件,是开发 MD 游戏必须要用到的,genesis 是什么意思呢?是世嘉 MD 美版的名字,美版 MD 就叫 Genesis,有个 MD 模拟器叫 Gens,就是用的美版 MD 的名字。记住这个名字,以后只要写 MD 游戏,首先就要 include 这个头文件。

如上图所示,可能头文件会报错

不用怕,把鼠标放到红线上会弹出一个错误信息框,下面有一个【快速修复】选项,点快速修复

选择【编辑 "includePath" 设置】,找到【包含路径】这一项,
把下面两行路径都加上,下面的 SGDK 就是前面提到过的全局环境变量:

${SGDK}/inc/**
${SGDK}/res/**

弄好之后可能又报错了,while(true) 这里的 true 错了,说是【未定义标识符 "true" 】

之所以会报错是因为我电脑里没安装任何的C语言编译器,咱们开发 MD 游戏暂时也用不到别的C语言编译器,可以把 true 改成 1,非 0 即真嘛~
还有一个办法,这时候咱们已经有代码提示了,把 true 删了,重新输入 true,会提示有一个大写的 TRUE 可以用,咱们可以直接用 SGDK 本身定义好的 TRUE。
while 循环里面的部分就相当于 unity 引擎中的 Update 函数,每一帧都会执行,但是咱们需要在循环里面加一个中断,不然画面刷新可能会出问题,代码如下:

VDP_waitVInt();

然后 while 上面的部分就相当于 unity 引擎中的 Start 函数,在运行游戏的时候执行一次,那么我们就可以在这里加上一句绘制文字的代码:

VDP_drawText("Hello World !", 12, 12);

这行代码看名字就知道是绘制文字的,后面的两个参数都是12,也就是绘制文字的坐标,但这个坐标不是指的像素,而是 tile 格子,一个 tile 格子是 8x8 像素。全部代码如下图所示:

  • 编译工程

前面已经提到过编译命令了,只是还没使用过,现在咱们要在 vscode 中使用这条编译命令,按 Ctrl+J 调出终端面板,再次输入下面的命令:

%SGDK%/bin/make -f %SGDK%/makefile.gen

按回车,见证奇迹。
一切顺利的话,会在根目录下生成一个 out 文件夹,里面有很多文件,其中有一个 rom.bin 就是编译出来的游戏 rom 了。

  • 用模拟器运行 Hello World

我给大家推荐两个模拟器,一个是 Kega Fusion,另一个是 Gens Kmod,fusion 是我平常玩 MD 游戏用的,非常稳定,自带 N 多的滤镜,不会丢帧,kmod 是开发调试用的,调试功能非常强大。

Kega Fusion 3.64

Gens Kmod 073

用模拟器打开游戏rom这种事我就不在这里说了,直接放运行截图: