2006-11-23
テニスゲームの実装(5)
やっぱり絵がないのでこれ以上はすすめない。 まあ描画についてはあるていで出来ている。MyGameは拡大縮小のAPIのちょっと手を入れただけであとは大丈夫だった。
--
出来上がった表示物の表示と描画だけを行うプログラムを見ると 3 つに分かれているようだ。
ひとつはグラフィック・キー入力イベント等ゲーム製作に必要な部分を高レベルに抽象化したMyGame。SDLそのものがある程度は高レベルなんだけど、実際にゲームを作る上ではまだまだ低レベルすぎる。絵の表示なんてこれでいいのだ。
image = Image.new('sample.bmp') image.x, image.y = 100, 100 image.draw
ふたつめはVector3DとかCameraとか。あとはキャラクター等をクラスしたりして扱いをオブジェクトの生成等をSDLっぽく書けるようにする部分。これらはヘルパー郡としてスクリプトを分けた。ここでは eval とか使いまくっちゃう。
最後がヘルパー郡で定義した機能を使って SDL っぽく書く部分。ゲームバランス(レベルデザイン)とかはすべてここ。具体的には以下のような感じ(メソッド名はまだいいかげんだけど)。
require 'mygame/boot' require 'tennis_helper' COURT_H = 1189 COURT_W = 1097 class Player < Character image_resource 'images/player.bmp' end class Ball < Character image_resource 'images/ball.bmp' def initialize super @position = Vector3D[400, -200, 1300] @v = Vector3D[-16, -6, -40] end def run @v.y += 0.5 @position += @v if position.y > -10 position.y = -10 e = 0.8 @v *= [e, -e, e] end end end camera = Camera.new players = Array.new(2) { Player.new } ball = Ball.new bg = Image.new('images/bg.bmp') loop_game(30) do [players, ball].flatten.each &:run bg.draw camera.draw(players, ball) end
--
2番目のフレームワーク化の考察が EasyRocket なんだけど、今回は MyGame の検証なのでその辺は考えない。