Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
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