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 の検証なのでその辺は考えない。