【GBA開発】ButanoとC++でGBAのゲーム開発に挑戦してみた話 #1

この記事は[本郷学園マイコン部 Advent Calender 2023](https://qiita.com/advent-calendar/2023/hongomcc) 17日目の記事です。

お久しぶりです。UHAsikakutouです。
98エミュの使い方を載せてからはや数年、完璧にQiita投稿へのモチベーションが無くなっていました...
今回からは、皆さんおなじみ**ゲームボーイ アドバンス**のゲームを初心者が0から作っていく話を書いていきたいと思います。よろしくお付き合いください。
今回は**環境構築**からやっていきたいと思います。(本質とは関係ないのにミスすると一貫の終わり)
# 動機

- GBAのゲーム作ってみたい！！
- C++書けるようになりたい！

です()
AIに淘汰されないﾂﾖﾂﾖエンジニアになるためには最低限の低レイヤ技術は必須かな〜という思惑もあります。
# 筆者のスペック

ご参考までに。
## PC環境

|  | メイン機 | 持ち運びノート|
|:-:|:-:|:-:|
| 型番 | (自作) |MacBook Pro <br>(13-inch,M1)|
| CPU |Core i7-13700K|Apple M1|
| GPU |RTX 3060 (12GB)|Apple M1 (8コア)|
| RAM | 64GB |16GB|
|OS|Windows 11 Pro|macOS Sonoma|

## プログラミングスキル
- Python,Ruby,JSなど比較的高級な言語を「**完全に理解した**」(一通り触れるだけ)
- CやC++はほぼ初心
- メモリ管理？アセンブリ？ﾅﾆｿﾚｵｲｼｲﾉ (勉強中です)

# ライブラリの選定
では開発の話から入っていこうと思います。
GBA開発を思い立った私は、早速Google先生に「GBAのいいライブラリない？」とばかり聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097267/efc14ca1-0fdb-a2c5-1766-6e8bd1e7c7a6.png)
Wow.
なにやら良さげなものが。

https://github.com/GValiente/butano

> ## Butano
>
> Butano は、Game Boy Advance 用のモダンな C++ 高レベルエンジンです。
> ## 機能
>
> * わずか 1 行の C++ コードで、スプライト、背景、テキスト、ラスタエフェクトなどを作成して表示できます
> * [ETL](https://www.etlcpp.com/) をベースにしたヒープ割り当てや例外を使用しないカスタム標準ライブラリを採用しています
> * 独自の資産を 簡単に インポートして使用できます
> * アサート、エミュレータロギング、コードプロファイリングなど、複数の開発ツールを提供しています
> * 共有所有権や RAII など、モダンな C++ の概念に基づいています
> * 詳細な ドキュメント が用意されています
> * エンジンのほとんどの側面を網羅した複数の 例 が用意されています
> * このプロジェクトには、2 つの完全なゲーム (Butano Fighter と Varooom 3D) のソースコードとアセットが含まれています
>
>Google Bardによる翻訳

最終コミットは執筆時点で12h前。コミュニティは活発なようです。

https://gvaliente.github.io/butano/

ドキュメントも用意されています。

というわけでこれを試してみることにしました。

早速環境構築していくことにします。

# 環境構築

https://gvaliente.github.io/butano/getting_started.html

環境構築に関してはこちらのページに書かれています。
早速これに沿って進めていくとしましょう。

> Butano is built on top of the devkitARM toolchain, so it supports Windows, macOS and Unix-like platforms.
> ButanoはdevkitARMツールチェーンの上に構築されているため、Windows、macOS、Unix系の環境がサポートされています。
>
>Deeplによる翻訳


**devkitARMとは？**
devkitProは、GBAやNintendo DS、PlayStation Portableなどのゲーム機で実行可能なソフト開発のためのツール群です。
中でもdevkitARMはGCCベースの、DS/DSi/GBA用のクロスコンパイラとなっています。
本来であればdevkitARMさえあればゲームを作ることはできるのですが、Butanoはさらにそれを簡単にしてくれるようです。(オイ低レイヤどこいった)

## 用意するもの
- GBAのエミュレータ
- DevKitARM
- Python
- お好きなエディタ

## GBAエミュレータ
まずは、ビルドしたGBAのゲームを手軽に実行できる環境が必要です。
そのためにエミュレータを導入します。

私はWindowsでは[mGBA](https://mgba.io)、Macでは[Visual Boy Advance](https://visualboyadvance.org/about/)を元から使っていたのでそのまま使用しました。
RetroArchを使用している方はGBAのコアを使用されると良いと思います。

## devkitARM
### Windows

https://github.com/devkitPro/installer/releases

こちらからインストーラを落としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097267/c2c11120-a0c4-a83e-61cd-179c31b52d02.png)
https://gvaliente.github.io/butano/devkitpro.png

インストール時は`GBA Development`を選択します。(他に開発したいものがあれば合わせてどうぞ)
さらに何をインストールするか尋ねられた場合は、`gba-dev`内の全てのものを選択してください。

### macOS

https://github.com/devkitPro/pacman/releases

devkitPro用のパッケージマネージャである(本来はArch Linux用ですが...)Pacmanをインストールし、そこからGBAの開発コンポーネントをインストールします。

ダウンロードした.pkgファイルを実行します。
インストール先は`/opt/devkitpro/pacman/bin`です。パスを通しておいてください。

インストールができたら、

```bash:Terminal
$ sudo pacman -S gba-dev
```
を実行してください。

### Linux

同じくpacmanをインストールします。
環境がないためコマンドを[ここ](https://github.com/devkitPro/pacman/releases)より転記します。

```bash:Terminal
$ wget https://apt.devkitpro.org/install-devkitpro-pacman
$ chmod +x ./install-devkitpro-pacman
$ sudo ./install-devkitpro-pacman
$ sudo pacman -S gba-dev
```
:::note warn
This should also work on WSL but a symlink may need to be created first.
これはWSLでも動作するはずですが、最初にシンボリックリンクを作成する必要があるかもしれません。
```bash:Terminal
$ sudo ln -s /proc/self/mounts /etc/mtab
```
(Deeplによる翻訳)
:::

## Python

Butanoの動作にはPythonが必要です。
ググればインストール方法は大量に出てくるので省略します。
バージョンは古いかもしれませんがmacOSやLinuxの多くでは初期状態で入っています。

## お好きなエディタ
自分の気分がアガるお好きなエディタでどうぞ。
初めての方は[VSCode](https://code.visualstudio.com)が一番無難かと。
`エディタ名 c++` などでググればC++用の設定方法などがわかると思います。

## Butanoを入れよう
用意は終わりましたので、Butanoを入れていきましょう。

https://github.com/GValiente/butano

Gitをお持ちの方はClone、
そうでない方は[こちら](https://github.com/GValiente/butano/releases)から最新のZipファイルをダウンロードして展開してください。

ただこのリポジトリに全ての例が入っていますので、フォルダ内でビルドしたり改変したりしてみたい場合はCloneせずにZipでダウンロードした方が安全かもしれません。

これで、準備は完了です。

## 動作確認
Butanoのインストール先に行きます。
`Example`フォルダ内にたくさんのサンプル・作例が入っていますので、一つ動かしてみます。
ここでは、文字を出すサンプルである`text`をビルドして実行します。
皆さんはお好みで好きなものをお選びください。(フォルダ以外は変わらないはずです)

```bash:Terminal
$ make -j8
```
コマンド`make`は、`Makefile`というファイルの情報を使ってC/C++のソフトをビルドするものです。
`-j(数字)`は、ビルドに使用するCPUのコア数です。自分のPCの環境と相談して調整してください。

すると、フォルダ内に

- text.gba
- text.elf

の2つのファイルが新たにできると思います。
早速`.gba`のファイルをエミュレータで開いてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097267/ddf7c458-92df-9aea-a5bc-e1f2f8a914c1.png)

この画面が出ていれば成功です！
お疲れ様でした！！

### エラーが出たら

**pythonがないぞ！！と言われたら**

OSや環境によってはPythonのコマンドが`Python`ではなく`Python3`なことがあります。確認した上で、
`Python3`な場合は書き換えてください。

```diff:Makefile
(略)
  LIBBUTANO   :=  ../../butano
- PYTHON      :=  python
+ PYTHON      :=  python3
  SOURCES     :=  src ../../common/src
(略)
```

# あとがき
執筆時点では海外ニキの素晴らしい動画に出会いその方のサンプルを改変しながら色々といじってみています。
書こうと思えばもっと書けるのですが、いかんせんAdvent Calenderに間に合いそうにないというのと、少し長くなりすぎたのと...で、今回の記事では環境構築までになってしまいました。
冬休みに入ったので、随時次の記事も投稿していければと思っています。

それでは皆さん、良きGBAライフを！

次回は、[@scratch221171](https://qiita.com/scratch221171)さんのUnityで機械学習ネタです。