近況報告 (2021年8月)
2021年2月終わり頃に新しいゲームを作り始めると宣言してから、約半年間ほぼ更新していませんでした。果たしてこのようないいかげんなサイトを見てくれる人が一人でもいるのかどうかもわからないのですが一応この間何をやっていたかを報告しておきます。
OSを変えました
長い間Debianを中心に使ってきたのですが、別のディストリビューションをメインに切り替えました。乗り換え先はGaruda Linuxというディストリビューションです。以前使ってたのはDebian 10 安定版で、名前の通りたしかに、本来の安定版の意味は動作が安定しているという意味ではないのでしょうが、とても安定して動作していました。いい意味でも悪い意味でも安定していました。悪い意味というのはプログラムに不具合があってもなかなか修正されないという点と、提供されるバージョンが古いという意味です。Garuda Linuxのようなデスクトップ環境を重視してチューニングされた環境を使ってみて初めて分かったのですが、Debianはデスクトップ環境として使うにはストイックすぎる気がします。もちろん自分で好きなソフトウェアを導入してカスタマイズすれば好みのデスクトップ環境を作ることはできるのですが、どのような目標を持ってカスタマイズするか指標がないので、デフォルトで提供されたものもそこそこの使い勝手であって結局そのまま使ってしまうという状態に落ち着いてしまいます。Linuxに完璧なデスクトップ環境などは求めていなくて、ターミナルとWebブラウザが快適に動作して、テキストエディタが快適に動けば十分良いプログラミング環境ができるだろうと思考停止していて新しいディストリビューションに乗り換えることに消極的になっていました。
突然乗り換える気になったきっかけは、録音環境を構築しようと思って、PCのパーツを増設したりしたことです。SSDを2枚付け足したのでマルチブート環境が構築できるようになりました。
Garuda Linuxを選んだのは、たまたま見かけてなんとなくなのですが、あえて理由を上げるとArch Linuxベースであること、名前が面白いこと、そこそこ人気があること、デスクトップのスクリーンショットが気に入ったことなどです。Arch Linuxは好きなのですが、Debian以上にストイックな感じがするのでワンクッションおいたGaruda Linuxかもう一つArch Linuxベースで人気のあるManjaroが候補でした。他にも急上昇中のPop!_OSというもの気になってます。
しばらく使ってみての感想ですが、すごくいいです。Debianを使ってたときには思いもしなかったLinuxの違った一面を見れる感じです。例えばデフォルトのシェルがfishなのですが、これだけでも全然操作感が変わってきます。Debianであってもただfishとかインストールすればいいだけのことなのですが、あまり積極的に環境を良くしていこうという使い方はしていなかった、むしろ消極的だったので、デフォルトで強制的に使わせられでもしない限りbashをあと30年は使い続けてしまっていたかもしれません。そういうことで、これからは自分の使うツールを積極的に見直していくようにしたいところです。ただ、やはり安定感はDebianの方が上な気がします。Garudaにはデスクトップ環境(KDE PlasmaとかXfceとかGNOMEとか)で分けたエディションがいくつかあるのですが、一番使いたかったKDE Plasmaの環境(Dr460nizedという変な名前です)はうまく動作しませんでした。というのはログアウト→ログインを繰り返すとフリーズするという現象が発生して、解決のため試行錯誤しましたが諦めました。今はGNOMEのエディションを使ってます。GNOME使うの初めてなので新鮮です(…でも正直Cinnamonのほうが使いやすいです)。
ギターとオーディオ・インターフェイスを買いました
ゲームを作るとき一番ネックになっていたのが音でした。録音機材がないため自分で音を作ることが出来ず、フリーの素材を探して入れてみるという作業は虚しいです。PCのマイク入力端子にマイク差し込んで録音するという手も試しましたがとてもまともに聞ける音にはなりませんでした。過去DTMを始めようと思った時期があり、外界から音を拾うためにはオーディオ・インターフェイスというものが必要ということは知っていて、とりあえず買ってみることにしました。
Amazonを調べると思ったほど高くないことが分かり、適当なのを見繕って買ってみました。売れ筋の1万円台のものでも良かったのですが、Linux環境で動作しないとなると困るのでLinuxで使えるものを調べるとベリンガーのX1222USBというものがいいという記事を見つけて何も考えずに買いました。Linuxでの動作はバッチリでした。何もせずとも認識してくれました。ただ、マイクからきれいに拾ってくれない、感度が低い気がするなどまだ思うように扱えていないです。ミキサーの扱いも全く上達していません。ただケーブルをぶっ挿してあるだけという感じです。
ベースは以前から所有していて、最初はベースだけで音を作る予定でした。オーディオ・インターフェイスを買ったら思い切って必要なものを揃えてしまうという欲が出てきて、ギターも買ってしまいました。買ったのはフェンダーのジャズマスターです。なんか最近出たばっかのモデルらしいです。最高級のギターというわけではないですが、ギターの外観、感触、音どれも素晴らしく大満足です。
買って終わりでは意味ないので、音が必要になる段階まで進めて活躍させてあげたいです。
動画取り始めました
オーディオ・インターフェイスを購入したのがきっかけで動画を取り始めました。何を録画しているかというと、プログラミング中のPCの画面と一人でブツブツ言いながら喋っている動画です。最初はテスト兼ねてアップロードを意識しながらやってました。途中からアップロードするの面倒になりアップロードは考えず、単に活動を記録しておくだけのものになりました。喋り方、特に呼吸の仕方を改善したいと思ってます。というのは、あまり大きな声で喋れないので声を抑えめにに喋っていて、そのままだと声が小さすぎて聞き取れず、マイクの感度を上げると呼吸音が気持ち悪いくらい入ってきてしまうからです。これを改善するには、大きな声でしゃべるか、呼吸を意識してうっとおしくならないように気をつけるか、できればその両方を改善することです。
モンハンワールドやってました
何を思ったか、以前PSPlusのフリープレイであったモンハンワールドを始めました。始めたら止まらなくなってアイスボーンも買ってしまいました。なかなかやめれませんでしたが、現在はなんとか中断できました。300時間くらいやりました。
いろんな言語でテトリスを作ってました
少しC++から離れて別の言語を学びたくなってちょこちょこ触ってました。ただチュートリアルや解説を読むだけではあまり意味がなくなにか作るべきだろうと思って題材としてテトリスを作ってました。
Object Pascal
Pascalは以前から興味があってずっと学んでみたいと思ってました。Pascalで最も有名な開発環境としてはDelphiがあるのですが、フリーではない、Linuxでは使えないという理由でパスしてました。フリーなPascalのコンパイラはFree Pascal Compiler (FPC)というのがあって学習用途にも実用レベルでも良さそうです。
まず最初にFPCとコマンドライン環境でこのチュートリアルを読みました。ここで(Objectではない)Pascalの最初の一歩は踏み出せました。それで次にテトリスを作ろうと思って良い方法はないかと思って調べていると、SDLやSFMLのPascalのバインディングを使うという方法がありそうでした。でもそれは使わず、フリーのDelphiっぽい開発環境、Lazarusを使うことにしました。Lazarusの使い方は学習しませんでした。その場その場で適当に調べながらやっていったらなんとかなりました。グラフィックスの描画はLazarusが提供してくれる四角を描くだけの初歩的なAPIを使いました。出来はひどいものでしたが、最初の取っ掛かりとしてはまずまずかなというところでした。
また、Lazarusは純粋なPascalではなくObject Pascalを使うのですが、Object Pascalの学習もすっと飛ばしました。おそらくPascalを一通り学んでおけば、C++などの経験がある人なら何となく使えるようになると思います。Object Pascalの使い心地もそんなに悪くないです。というよりLazarusがよく出来ているので学習用途として悪くないです。OpenGL使うこともできるだろうから工夫次第でゲーム開発に使えなくはないと思います。でもメインのターゲットはGUIアプケーションの開発だろうと思われるので、ゲーム開発環境としては微妙かもしれないです。
今回はLazarusを使ったので、次機会があればFPCと素のPascalでやってみようと思います。
Squeak
SqueakはSmaklltalkの環境です。Squeakは単なるSmalltalkのためのIDEではなく、実行環境でもあり、開発環境でもあり、とにかく全部Squeakの中で完結しています。一応外界とファイルを通してやり取りすることも出来ますが、ソースコードやシステムに対して加えた変更などはSqueakのイメージというものの中で記録されます。Squeakの存在はなぜかずっと昔から、多分プログラミングを始める前から知っていました。昔テレビで見てすごく記憶に残っていたからです。テレビでは子供がアラン・ケイと一緒に何かを作っているような映像が流れていた記憶があります。それで使ってみようと思って何度か挑戦したことがありましたが意味不明で結局覚えることもなかったです。今回の挑戦では一応目標は達成しました。一番の助けになったのはSqueak by Example (5.3 Edition)という本です。これは素晴らしい本でした。この本がなかったらたぶん全く何も出来なかったです。Squeakはぜひ扱えるようになりたかったので気合い入れて全部読みました。結構時間かかりましたが収穫は大きかったです。
テトリスの作りとしては、描画領域(キャンバスのような)に四角形を描くAPIを使うという手法ではなく、Morphというグラフィックスのオブジェクトがあるのですが、それをセルに見立てて配置するという作りにしました。これはかなり奇妙な作り方です。例えるなら、ウィンドウの中に正方形のボタンを配置してブロックや壁を組み立てるというような作りです。HTMLだったら正方形のdiv要素で組み立てる感じです(今はcanvasがあるのでこういう方法は取らなくてもテトリスは作れます)。奇妙な感じになりましたがMorphの扱いに少しなれたので返ってよかったです。
Squeakでゲームを作るならもう一つ選択肢があって、etoysというビジュアルスクリプティングのようなものが使えます。いま人気のScrachみたいな感じでしょうか。公式のSqueakのイメージにはetoysが含まれています。これは子供の教育目的のためのツールらしいのですが、結構難しいです。最初何をやったらいいのかさっぱりわかりませんでした。こことかの解説見ながらいじってたらなんとなく分かってきました。興味はありますがこれでテトリス作るのはかなり大変そうです。
Smalltalkのグラフィカルな環境としてはもう一つPharoというのがあります。Squeakからのフォークらしいです。見た感じもSqueakによく似ています。Pharo by Exampleという本もあります。Squeak By Exampleとほぼ同じ構成になっています。Pharoから入る場合この本から始めるのが良いかと思います。で、せっかくSmalltalk少し覚えたのでPharoを試してみようと思ったらPharo自体を起動できませんでした。OS切り替えればいけるでしょうが、今回はパスしました。
SmalltalkはCをルーツにする言語とはやや異なったプログラミングが必要になります。特徴は少ないシンタックス(構文の決まりごと)があって、一貫してそのルールに従うという感じです。ややLispに近いところがないでもないかという感じです。言葉も特徴出来です。例えば「メソッドを呼び出す/実行する」ではなく「メッセージを送信する」です。ありきたりな文句かもしれないですがオブジェクト指向プログラミングに関心があるなら一度は触れてみる価値のある言語であると思います。
あとなんか言うことがあるとすると、だいぶ前にGNU Smalltalkというのを触ったことがあって、もしグラフィックスを扱えるのであれば、次はそちらでチャレンジしてみたいです。
Lua/LÖVE
LÖVEはLuaのための2Dゲームエンジンです。ゲームエンジンと言ってもUnityやUnreal Engineのような巨大なものでもなくビジュアルなエディタを備えているものでもありません。Luaでゴリゴリ書いていくものです。2Dゲームに必要な機能を一式提供してくれます。
Luaはとてもコンパクトなスクリプト言語です。コンパクトなのは組み込み言語として使われることを想定しているためでCから呼び出したり逆にLuaからCのコードを実行することが想定されています。Luaはシンプルなので使い方を覚えるのはすごく楽な方だと思います。PythonとRubyよりずっと入りやすいのではないかと思います。しかし、情報がそれらよりずっと少ないため必ずしもプログラミングが初めての人に向いているとは言い切れないところでもあります。
Luaの最新のバージョンは5.4です。5.4はかなり最近のバージョンです。LÖVEはLua 5.1を使っています。最新のものを追随しない理由は分かりません。できれば最新のバージョンのLuaを使いたいとろではあります。
Luaを学ぶのに最も適したのはProgramming in Luaという本だと思われます。2016年に出た第4版が最新で、これはLua 5.3が対象です。数年前に運よく適正価格で購入することが出来たのでこれを読みました。これ読んでおけば、LÖVEとのバージョンは違いますがあまり困ることはなさそうです。Programming in LuaのLua 5.1を対象とした本の和訳版があるのですが、今確認したらAmazonで新品の取り扱いはなく、中古もかなり高値がついているので諦めたほうが良さそうです。それにあえて古いバージョンのものを買う必要もないと思います。5.4を対象とした新版がでるのを待つのが良いかもしれません。Lua 5.0のバージョンのものはこちらで個人利用に限りオンラインで見ることが出来ます。LÖVEを使うだけならこれでも十分すぎなくらいではないかと思います。
原始的なテトリスを作るのに必要なグラフィックスは四角形それも正方形を描画するだけです。今回使ったのはそれだけでした。LÖVEではもっともっと本格的なゲームを作るのに必要な機能をもっています。学習コストをできるだけ抑えて、それでいて基礎をしっかり学べて、遊べるゲームを作るにはLÖVEは有力な選択肢です。初めてゲームを作るのにUnityを選択してC#を覚えたりするよりずっと安上がりです。3Dのゲームを作りたいとなると話は別ですが…また、Luaは組み込み言語として使えるのでC++と組み合わせて使うこともできる(これは実際にLÖVEがやっていることです)ので無駄にはなりません。
C++/SFML
最初C++とSFMLでマリオみたいなの作ろうとしてたのですが、どうもうまくいかず途中で放棄していました。テトリスは、マリオに比べると4連戦目ということもあってスムーズにいきました。SFMLはシンプルです。おそらくC++の経験があるならこの組み合わせが遊べるゲームを作るまでの一番近道でないかと思います。
C++で書いてみて思ったのが、どの言語を使っても結局同じようなコードになってしまってます。細かい違いはあるものの、ループや条件や関数やクラスのようなものの機能を備えていて結局それに頼ってコードを書いてしまうということです。本来は、その言語にふさわしい設計をして、最大公約数になる部分だけを使ったようなプログラミングは避けるべきです。C++が一番使い慣れているのでどの言語を使っても「C++でこう書くところはこの言語ではどのように書くのだろう」と考えるのではなく、「この問題を解決するにはどうすればよいか」と最も基本的な考えに立ち戻るように意識しないといけないわけです。そうでなければ単にC++のコードを別の言語に置き換えただけでその言語の何かを知った気になって一時的な満足を得て終わりになってしまいます。
挑戦中
- Clojure
- CoffeeScript
未着手
- Rust
- Common Lisp
- Emacs Lisp
- MoonScript
今後の予定
考え中です。
テトリスの記事を書こうかと思ったのですが、ブロック崩しからあまり進展が見られないので迷ってます。
もはやC++入門でもなんでもなくなっているのも気がかりです。