animated wave

animated wave

Methods
B
M
N
R
S
Class Public methods
new(frame, dir=:left)
# File ext/tk/sample/demos-en/aniwave.rb, line 51
def initialize(frame, dir=:left)
  @direction = dir

  # create canvas widget
  @c = TkCanvas.new(frame, :width=>300, :height=>200,
                    :background=>'black')
  @c.pack(:padx=>10, :pady=>10, :expand=>true)

  # Creates a coordinates list of a wave.
  @waveCoords = []
  @backupCoords = []
  n = 0
  (-10..300).step(5){|n| @waveCoords << [n, 100]; @backupCoords << [n, 100] }
  n = 305
  @waveCoords << [n, 0]; @backupCoords << [n, 0]
  @waveCoords << [n+5, 200]; @backupCoords << [n+5, 200]
  @coordsLen = @waveCoords.length

  # Create a smoothed line and arrange for its coordinates to be the
  # contents of the variable waveCoords.
  @line = TkcLine.new(@c, @waveCoords,
                      :width=>1, :fill=>'green', :smooth=>true)

  # Main animation "loop".
  # Theoretically 100 frames-per-second (==10ms between frames)
  @timer = TkTimer.new(10){ basicMotion; reverser }

  # Arrange for the animation loop to stop when the canvas is deleted
  @c.bindtags_unshift(TkBindTag.new('Destroy'){ @timer.stop })
end
Instance Public methods
basicMotion()

Basic motion handler. Given what direction the wave is travelling in, it advances the y coordinates in the coordinate-list one step in that direction.

# File ext/tk/sample/demos-en/aniwave.rb, line 85
def basicMotion
  @backupCoords, @waveCoords = @waveCoords, @backupCoords
  (0...@coordsLen).each{|idx|
    if @direction == :left
      @waveCoords[idx][1] = @backupCoords[(idx+1 == @coordsLen)? 0: idx+1][1]
    else
      @waveCoords[idx][1] = @backupCoords[(idx == 0)? -1: idx-1][1]
    end
  }
  @line.coords(@waveCoords)
end
move()

animation control

# File ext/tk/sample/demos-en/aniwave.rb, line 109
def move
  @timer.start
end
reverser()

Oscillation handler. This detects whether to reverse the direction of the wave by checking to see if the peak of the wave has moved off the screen (whose size we know already.)

# File ext/tk/sample/demos-en/aniwave.rb, line 100
def reverser
  if @waveCoords[0][1] < 10
    @direction = :right
  elsif @waveCoords[-1][1] < 10
    @direction = :left
  end
end
stop()
# File ext/tk/sample/demos-en/aniwave.rb, line 113
def stop
  @timer.stop
end