用SGDK开发世嘉MD游戏:调试篇

管理员

用SGDK开发世嘉MD游戏:调试篇


本来想直接讲MD游戏开发的部分,但我还是觉得有必要先把调试这部分讲一下

由于世嘉MD属于上古时代的游戏主机,那时候的开发环境非常非常的恶劣,是我们今天难以想象的恶劣,虽然SGDK已经做的非常人性化,但还是难以跟现代的游戏引擎(比如unity、unreal、godot cocos还是算了吧,这玩意儿纯属一坨大便)相对比,在现代游戏引擎中调试是比较直观的,且不说编辑器中预览了,就是打印输出也是很舒服的,在 SGDK 中并不能打印输出,是根本没有 printf 这样的功能的,需要借助 GensKMod 这款模拟器才能打印输出,虽然可以用【在屏幕上绘制文字】的方式打印输出调试信息,但还是很难受,世嘉MD屏幕那么小,显示不了几行字,一旦需要查看大量信息就显得很笨拙,因此,GensKMod 模拟器可以说是开发MD游戏必备,要不然我不能保证你会不会疯掉,我反正是会疯掉。所谓工欲善其事必先利其器,如果没有趁手的调试工具,写起代码来未免有点盲人摸象的意思,到底代码运行起来是什么样的咱心里也没有数,即使有点数也并没有很踏实。所以我就把调试这篇文章放到前面讲了。

GensKmod_v073 下载

用 GensKMod 调试代码并不需要额外的配置,编译出游戏rom之后直接用模拟器打开就可以查看调试信息了,至于怎么编译游戏rom,上一篇有讲过,这里就不再赘述了。

这一篇我简单讲一下怎么在 GensKMod 模拟器中打印输出 Hello World。

代码如下:

#include <genesis.h>

int main()
{
    //这句就是在 GensKMod 模拟器中打印输出,就一句代码,很简单
    KLog("Hello World");

    while (TRUE)
    {
        VDP_waitVSync();
    }

    return 0;
}

KLog开头的函数还有一些其他的,自己可以尝试着写一写,看看都是些什么功能。

以上只是一句 Hello World,只是一个字符串,要是输出整型或者浮点数类型怎么办呢?也不难,看代码:

#include <genesis.h>

// 这个数是314,写成二进制的形式
int32_t number = 0b000100111010;

int main()
{
    KLog("Hello World");

    // 除以100,也就是3.14,这里输出是3.13,精度丢失了一点,影响不大
    // 世嘉MD是没有浮点数这个概念的,不像现在直接可以写float、double这些类型,
    // 取而代之的是fixed类型,就是定点数,用定点数表示小数,运算速度更快,效率更高
    fix32 test = intToFix32(number) / 100;

    // 这里是SGDK内置的32位定点数除法函数,跟上面直接除以100得出的结果是一样的,
    // 不过我还是推荐用内置的这个除法运算,内置的应该是效率更高
    fix32 pi = fix32Div(intToFix32(number), intToFix32(100));

    KLog_F1("test = ", test);
    KLog_F1("pi = ", pi);

    while (TRUE)
    {
        VDP_waitVSync();
    }

    return 0;
}

代码写完了,编译游戏rom。

打开 GensKMod 模拟器,在菜单栏找到Option,里面有一项是 Debug,这是设置 Debug 的地方,找到 Active Development Features 并打勾,点 OK 按钮确认修改并关闭设置界面。

打开 rom,在菜单栏找到CPU,CPU菜单下有一个Debug选项,Debug里边有一个Messages,点开就是了,KLog 函数打印输出的信息都会显示在这里,就好像C语言中的 Printf,C# 中的 Console.WriteLine。