2006-11-23
テニスゲームの実装(4)
カメラワークは 3D 処理なので結局昨日の Vector3D を持ち出したほうがシンプルに書けた。
コートの表示とボールを飛ばすところまで出来た。次はキャラクターの表示とアクションだけどここから先はさすがに絵がないと作れないな。
Vector3D に rotate_y を追加。
class Vector3D < Array
def rotate_y(ry)
Vector3D[
x,
y * Math.cos(ry) - z * Math.sin(ry),
y * Math.sin(ry) + z * Math.cos(ry)
]
end
end
擬似 3D 描画を行うカメラクラス。
class Camera
attr_accessor :position, :angle, :screen_z
def initialize
@position = Vector3D[0, 60, -3600]
@angle = Vector3D[0, Math::PI / 9, 0]
@screen_z = 1500.0
end
def draw(*args)
args.to_a.flatten.each do |e|
temp = e.position.rotate_y(angle.y) - position
perse = screen_z / temp.z
e.view.x = temp.x * perse + screen.w / 2
e.view.y = temp.y * perse + screen.h / 2
e.view.scalex = e.view.scaley = perse * 1.0
e.view.draw
end
end
end