HelloPhysicsWorld->2D->BouncingEllipse->chapter1

 最初は、円が弾むシミュレーションを実装してみる。
で、以下は円を表示するだけのrp5sketch

class Ellipse
  attr_accessor :x,:y,:w,:h
  def initialize x,y,width,height
    @x,@y,@w,@h = x,y,width,height
  end

  def draw
    ellipse_mode CENTER
    ellipse      @x,@y,@w,@h
  end
end

def setup
  size 320, 240

  frame_rate 15 #1sec15frameとしています。

  @dot = Ellipse.new width/2,height/2,10,10
end

def draw
  background 0

  no_fill
  stroke 255

  @dot.draw
end

円が属する世界が無いので、世界を作成。

class World2D
  def initialize
    @ellipse = []
  end

  def set_ellipse e
    @ellipse << e
  end
    
  def draw
    @ellipse.each{|e|
      e.draw
    }
  end
end

class Ellipse
  attr_accessor :x,:y,:w,:h
  
  def initialize x,y,width,height
    @x,@y,@w,@h = x,y,width,height
  end

  def draw
    ellipse_mode CENTER
    ellipse      @x,@y,@w,@h
  end
end

$world = World2D.new

def setup
  size 320, 240

  frame_rate 15

  $world.set_ellipse(Ellipse.new(width/2,height/2,10,10))
end

def draw
  background 0

  no_fill
  stroke 255

  $world.draw
end

 ellipseの表示をworld2d経由に変更しただけ。多分一般的な実装だと、geometory*1とcollision*2は分離するんだろうけど*3、現状は同じとして、実装していきます。
 で、チャッチャッと力を与えます。

class World2D
  def initialize
    @ellipse = []
  end

  def set_ellipse e
    @ellipse << e
  end

  def set_gravity obj
    obj.y = obj.y + 1
  end
    
  def draw
    @ellipse.each{|e|
      set_gravity e
      e.draw
    }
  end
end

って、書いていて思ったがvecmath使いたい*A*

*1:表示図形

*2:衝突判定領域

*3:ODEとかそうだったと思う