見出し画像

進捗報告 / ゲーム制作においてプログラミング言語はあくまで道具。唐突にGearHeadとか。


今だに使うプログラム言語で悩んだり悩まなくなったり。

GW後半ですが、思ったよりはプログラミングは進んでません。正直、自分がやろうとしていることはプログラム的にはとても単純なことの組み合わせなので(リスト操作と乱数と条件分岐があれば事足りる。)本当はこんなに時間が掛かるのはどうか、という感じなのですが、プログラマでない我が身としては、プログラム言語と開発環境の選定はしたけれどちょっと詰まるとこの選択で良かったのか?と思い出してしまったりして、とても難しく重たい事なのです。
あとその詰まった関数が1つ書けると嬉しくて満足で手が止まっちゃったりとか。子供か。
まあそれだけじゃなくて色々横道に逸れているからなんですが。ただ、色々判った事があったり迷わなくて良くなったり新たな課題が出たりはしています。

LISP族でのプログラミング

あれだけグチグチ環境を整えるのに時間を掛けただけあって、NeoVimとGauche専用プラグインの組み合わせでのプログラミングは非常に快適に出来ています。
言語の選択は今とりあえずはGaucheで進めていますが、少なくともプロトタイプ段階ではLISP族以外に変更することはなさそうです。
特に、漠然としたアイディアを形にしようとした時には、LISP族の秀逸なREPLとそれを十二分に活かすエディタという環境は代替えが無いです。

あと前の段で書いた様に、非常に単純なことしかやってないので、他のscheme にも関数名の修正くらいで持って行けました。とりあえずRacket、Chickenは簡単に行けました。もうこのまま教科書に出ている様な基本のscheme仕様に近いレベルの関数だけ使ってプログラムを進めてます。
これはありがたい話で、早くゲーム制作に移行したい自分としてはプログラミングのレベルで失敗したく無いし、プログラム言語の選択を変えなくてはいけなくなった時にダメージが少ない訳です。

現にGaucheで3大OSで単独実行ファイルを作れる様になったのですが、自分が思っていたほどポータブルにはならなさそうだし、外部のCライブラリとかを利用しようとすると少なくとも自分にとっては他の処理系より難しいので、RenPyまで持っていけなかったシナリオBの場合、Gaucheの単独実行ファイルの形で配布するというのは現状なくなりました。
さらにこれも単純であるがゆえなのか、LINEアプリ経由でChatGPTにPythonに変換してもらったのですが、関数単位でいくとかなりの制度で手直ししなくても動くものが出てくるのでした。
これならHyとかを経由しなくても行けそうなので、RenPyへ持っていく手間がぐっと減りそう。

プログラミング作業というものを俯瞰できる様になってきた。

このくらい潰しが効く状態だと、1つのプログラム言語に操を立てて使いこなすんだ!と決意を固めなくても、あくまでもゲームを作る過程で使う道具としてつまみ食いする感じで行けるなあ、と少し気が楽になりました。
先ほどのプランBの場合だと、現状ではRacketかPythonで単独実行ファイルを作って配布、という見通しなのですが、せっかくの休みで時間もあるし、という事でちょっと、単独実行ファイルを作りやすそうな他のLISP系言語を見て回ったりしました。

さっき書いた、Chickenというschemeと

癖を感じるけれど面白いnewLISPです。
どちらも、RacketやPythonに比べて1/10近く小さな実行ファイルを作れるんですが、どちらもWIndowsコンソールだと日本語が化けてしまうので取り敢えず保留。
あとRacketのIDEで入力補完をしてくれるプラグインを見つけて導入してたのですが、更にvimのキーバインドにしてくれるプラグインがあったのでそれを入れてご満悦です。

曲がりくねっていた道がついに一本道になりそう。

軟着陸した場合について考える

