class PinBall
  attr_accessor :x
  attr_accessor :y  
  attr_accessor :prev_x
  attr_accessor :prev_y    
  attr_accessor :velX
  attr_accessor :velY   
  attr_accessor :accX
  attr_accessor :accY   
  attr_accessor :forces
  attr_accessor :impulses
  attr_accessor :mass
  attr_accessor :non_collide
  
  def initialize(mass , x,y,velX ,velY)
    @x = x
    @y = y
    @velX = velX
    @velY = velY
    @accX = 0.0
    @accY = 0.0  
    @prev_x = 0.0
    @prev_y = 0.0    
    @mass = mass
    @forces = [[0.0,0.0]]
    @impulses = [[0.0,0.0]]
    @non_collide = false
  end
  
  def vel
    [@velX,@velY]
  end  
  
  def update
    update_acc
    update_vel 
    @prev_x = x
    @prev_y = y 
    @x += @velX 
    @y += @velY

    reflect_ball
  end 
  
  def clear_forces
    @forces = [[0.0,0.0]]
  end  

   def clear_impulses
    @impulses = [[0.0,0.0]]
  end   
  
  # ● 辺と衝突しているか？
  def collide_edge?(edge)
    return false if @non_collide
    if @prev_x != @x
      (edge.y_value(@prev_x) - @prev_y) * (edge.y_value(@x) - @y) < 0
    else  
      (edge.x_value(@prev_y) - @prev_x) * (edge.x_value(@y) - @x) < 0
    end  
  end

  
  def reflect_ball
    @velX *= -1 if @x <= 20 && @velX < 0
    @velX *= -1 if @x >= 500 && @velX > 0    
    @velY *= -0.8 if @y >= 400 && @velY > 0 

  end  
  
  def update_acc
    @forces.each do |force|
      @accX = force[0] / @mass
      @accY = force[1] / @mass
    end
  end  
  def update_vel
    @velX += @accX
    @velY += @accY      
    @impulses.each do |impulse|
      @velX += impulse[0]
      @velY += impulse[1]
    end
  end   
end  