Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
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 の検証なのでその辺は考えない。