前にも書いたが、最近時間に余裕があるためゲームを作ることにした。プログラミングも最近やってなくて何かやりたいなぁと思っていたし、もっと大きな理由としては、日本人の視覚障害者(とりわけ全盲)が遊べるゲームが多くないことがある。海外ではオーディオゲームというカテゴリで製品まで出ているが、日本ではなかなかそういうことまでいかない(セガサターンの「リアルサウンド~風のリグレット」とか、PC用の「インベーダー」とか、無くはないが)。日本製のゲームの少なさには他の人もいろいろ考えているようで、近年は全盲でも遊べるPCゲームを作る日本人も増えており、だんだんと状況は改善されてきているようにはみえるが、やはり一般のゲームの多様性に比べるとまだまだである。

で、まぁ日本での事情はともかく、プログラミングが好きな私としても、こうしたものを作ってみたいとは前から思っていたのだがなかなか時間が取れず、今まで過ぎ去ってしまった。けれども、過去を振り返るとそういうことは他のことでもたくさんあった。なので、せっっかくだから「作ろうと思ったから作るか」という気になったわけである。

現在はRubyでゲームを書いている。「最初はシューティングゲームが簡単」とネット上のあちこちで書かれていたので、俺もそれに習ってシューティングゲームを作っている。

初めはHSPという言語を使って書いていた。ゲームプログラミングに向いていることと初心者でも扱いやすい言語という評価が多かったからだ。

確かにHSPは簡単である。ぶっちゃけ、何も考えないでプログラムを作ることができる。私も、最初は何も考えずに簡単なシューティングゲームを作製できた。

ところが、いろいろと機能を盛り込んでいこうとすればするほど、言語使用レベルでの技術的困難を感じるようになった。一番の原因は、HSPは手続き型であるのに対し、俺がイメージする設計がオブジェクト指向になっていることである。もう一つ、HSPでもオブジェクト指向風にプログラムを書けるが、完全なオブジェクト指向ではないのでいろいろと気に入らない点我あったのだ。

例えば、プレイヤーに関してプログラミングすることを考える。プレイヤーには「名前」や「HP」、「位置」などの属性があって、「動く」とか「弾を撃つ」などの動作がある。これらの属性・動作というものをプログラミングするだけならば、手続き型言語でも大した事はない。属性は構造体、動作は関数として作ればいいだけの話だ。

ところが、HSPにはまず構造体のような抽象データ型がない。入門サイトを読んでいると、名前やHPを表す配列を作って、配列の要素番号でどのプレイヤーか判別しているような設計をよくみた。まぁ、入門者にはこの方が分かり安いだろうなと思いつつ、現実的なゲームを作るには問題が多い。そこでモジュールという機能がある。モジュールを使えば、HSPでも構造体っぽいものは作れなくはないので、属性に関してはとりあえずOKとする。

次に動作について。手続き的に作るのなら、「動く」や「弾を撃つ」などの関数を作って、引数にプレイヤーのデータを渡してやれば、処理を実装することが可能である。HSPのモジュールを使えば、そのモジュール内で使える関数を定義できるので、これでOKかと思いきや・・・。実際に作ってみると、モジュール内で定義した関数であってもパブリックな関数になってしまう。これは言語仕様らしくどうにもならない。俺の概念では、モジュールなどは名前空間を定義してデータやメソッドをカプセル化できるのが当然だと思っていたので、まずこの仕様がきにいらなかった。プレイヤーだけならまだしも、敵とかアイテムなんていう要素を導入したら、それぞれに対して関数を作らねばならないじゃないか。いやまぁ、オブジェクト指向だってそうなのだが、スーパークラスを作っておけば、振る舞いの違うメソッドだけオーバーロードすればいいじゃん。

このようにHSPの言語仕様に不満を持ってしまったため、使用2日にしてHSPを使うことはやめたのであった。ついでにいうと、goto命令がさも便利な命令として各所で取り上げられていることも気に入らなかった。当然goto命令を使わないでプログラミングすることもできるが、HSP公式のチュートリアルでgoto を使ったサンプルが普通に提示されていたことで、個人的に「やめろ!そんなもんコードが読みにくくなるだけだ!」と嫌悪感を抱いてしまったので、どっちにしてもHSPを使わなくなる運命だっただろう。

そういうわけでRubyなのだ。オブジェクト指向であるのが最大の理由だが、もう一つ、Rubyでゲームを作っている人がいたので、「じゃぁRubyにするか」と思った次第である。

Ruby自体、ゲームを作ろうと思って初めて勉強した。けれども、以前Pythonをやっていたおかげで、文法や式の書き方はあまりちゃんと入門書を読まなくても理解できた。細かいことを知りたくなったら言語リファレンスを見ればいいやという感じだ。余談だが、Rubyは日本人が作ったプログラミング言語なので、日本語の情報が多くて助かる。Pythonをやっていたころは、チュートリアルと言語リファレンスぐらいは日本語訳があったけれども、バージョンが古かったりして結局英語で読むはめになって苦労したものだ。まぁ、技術英語を読む訓練にはなったが。

というわけで、キャラクターの設計も楽だし、dxrubyっていうライブラリでDirectXも使えるし、最近Rubyがお気に入りである。まぁ、実際のゲームを作る過程ではいろいろ悩むことはまだまだ多いけれども。