そんな感じで、軽い気持ちになりつつ、いくつかのschemeを同時にいじっていて感じたのは、案外キーボート入力関係が面倒くさいのと、WIndowsのコンソール使えねえ、という事。
さっきのchickenやnewlispとかも手軽だし動作も軽快だし、Windowsコンソールの字化けとか無ければ、十分プランBでの選択肢になったのになあ、って感じです。
更に言うと、Pythonでも前回書いた手軽にコンソール上でメニューを出せるbullet
もWindowsコンソールに対応してないみたい。
自分が今作りたいゲームは本当にコンソール程度の画面構成で十分なんだけど、Windowsコンソールだと力不足だしRacketのGUIまわりだと面倒くさいし、なんとかならんかなあ、と考えあぐねていたら、前回書いたBearLibTerminalを思い出しました。

これはA Road to Common Lisp日本語訳を読んだ時に知ったncursesぽい
画面が出せるライブラリで、マウス入力にも対応している。
あーこれ良いなあと思いつつ日本語表示できるかな?という段階でいじるのは
放っておいたんだった。

ターミナルっぽいけどもう少しリッチな事ができるライブラリ。
背景画像を置いたり画像を出したり。
基本は懐かしい感じのローグライクな画面を作ることを想定しているっぽい。

サイトの説明とか読むと、UTF-8、ttfファイル対応なのでまあ行けるはずなんだよな、とサンプルのソースをいじって日本語表示してみました。

まずはLuaで。Luaだと何の準備も要らない。

terminal = require 'BearLibTerminal'
 
-- Initialize the library
terminal.open()
terminal.set("window: size=35x12, title='mygame'; font: mplus-1c-regular.ttf, size=18")

-- Print something
terminal.print(2, 1, 'こんにちは、世界。Lua言語だと簡単に扱えます。')
terminal.refresh()
 
-- The usual 'Press any key to exit...'
terminal.read()
 
-- Clean up
terminal.close()

お次はPython。とは言えpipでライブラリが用意されていてコードはLuaとほとんど同じ。本当にPythonは何でもあるなあ。

from bearlibterminal import terminal
 
terminal.open()
terminal.set("window: size=35x12, title='mygame'; font: mplus-1c-regular.ttf, size=18")

terminal.printf(1, 1, 'こんにちは、世界!簡単に日本語表示可能です。')
terminal.refresh()
 
while terminal.read() != terminal.TK_CLOSE:
    pass
 
terminal.close()

表示結果。日本語がちゃんと表示されてます。

ちなみにCommon Lisp用にもquicklispにライブラリがあったりします。
schemeはCと連動がしやすい処理系が多いせいか、自分でやれるよね?みたいな感じです。

漠然と、コンソール版のBooCarDiは初代GearHeadみたいな画面を考えていたので、これで後は音が出ればもう十分じゃないだろうか。
RenPy版はもうちょっと違った画面構成になると思うけど。

と言う訳でGearHead

GearHeadはローグライクに分類されるとおぼしきゲームで、詳しい説明は下記HP群にお任せします。

ゲーム画面はこんな感じ。

WIndows版をwineで立ち上げたところ。これは1周回ってクール!
ゲームはPascalで書かれていて、ソースをMacのFreePascalで
コンパイルしてみたらコンソール版はちょっとの手直しで動きそうだった。
基本は古式ゆかしいローグライクなんである。
当初はこんな画面のプランBを考えてました。
こっちはSDL対応版。PC98感がすごい。Hyoleeさん良いよね。
BearLibTerminalならこのくらいの画面はいけるのではないか。

そんな訳で、コンソール版に着地した場合はおそらくRacketからBearLibTerminal使うか、関数単位でPythonに書き直してPythonで組み立て直したものになると思います。
現時点で想定しているゴールはRenPy版のプランAだからPython版になる可能性が大かな。RacketでCライブラリいじるのもチャレンジしてみたいけど。
あと、プランBになるまえのコンソール版試作ってのも作ることになると思いますが、これもいったんPython版は作るでしょう。そうするとiPadに持って行ってPythonistaで動かす、なんて事で遊ぶこともできそうだし。

とはいえ、アイディアをいじくり回している段階ではNeoVim+Gaucheは快適なので、しばらくはこれで行きます。
いよいよ具体的なゲームのデータ構造を作らなくては。

この記事が気に入ったらサポートをしてみませんか?