Ruby勉強会のネタでrp15-level

 物理エンジンでも実装してもらう問題作ってみた。
が、使わなかったので*1次回にでもと思った。
けど、よくよく考えると私これ実装するのに1時間くらい掛かってる。
1時間程度の勉強会のネタとしては、駄目だなと今更ながら気づくorz


で、書きなぐったものなので、駄目駄目だけどruby-processingなら簡易物理シミュレーションも簡単ですよってことで、ご参考までに。ここ、駄目だろって所は教えてもらえると嬉しいです^^

class Physics
  def initialize x,y,fr
    @g = PVector.new(0,9.8)
    @objects = []
    @x_size,@y_size = x,y
    @fr = fr
    @now = Time.now
  end
  
  def sec
    Time.now-@now
  end
  
  def set_object point,vector,cor=1.0
    object = [point,vector,cor]
    @objects << object
    object
  end
  
  def check_range ary
    case
    when ary[0].x < 0
      ary[0].x = 0
      ary[1].x *= (-ary[2])
    when @x_size < ary[0].x
      ary[0].x = @x_size
      ary[1].x *= (-ary[2])
    when @y_size < ary[0].y
      ary[0].y = @y_size
      ary[1].y *= (-ary[2])
      #p sec
    end
    ary
  end
  
  def draw
    @objects = @objects.map{|ary|
      ary[0].x += (ary[1].x/@fr)
      ary[0].y += (ary[1].y/@fr)
      ary[1].x += (@g.x/@fr)*10
      ary[1].y += (@g.y/@fr)*10
      check_range ary
    }
  end
end

def setup
  size 400,400
  smooth
  frame_rate 15
  
  @now = Time.now
  @phy = Physics.new(400,400,15)
  @a = @phy.set_object(PVector.new(100,0),PVector.new(10,0),0.8)
  @b = @phy.set_object(PVector.new(200,0),PVector.new(0,0),0.6)
  @c = @phy.set_object(PVector.new(300,0),PVector.new(-10,0),0.4)
end

def sec
  Time.now-@now
end

def draw
  background 0

  fill 255
  ellipse_mode CENTER
  @phy.draw
  ellipse(@a[0].x,@a[0].y,10,10)
  ellipse(@b[0].x,@b[0].y,10,10)
  ellipse(@c[0].x,@c[0].y,10,10)
end

*1:なんかグダグダになってしまって、基本問題さえ完了した人いたか疑問、大迷惑かけてしまったw;