道場で学んだ「ゲームとは何か」を踏まえて3~4時間でゲーム作った話と反省
Ruby Game Developing Advent Calendar 2016 13日目の記事です。
12日目はmirichiさんの「Rubyの標準添付ライブラリFiddleでゲームプログラミングする」でした。
DLとかFiddleとかほとんど使ったことないです勉強しますハイ。Ruby-FFIはちょっと触ったことありますが何か作ったかというとそうでもなく。
gistに貼ってくださったコードを動かしてみたらこんな感じでしたスゴイ。これは是非手元で色々いじくって動かしてみるべきですね。
さて本稿ですが、日記的なもので特にお役立ち情報などはありません、ご了承を。(言質)
ただ申し訳程度に動かせるコードをいくつか含んではいます。
「ゲームとは何か」を子どもたちと学ぶ
去る12月10日(土)に島根県は松江市で実施されたプログラミング道場:ProgShouDojoにアシスタントとして参加してきました。プログラミング道場はNPO法人Rubyプログラミング少年団が子ども向けに月一回開いている教室です。
子ども達にはRubyに限らず各々コンピュータを使ってやりたいことを進めてもらうというのが基本スタンスですが、特に目標がない子ども向けに毎回なにかしらのテーマや課題を設けており、多くの子どもがビジュアルプログラミング環境スモウルビー*1(内部でDXRubyやRubySDLが使われています)を使ってそのテーマに取り組んだりしています。
12月10日(土)の道場のテーマは、ざっくり言うと「(面白い)ゲームとは何か」でした。当日の講師と子ども達とのやり取りは次のようなものでした。
ゴミ箱にゴミを入れる、という行為はゲームっぽいか?
これは誰にでもできる普通の動作だからゲームっぽくない。
ではゴミ箱の3メートル以内に近づいてはいけない、というルールを作ったらどうか?
ちょっとゲームっぽくなる。ではゴミ箱の1km以内に近づけない、というルールはどうか?
目標が達成できないから誰もやりたがらない。これはもうゲームとは言えないかもしれない。
難しいけどちょっと頑張れば達成できる、という制約があるとものごとが楽しくなる。
好きな遊びやゲームについて、何が面白いのか、どんな制約があるか、を考えてみよう。
ゲームに限らず当たり前っちゃあ当たり前な話ではあるんですが、改めて言われるとなるほどなぁと思ったり。趣味や小規模開発などの理由でグラフィックやボリュームなどにコストを掛けられないゲームでも、ルールや制約によって独創性や独自性があるものは面白いですよね。
このあと講師からスモウルビーを使ってゴミ箱にゴミを投げ入れるっぽい感じの簡単なゲームを作る例の紹介があり、みんなも作ってみよう的な流れになりました。
作ってみた
てなことがありまして、面白そうだから僕も以下のルールでゲームを作ってみることにしました。
- 「ゴミをゴミ箱に入れる」というテーマ
- DXRubyを使う(個人的な好み)
- さくっと作ること(なるべく短時間で、せいぜい4~5時間くらい)
最後のルールは、あまり長丁場にすると時間に比例してモチベーションが下がりそうだったのと、過去のDXRuby Advent CalendarであおいたくさんがSTG制作8時間タイムトライアルというのをやっていて楽しそうだったので、短時間で作るというのをちょっとやってみたかったのです。あまり厳密にやる気はなかったのでちゃんと時間は測ってないですが。
できあがりがこちらです。
所要時間はたぶん3~4時間くらいです。以下、ヒストリー。
- 道場のアシスタントの合間をぬって1~2時間でゴミを投げ入れるところまで作成
- アシスタント業を疎かにしていた可能性があり大変申し訳なく思っています
- 帰宅して用事をすませてから1時間弱でタイトル画面やコンボ、スコア計算処理を作成
- ここで最初のコミット
- 翌日、カーソル、紙くず、ゴミ箱の絵を描いて差し替え(次のコミット)
- キャラクターの絵だけ過去作から流用
追記: 記事公開直前によくないコードを見つけてしまったので少し修正しました
制約と報酬
道場で出されたテーマの時点で「ゴミ箱に一定以上近づけない」という制約があります。
講師がスモウルビーで紹介したサンプルでは、これに「マウスのドラッグでゴミを投げる角度と力を決める」というルールを加えて「ゴミを投げる力と方向が一定でない」という制約を課していました。
僕の場合は「カーソルとゲージでゴミを投げる角度と力を決める」というルールで同じ制約を課しました。カーソルと角度の計算とかはわりとガバガバ。
更に、難易度の高い方を選択すると「ゴミ箱が一定の位置に定まらない」というルールを加えて、「同じ方向と力でゴミを投げても常にゴミ箱に入るとは限らない」という制約が課されるようにしました。
また、縛りばかりでなく「連続でゴミの投げ入れに成功すると連続回数に応じてスコアが上昇する」という報酬も追加しています。
制作の感想
時間制限があるとまるで「ゴミ箱ゲームを作るというゲーム」をやってるみたいで楽しかったです。
最終成果物はわりとクラス分けされてるんですが、初期段階では生のSpriteのままザクザク書いてたりして、そういう「ちょっくら試しに書いてみるか」みたいなお手軽さはやはりDXRubyの魅力のひとつだなぁと思いました。
制約づくりに失敗した例
ところでもうひとつ紹介したいものがありまして、ぼくのかんがえたさいきょうのパズルゲーム「Rotzle」です。
ある日「フィールドが回転する落ち物パズルゲームってどうだろうか、もうすでにありそうだけど」などと思いつき、特に前例を調査することもなくぼちぼち書いてみたものです。
作ってみてわかったのですが、ただ回転させてるだけでパネルがバンバン消えちゃって何にも面白くありませんでした。
そこで「任意の位置にランダム色のパネルを落とす」「パネルを落としたタイミングで回転が発生する」というルールを追加してみました。
自分が落としたパネルとはあまり関係ないところでやはりパネルはバンバン消えており、ツマンなさはあまり変わりませんでした。
パネルが消えやすいのがイカンかなと思い、「何らかのタイミングでお邪魔パネルを落とす」「お邪魔パネルを巻き込んでパネルを消すとお邪魔パネルが通常のパネルに変化する」というルールを追加してみたのがこちらです。
たしかに消えにくくはなりましたが、よくわかんないタイミングで連鎖が発生したりしてやっぱり面白くありません。なんかもう泥沼化してきた感があります。結局、
- 積み上がったオブジェクトがフィールドが回転することで簡単にぶっ壊されてしまう
- 「自ら計算し積み上げる」ということがしづらい
- ムダに広いフィールドと回転によって次の展開が読みにくい
- 自分で落としたオブジェクトが消化や連鎖に介入しづらい
などなど、回転するフィールドという要素がプラスに機能していないという点に尽きるような気がしました。 そもそもパズルゲームが得意でなくあまりプレイしない(なぜ作った)ので適切な考察ができているかわかりませんが。
ルールを追加することは簡単ですが、「それがどんな制約(報酬)をもたらすか」「ユーザにどんな計算やテクニックを要求するか」ということをちゃんと考えなくてはいけないのだなぁと反省した事例です。
フィールド回転パズル、なにか面白くできそうなアイデアがあったら是非試してみてください。もしくは既に面白く作ってある前例などがあれば教えていただけると嬉しいです。
まとめ
個人的な感想ですが、Rubyゲーム開発界隈には、ユニークなルールと制約によって独創的なゲームを作る方が多い印象があります。(観測範囲が過去のDXRuby Advent Calendar参加者や今回のAdvent Calendar参加の皆様などですが。)
Rubyという、直感的にサクッと試しに書いてみる、みたいな使い方が得意なツールでは、小規模でシンプルながら少しアイデアとスパイスを加えたようなゲームというのも目指す方向としてひとつアリなのだろうなと思った次第です。それが難しいんだよ、というツッコミはあろうかと思いますけど…。
開発テクニックやノウハウなどを学習するのはもちろん大切ですが、「面白いゲームとは何か」みたいなことを常々考えていくことも大事なんだろうと改めて思いました。
なんか「考えさせられた、という何も考えてなさそうなコメント」みたいな記事の締めになってしまった。
明日14日目はあおいたくさんです。末筆ながら毎年Advent Calendarの主催、ありがとうございます。 「ruby ffi を使って Ruby から CSFML を呼び出してゲームを作ってみる」、お楽しみに~。
*1:スモウルビーについてはpaizaのブログ記事が詳しいです