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