練習問題4

Get Version

1.0.0

課題21: 速度

# kadai21.rb
require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
  $x = 0
  $y = 0
end

def display
  x = mouseX
  y = mouseY
  speed = 20.0
  vx = (x - $x)/speed
  vy = (y - $y)/speed
  $x = $x + vx
  $y = $y + vy
  color 100, 0, 0
  circle($x, $y, 50, POLYGON)
end

mainloop

物の位置に加え,速度を導入する.円がマウスのところに近付こうとする.

require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
  $pos=[]
  for i in 0..9
    $pos[i] = [-200 + i * 40, 0]     # 最初の位置を指定する.
  end
end

def display
  x = mouseX
  y = mouseY

  speed = 10.0
  for i in 0..9
    pos = $pos[i]
    vx = (x - pos[0]) / speed     # マウスに吸い寄せられる速度
    vy = (y - pos[1]) / speed
    speed += 2.0                  # 円によって速度が異なるようにする.
    pos[0] = pos[0] + vx          # マウスに吸い寄せられた位置
    pos[1] = pos[1] + vy
    color 100, 0, 0, 10
    circle(pos[0], pos[1], 50, POLYGON)
  end
end

mainloop

配列の使い方を説明する.

require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100

  $pos=[]
  $orgpos=[]
  for i in 0..19
    $pos[i]    = [-200 + i * 40, 0]     # 最初の位置を指定する.
    $orgpos[i] = [-200 + i * 40, 0]     # もう一つ別の配列にも保存する.
  end
end

def display
  x = mouseX
  y = mouseY

  for i in 0..19
    pos    = $pos[i]     # 現在の円の位置
    orgpos = $orgpos[i]  # 元々の位置

    if mouseDown         # ボタンが押されているときだけマウスに吸いつく.
      vx = x - pos[0]
      vy = y - pos[1]
      mag = Math.sqrt(vx * vx + vy * vy)
      mag = mag / 40
      mag = mag * mag + 1
      vx = vx / mag
      vy = vy / mag
      pos[0] = pos[0] + vx
      pos[1] = pos[1] + vy
    end

    speed = 3.0
    vx2 = (orgpos[0] - pos[0]) / speed     # 元々の位置に吸い寄せられる速度
    vy2 = (orgpos[1] - pos[1]) / speed
    pos[0] = pos[0] + vx2                  # マウスに吸い寄せられた位置
    pos[1] = pos[1] + vy2
    color 100, 0, 0, 30
    circle(pos[0], pos[1], 50, POLYGON)
  end
end

mainloop

マウスにすいよせられる円.マウスボタンを押しているときだけ反応する.

require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
  $xpos = []    # 配列を準備する.
  $ypos = []
  for i in 0..9
    $xpos[i] = -200 + i * 40
    $ypos[i] = 0
  end
end

def display
  x = mouseX
  y = mouseY

  speed = 10.0
  for i in 0..9
    vx = (x - $xpos[i]) / speed     # マウスに吸い寄せられる速度
    vy = (y - $ypos[i]) / speed
    speed += 2.0                  # 円によって速度が異なるようにする.
    $xpos[i] = $xpos[i] + vx                  # マウスに吸い寄せられた位置
    $ypos[i] = $ypos[i] + vy
    color 100, 0, 0, 10
    circle($xpos[i], $ypos[i], 50, POLYGON)
  end
end

mainloop

配列の使い方を変更した.

30th June 2007