⚡【整个活】浅浅做个GBA游戏(程序)出来

⚡【整个活】浅浅做个GBA游戏(程序)出来

小猫涂卡 114 2022-11-20

这几天都对GBA(老任的Gameboy)有些好奇了,虽然它是一个比较老的游戏机(感觉对老物有点情怀,做梦也会经常梦见这些)但以前除了看其他小朋友玩以外自己就没接触过了,自己接触更多的还是小霸王。

(话不多说)关于GBA的介绍就不在这说了,反正有点心血来潮了,那就先准备一下吧!

一些准备工作

GBA的处理器是一个32位的ARM处理器,程序跑的还是C语言的程序(听说C++支持不怎么样😥)。要准备的东西也很简单——就一个DevKitAdv就行(里面包含了一个GCC编译器和一个GBA的开发库),但这个我试了下,下载不下来,后面就找人帮忙下载了一个。

为了方便大家,就先把文件放出来给大家了(放到本文底部了)

下载之后,解压放到文件夹里面,就像这样就行了
20221120101122539
另外这个包我还放了一些待会要用到的工具在里面,第一个是kaleid,另外一个是模拟器(注:模拟器只提供64位系统的版本),它们都放在压缩包的tools目录中

建立项目和资源

在解压后的项目新建一个文件夹,建议用英文的名字,然后在文件夹里新建一个main.c的文件来准备写程序。
20221120102247367
接着就是准备图片了,图片不是随随便便找一张就行的,GBA里的图片要求是256色的bmp格式图片(大小最好也不要超过240x160)

我这里用了PS,因为PS中可以通过“编辑>模式>索引颜色”将图片调整到256色,另外在PS调起来也是相当方便的。

先打开PS,新建一个240x160的图像

然后再导入喜欢的图片,用“Ctrl+T”调整到合适的大小(那个小图片是自己的自设,不许盗)
20221120122317939
接着选择“编辑>模式>索引颜色”,将调版选择“局部(可选择)”,颜色为256
20221120122447380
如果是选了“平均”,细节可能不会那么丰富,不过那图片还算简单,问题不大
20221120103045457
然后选择“文件>另存为”,保存BMP文件到刚刚项目文件夹的位置,后面出现“BMP选项”的窗口,默认即可

接着打开tools文件夹里的kaleid工具,选择“File>Open”,打开刚刚的图片
20221120103815307
然后选择“File>Convert and Save”,在下面的对话框中按图片选择选项,然后按“Convert and Save”保存文件
20221120104135335
然后你就得到了一个“h”头文件,其中包含了图片和调色板信息
20221120104312097

编写程序

我这里用的是VSCode,这种写起来比较舒服。由于GBA跑的是C代码,也建议有一点C语言的基础

首先先定义GBA所使用的数据类型,建立一个“data.h”文件

#ifndef GBA_DATA
#define GBA_DATA
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
#endif

#define REG_DISPCNT *(u16*)0x04000000  // 显示寄存器地址
#define VRAM 0x06000000 // 图像缓冲区地址
#define PALETTE 0x5000000 // 调色板地址
#define MODE_4 0x04 // mode4标志
#define BG2_ENABLE 0x0400 // BG_2标志
#define SetMode(Mode) REG_DISPCNT=(Mode) // 设置显示模式的宏定义

接着定义一个“draw”画图函数,建立一个“draw.h”和“draw.c”文件

#include "data.h"

void draw (u16* imagePalette, u16* imageData, u16* devicePalette, u16* deviceData);
#include "draw.h"

void draw (u16* imagePalette, u16* imageData, u16* devicePalette, u16* deviceData) {
    int i, x, y;

    for (i = 0; i < 256; i++) {
        devicePalette[i] = imagePalette[i]; // 写入调色板
    }
    
    for (x = 0; x < 120; x++) {
        for (y = 0; y < 160; y++) {
            deviceData[(y) * 120 + (x)] = imageData[(y) *120 + (x)]; // 写入缓冲区
        }
    }
}

最后在“main.c”完成主程序的编写

#include "data.h"
#include "draw.h"
#include "turka.h" // 导入图像

u16* devicePalette=(u16*)PALETTE; // 设备的调色板区域
u16* deviceVideoBuffer=(u16*)VRAM; // 设备的缓冲区区域

int main () {
    SetMode (MODE_4 | BG2_ENABLE); // mode4屏幕模式,这个已经够用了

    draw ((u16*)turka_pal, (u16*)turka_gfx, devicePalette, deviceVideoBuffer);
    while (1) { ;} // 一直循环
}

最后,项目文件夹看起来就是这样的
20221120122833099

编译

等程序写好后,新建一个“make.bat”用来编译

PATH=E:\Devsoftware\DevKitAdv\bin

gcc -lm -o main.elf main.c draw.c
objcopy -v -O binary main.elf turka.gba

注意:PATH那项请换成你解压文件的路径,我电脑上的解压路径是E:\Devsoftware\DevKitAdv\,所以就是E:\Devsoftware\DevKitAdv\bin

接着就运行“make.bat”
20221120115523680

然后你就得到一个“turka.gba”的文件
20221120115558025

打开来试试

打开模拟器,拖进去试试看吧(看起来蛮不错的)
20221120115723288

顺便让朋友帮忙拷到实机上试试看(虽然是3DS上的mGBA)
FA8118920DB5E2D39CA0DF19C8EE65BE

至此,一个gba的小程序就完成啦,散花~

小后记

参考文章:https://blog.csdn.net/weixin_43837555/article/details/88326567
本次的代码由该文章的源程序进行改编

在gba开发中有一个可以用来处理音频的工具叫wav2gbac,但是下载试试发现只能跑在16位系统上(从说明文件看出来它居然是基于QuickBasic开发的),而且软件可能还缺乏维护,因此压缩包暂时没有提供该工具

相关下载

(提取码:tuka)DevKitAdv