class Scene_PinBall < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
   
    super
#~     create_background
    @pinball= PinBall.new(1.0 , 150.0 , 150.0 , 1.0 , -6.0)
    vertex1 = PinBallVertex.new(500.0 , 0.0)
    vertex2 = PinBallVertex.new(200.0 , 300.0)
    vertex3 = PinBallVertex.new(0.0 , 100.0)
    @pinballEdge = PinBall_Edge.new( [vertex1 , vertex2] , 0.99)
    @pinballEdge2 = PinBall_Edge.new( [vertex2 , vertex3] , 0.99)    
    @edges = [@pinballEdge, @pinballEdge2]
    create_ball 
    create_lines 
    @actor = $game_party.menu_actor
    
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_ball
    dispose_lines
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_ball 
    @ball_sprite.update
    goto_title if Input.trigger?(:B)
  end

  #--------------------------------------------------------------------------
  # ● 背景の作成
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # ● 背景の解放
  #--------------------------------------------------------------------------
  def dispose_background
    @background_sprite.dispose
  end  
  #--------------------------------------------------------------------------
  # ● ラインの作成
  #--------------------------------------------------------------------------  
  def create_line(x,y ,x2,y2)
    width = (x2 - x).abs
    height = (y2 - y).abs
    sign = (x2 - x)*(y2 - y) > 0 ? 1 : -1
    nx = [x , x2].min
    ny = [y,y2].min
    
    
    return Sprite_PinBallLine.new(@viewport, nx, ny , width,height , sign)
  end    
  
  
  
  def create_lines 
    @line_sprites = @edges.collect do |edge| 
      x = edge.vertices[0].x
      y = edge.vertices[0].y
      x2 = edge.vertices[1].x
      y2 = edge.vertices[1].y      
      
      create_line(x,y ,x2,y2)
    end
  end  
  #--------------------------------------------------------------------------
  # ● ラインの解放
  #--------------------------------------------------------------------------
  def dispose_lines
    @line_sprites.each {|sprite| sprite.dispose}
  end      
  #--------------------------------------------------------------------------
  # ● ボールの作成
  #--------------------------------------------------------------------------  
  def create_ball
    @ball_sprite = Sprite_PinBall.new(@viewport,"Actor2.png" , 1 , @pinball)
  end  
  #--------------------------------------------------------------------------
  # ● ボールの解放
  #--------------------------------------------------------------------------
  def dispose_ball
    @ball_sprite.dispose
  end    
  
  #--------------------------------------------------------------------------
  # ● ボールの更新
  #--------------------------------------------------------------------------
  def update_ball
    @pinball.clear_forces
    @pinball.clear_impulses
    
    @pinball.forces.push([0.0,0.3])
    inpulse_collision_edge(@pinball)
    @pinball.update
  end    
  
  # ● ボールと衝突した辺の取得
  def get_edge_collision(ball)
    @edges.select do |edge|
      interval = intersection_collision_x_interval(ball , edge)
      collision_point = ball.get_point_collision(edge)
      interval[0] <= collision_point[0] && collision_point[0] <= interval[1]
      
    end  
  end  
  
  # ● ボールと衝突した際に辺から受ける激力
  def inpulse_collision_edge(ball)
    return if ball.non_collide
    edges = get_edge_collision(ball)
    return if edges.empty?
    
    tedges = edges.sort_by {|a| ball.collision_time(a)}
    ball.collide_objects = tedges
    return if tedges.empty?
    edge = tedges[0]
    vn = VectorCalc.inner_product(ball.vel ,edge.normalized_normal_vector)
    ball.impulses.push(VectorCalc.scalar_action(-2.0 * ball.mass * vn * edge.restitution, edge.normalized_normal_vector))

#~     ball.non_collide = true
    
  end    
  # ● ボールと衝突した辺の位置
#~   def get_point_collision(ball , edge)
#~     bconst = VectorCalc.inner_product(ball.normal_vector , ball.position)
#~     econst = VectorCalc.inner_product(edge.normal_vector , edge.vertex_position(0))
#~     det = ball.normal_vector[0] * edge.normal_vector[1] - ball.normal_vector[1] * edge.normal_vector[0] 
#~     x = (bconst * edge.normal_vector[1] - econst * ball.normal_vector[1]) / det
#~     y = (econst * ball.normal_vector[0] - bconst * edge.normal_vector[0]) / det
#~     return [x,y]
#~   end   
  
  # ● ボールと衝突した辺の区間の共通部分
  def intersection_collision_x_interval(ball , edge)
    minxb = [ball.destination[0] ,ball.x].min
    maxxb = [ball.destination[0] ,ball.x].max
    minxe = [edge.vertices[0].x ,edge.vertices[1].x].min
    maxxe = [edge.vertices[0].x ,edge.vertices[1].x].max
    
    minresult = [minxb , minxe].max
    maxresult = [maxxb , maxxe].min 
    return [minresult , maxresult]
  end  

  

  #--------------------------------------------------------------------------
  # ● キャラクターのビットマップを設定
  #--------------------------------------------------------------------------
  def set_character_bitmap
    self.bitmap = Cache.character(@character_name)
    sign = @character_name[/^[\!\$]./]
    if sign && sign.include?('$')
      @cw = bitmap.width / 3
      @ch = bitmap.height / 4
    else
      @cw = bitmap.width / 12
      @ch = bitmap.height / 8
    end
    self.ox = @cw / 2
    self.oy = @ch
  end 
  #--------------------------------------------------------------------------
  # ● タイトル画面へ遷移
  #--------------------------------------------------------------------------
  def goto_title
    fadeout_all
    SceneManager.goto(Scene_Title)
  end  
  
end
