Class: AnimatedWaveDemo
- Defined in:
- sample/demos-en/aniwave.rb,
sample/demos-jp/aniwave.rb
Overview
animated wave
Instance Method Summary collapse
-
#basicMotion ⇒ Object
Basic motion handler.
-
#initialize(frame, dir = :left) ⇒ AnimatedWaveDemo
constructor
A new instance of AnimatedWaveDemo.
-
#move ⇒ Object
animation control.
-
#reverser ⇒ Object
Oscillation handler.
- #stop ⇒ Object
Constructor Details
#initialize(frame, dir = :left) ⇒ AnimatedWaveDemo
Returns a new instance of AnimatedWaveDemo.
50 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 |
# File 'sample/demos-en/aniwave.rb', line 50 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.(TkBindTag.new('Destroy'){ @timer.stop }) end |
Instance Method Details
#basicMotion ⇒ Object
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.
84 85 86 87 88 89 90 91 92 93 94 |
# File 'sample/demos-en/aniwave.rb', line 84 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 ⇒ Object
animation control
108 109 110 |
# File 'sample/demos-en/aniwave.rb', line 108 def move @timer.start end |
#reverser ⇒ Object
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.)
99 100 101 102 103 104 105 |
# File 'sample/demos-en/aniwave.rb', line 99 def reverser if @waveCoords[0][1] < 10 @direction = :right elsif @waveCoords[-1][1] < 10 @direction = :left end end |
#stop ⇒ Object
112 113 114 |
# File 'sample/demos-en/aniwave.rb', line 112 def stop @timer.stop end |