Class: AnimatedWaveDemo

Inherits:
Object show all
Defined in:
sample/demos-en/aniwave.rb,
sample/demos-jp/aniwave.rb

Overview

animated wave

Instance Method Summary collapse

Constructor Details

#initialize(frame, dir = :left) ⇒ AnimatedWaveDemo

Returns a new instance of AnimatedWaveDemo.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File '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 Method Details

#basicMotionObject

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.



85
86
87
88
89
90
91
92
93
94
95
# File '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

#moveObject

animation control



109
110
111
# File 'sample/demos-en/aniwave.rb', line 109

def move
  @timer.start
end

#reverserObject

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.)



100
101
102
103
104
105
106
# File '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

#stopObject



113
114
115
# File 'sample/demos-en/aniwave.rb', line 113

def stop
  @timer.stop
end