最近高产似那啥,其实就是能玩的东西太多,玩不过来了,虽然话是这么说,但是玩过了还是要写点啥的,不然怎么证明我玩了[捂脸]。
这篇是老任 Switch 的开发入门,甚至连入门都算不上,因为没有 SDK,目前所有的 API 都是一群大佬反编译得到的,属于摸着石头过河的连石头都没摸到的阶段。
废话不多说,先来搭开发环境,一堆命令就完事了(仅限 mac,其他系统暂且无视)
$ brew install python3 cmake llvm squashfs autoconf pkgconfig sdl2 qt5
$ pip3 install pyelftools lz4
$ curl "https://github.com/reswitched/libtransistor/releases/download/v2.1.1/libtransistor_v2.1.1.tar.gz" > libtransistor_v2.1.1.tar.gz
$ sudo mkdir -p /opt/libtransistor
$ sudo chmod -R 777 /opt/libtransistor
$ sudo tar -C /opt/libtransistor -xvzf libtransistor_v2.1.1.tar.gz
$ echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile
$ echo 'LIBTRANSISTOR_HOME=/opt/libtransistor' >> ~/.bash_profile
$ . ~/.bash_profile
$ git clone https://github.com/reswitched/sdl-libtransistor.git
$ cd sdl-libtransistor
$ ./autogen.sh
$ make -f switch.mk
完成后就可以折腾代码了,已经有大佬给写好了 Demo(Github),先用这个来进行编译:
$ git clone https://github.com/vgmoose/sdl-hello-world.git
$ cd sdl-hello-world/
$ make
完成后即可看到一个名为 hello.nro
的文件,这就是在 Switch 上的可执行文件了。
接下去就是要运行了,按 Github 上大佬的说法,必须使用自制系统的 Switch,然后将 nro 放到 SD 卡根目录下,然而我却舍不得破解自己的 Switch(废话,被 ban 机了可就啥都没得玩了)。所以比较好的选择是使用模拟器,所幸现在 Switch 模拟器也已经有了。
接下来就自己编译一个模拟器吧, 同样的执行一堆命令,并不麻烦:
$ git clone --recursive https://github.com/yuzu-emu/yuzu
$ cd yuzu
$ git submodule update --init --recursive
$ export Qt5_DIR=/usr/local/opt/qt5
$ export MACOSX_DEPLOYMENT_TARGET=10.12
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make
完成后即可在 build/bin
下得到一个 yuzu.app
,可以直接双击执行之。
用模拟器加载 nro 文件是一个很常规的操作了,从菜单里执行 File | Load File
然后选择 hello.nro
即可。
#include "draw.h"
int main() {
Graphics* g = init();
background(g, 0, 0, 0);
drawColorString(g, 2, 1, "Hello Switch!", 255, 255, 255);
sleep(10);
deinit(g);
return 0;
}
需要注意的是,在模拟器下,背景默认颜色是红色,而且颜色的 RGB 值有偏移,这对于在模拟器下想尝试设置颜色带来非常巨大的麻烦,不过也是没有办法的事情了[汗]。
一些 API 说明
就 sdl-hello-world
下的 Demo 程序而言,提供的 draw.h
含有以下函数,真的是非常的初级,完全不到可用的程度,只能拿来写 Hello World。
函数原型 | 参数 | 说明 |
---|---|---|
Graphics* init(); | 初始化绘图窗口 | |
void deinit(struct Graphics* g); | 销毁绘图窗口 | |
void update(struct Graphics* g); | 刷新绘图窗口 | |
void sleep(int s); | 延迟一定的时间(单位: 秒) | |
void background(struct Graphics* gr, int r, int g, int b); | RGB | 设置背景颜色的 RGB 值 |
void putAPixel(struct Graphics* gr, int x, int y, int r, int g, int b); | XY坐标,RGB | 画一个点 |
void drawString(struct Graphics* gr, char* string, int xi, int yi); | 字符串,XY坐标 | 画一个字符串 |
void drawColorString(struct Graphics* gr, int xi, int yi, char * string, int r, int g, int b); | XY坐标,字符串,RGB | 画一个带颜色的字符串 |
总算,到现在为止,Hello World 还是没有让我们失望,借用一位超级大 boss 的话来结束这篇吧[捂脸]
文中参考的内容列表: