次郎の貝塚

技術ブログのような何か

About | Profile | Diary | Application | Source Code | RSS

投稿日時 2026-04-24 18:19:57 +0900 | カテゴリー 技術

前の記事 生産性という麻薬 | 次の記事

Godot でソート可視化ツールを作った

sort_visualizer という GUI ツールを Godot で作ってみた。

sort_visualizer のデモ GIF

なぜ作ったか

最近ゲームエンジンの Godot を使ってちょっとしたゲームを作ろうとしているのだが、 いきなりゲームを作るのは挫折すると思ったので、練習目的でツールを作った。

いかんせんゲームを作るのは非常に時間がかかる。

個人でゲーム作るときに一番苦戦するのは素材を用意すること。 特に今僕が作ろうとしてる簡単なサウンドノベルゲームでは、イラストを用意する部分に時間がかかっている。 自分でイラストを用意しようとしているんだが、枚数が多いので作るのが大変。

一応、サウンドノベルのコアになる文章送りや画像表示を JSON のイベントデータで渡して表示できるスクリプトは実装できた。 区切りが付いたので画像の準備をしているという感じ。 画像はドット絵にするつもりだが、ドット絵なんて描いたことないので、そのへんも探りながらやっている。

職業上、プログラムを書くのは得意なのでゲームロジックの実装は割となんとかなっても、素材の準備がやはり鬼門。

実装

初版の v0.1.0 をリリースするまでにかかった時間は 2 時間。 UI 部分は自分でレイアウトを決めて自分で実装。 ソートアルゴリズム部分はほぼ Cursor に丸投げで実装した。

仕事で AI ツールを使うようになったので、 プライベートでもある程度 AI ツール使い慣れたほうがいいだろう、と思い Cursor に課金して使っている。

アルゴリズムの妥当性は割とどうでも良くて、Godot でまともに動くツールを完成させることが目的。 なので、Cursor が書いたソートのコードはほとんど読んでない。

それよりは、UI 制御周りや実際の振る舞いを中心にチェックして実装した。

今は v0.5.0 までバージョンが改修した。 ここまでで 10 時間弱かかり、一通り満足がいく状態になった。 あらかた実装したかったソートは実装して、気になってたバグも潰しきったので、一区切りついた。

正直 v0.1.0 で終わらせても良かったんだが、 やはり動く状態になると納得いくまで作りたくなるもので。 当初はやる予定になかった音を鳴らす機能やアニメーション機能まで気付いたら実装していた。

Cursor 便利すぎる

こういう適当に作っていいプログラムについては Cursor が本当に便利すぎる。 バグっても特に困らないって領域ではフル活用したくなる。 ゲーム製作でも、多少バグって問題ないコードは Cursor でパパっと実装したい気持ちになった。

テスト周り

ユニットテストコードは書いていない。 すべて手動でのテストにとどめた。

一応、GDUnit というプラグインを使って単体テストが実装できることは確認済みで、 真面目にゲーム作ってるプロジェクトの方ではユニットテストを書いてる。 今回のツールは使い捨てだったのでテストは書かなかった。

感想

GUI ツールは今まで Java の Swing と JavaFX でしか作ったことがなかった。 Electron も多少触ったことがあるけれど、ツールを作り切るところまでやったことはない。 今まで JavaFX が使い慣れてるから GUI ツールは JavaFX だけでいいかな、と思っていたけれど、意外と Godot で作るのも悪くなかった。

JavaFX と違って作り始める敷居が非常に低くて良い。 JavaFX で作ろうとすると、まず JavaFX のライブラリを Maven なり Gradle なりでインストールしないといけない。 そして GUI を組み立てるための SceneBuilder も別途インストールが必要。 Kotlin で実装したければ Kotlin SDK のインストールも必要。 エディタは VSCode か IntelliJ IDEA などの IDE は必須。 これでようやくスタート地点。

Godot だと Godot のインストールだけで良い。 Godot はコードエディタとレイアウトエディタともに内蔵している。 別途エディタのインストールなしで作り始められる。 まぁそれでも VSCode や Cursor は欲しいけど。

あと GDScript はパッケージのスコープが常にグローバルになっている。 これは利点でもあるが、欠点でもある。 Java みたいに明示的な import 不要で、クラスを定義するとどこでもクラスのインスタンスを宣言できる。 もちろん Panel とか Node2D みたいな UI の組み込み型もデフォルトでインポートされている。 ようは、Java みたいにファイルの先頭に大量の import 文を書かなくて良い。

デメリットを挙げるとするなら、これはあくまでもゲームエンジンであること。 GUI ツールを作るのが目的のものではない。 例えば Button 要素を画面上に配置して、TAB キーを押しても当然 Button にフォーカスはあたらない。 WCAG に従ったツールを作るのは厳しい気がする。 PC の負荷とかも、あくまでもゲームとして動作するので通常の GUI ツールよりも重いんじゃなかろうか。 グラボ積んでない PC とかだとどうなるか未知数。

でも、ゲームを作るときに大量のイベントデータを JSON とかで作りたくなったときに イベントデータを作る自分専用ツールを自作するのには悪くないと思う。 ようは RPG ツクールみたいなツール。

別の手法としては、Google Spreadsheet でデータを作って GAS で JSON に変換して出力って方法がある。 テキストデータしか扱わないならこれで十分。

ただし、画像を表示しながら作りたいみたいなケースは専用の GUI ツールを作ったほうが効率的なはず。 自分専用のツールをわざわざ JavaFX で作るってのも大掛かりすぎるんで、Godot で作るのはかなりアリだと思う。

今後

そもそもソートアルゴリズムを可視化するツールなんて 誰でも作ってるだろうから、今回作ったツールを使う人はおそらくいないだろう。

v0.5.0 で自分は満足したので、ここで改修は打ち切って、メインのゲーム作る方に戻るつもり。 まぁ、イラスト用意するって部分にどれだけ気持ちが乗れるか次第なんだが…。

前の記事 生産性という麻薬 | 次の記事