この記事は Ruby Game Developing Advent Calendar 2016 の4日目の記事です。今日は shinokaro が担当します。
前日は aoitaku さんのはじめての司プログラミングでした。aoitaku さん、今年も Advent Calendar を開催してくださってありがとうございます!
ゲーム・プログラミング、特にコードだけでゲーム全体を構築(要は即席制作という事)しようとすると最初にぶつかる問題があります。それは初期値です、例えばキャラクターの最初の表示位置です。ゲーム・フレームワーク上で作業しているならば初期値を設定できるように設定ウィンドウ(GUI)や設定ファイルが用意されているでしょう。
設定システムを自作で準備しようとすると結構な手間です。まずはゲームを立ち上げることに集中するべきです(素晴らしい思い付きを忘れる前に)。さらに Ruby では即時にコード実行(コマンドを入力してエンター・キーを叩く!)されるので、操作が必要な数値設定環境よりコード本体に直接記述できる方が望まれます(私は望みました)。
それに Ruby らしく初期値を書くならば Ruby on Rails のように設定ファイルより設定コードで書きたいはずです。設定コードならば面倒な相対値計算から解放されます。計算式や変数を使って値の意味を明示したり、他のオブジェクトを元に値を算出したりもできます。
では、いよいよ Ruby っぽいゲームプログラミング Tipsを説明しましょう。
tap メソッドは Ruby の標準メソッドです。Object クラスに定義されていますので、ほぼ全てのオブジェクトで呼び出せます。引数にブロックを取り、そのブロックにレシーバー自身を与えます。戻り値はレシーバーです。
これを初期値設定に使う場合は次のようにコードを書きます。例として DXRuby の Sprite オブジェクトを使っています。
Sprite.new.tap { |obj|
obj.image = Image.load("./image.png")
obj.x = 320
obj.y = 240
}
Sprite オブジェクトは画像を画面に表示するためのものです。サンプルコードではオブジェクトを生成した後にブロックで値(表示画像とスクリーン座標)を設定しています。初期設定をブロックで書けるなら、次のようなこともできます。
config = proc { |obj|
obj.image = Image.load("./image.png")
obj.x = 320
obj.y = 240
}
obj1 = Sprite.new.tap(&config)
obj2 = Sprite.new.tap(&config).tap { |obj|
obj.y += obj.image.width
}
このコードでは obj1 と obj2 で同じ設定を使いまわしています。そして、 obj2 では自分の画像の横幅だけ右にずらしています。このようにメソッドチェーンを使って即席カスタム設定もできます。
これができるなら、設定コードを別のファイルに切り出すことも視野に入ってきます。もっともファイルを読み込んで Ruby で実行するにはちょっと手間をかける必要があります。そのアイデアは次の記事のネタとします。そう、今年のAdvent Calendarは複数投稿で行きます!
明日は vivit_jc さんのDXRubyで作ったシューティングゲームを交えて高校生向けプログラミング講座をしてきた話です。お楽しみに!