# label msg = TkLabel.new($goldberg_demo) {
font 'Arial 10'
wraplength '4i'
justify 'left'
text "This is a demonstration of just how complex you can make your animations become. Click the ball to start things moving!\n\n\"Man will always find a difficult means to perform a simple task\"\n - Rube Goldberg"
} msg.pack('side'=>'top')
# frame TkFrame.new($goldberg_demo) {|frame|
TkButton.new(frame) {
text 'Dismiss'
command proc{
tmppath = $goldberg_demo
$goldberg_demo = nil
tmppath.destroy
}
}.pack('side'=>'left', 'expand'=>'yes')
TkButton.new(frame) {
text 'See Code'
command proc{showCode 'goldberg'}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
#########################################
# label msg = TkLabel.new($goldberg_demo) {
font 'Arial 10'
wraplength '4i'
justify 'left'
text "これは、あなたが自分のアニメーションをいかに入り組んだものにできるかを示すというだけのためのデモです。ボールをクリックすれば物が動き始めます!\n\n\"Man will always find a difficult means to perform a simple task\"\n - Rube Goldberg"
} msg.pack('side'=>'top')
# frame TkFrame.new($goldberg_demo) {|frame|
TkButton.new(frame) {
text '閉じる'
command proc{
tmppath = $goldberg_demo
$goldberg_demo = nil
tmppath.destroy
}
}.pack('side'=>'left', 'expand'=>'yes')
TkButton.new(frame) {
text 'コード参照'
command proc{showCode 'goldberg'}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
#########################################
- #
- A
- B
- C
- D
- G
- H
- M
- N
- R
- S
# File ext/tk/sample/demos-en/goldberg.rb, line 93 def initialize(parent) @parent = parent @S = {} @S['title'] = 'Tk Goldberg' @S['speed'] = TkVariable.new(5) @S['cnt'] = TkVariable.new(0) @S['message'] = TkVariable.new("\\nWelcome\\nto\\nRuby/Tk") @S['pause'] = TkVariable.new @S['details'] = TkVariable.new(true) @S['mode'] = TkVariable.new(:MSTART, :symbol) # :MSTART, :MGO, :MPAUSE, :MSSTEP, :MBSTEP, :MDONE, :MDEBUG # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 @speed = [1, 10, 20, 50, 80, 100, 150, 200, 300, 400, 500] # colors @C = {} @C['fg'] = 'black' # @C['bg'] = 'gray75' @C['bg'] = 'cornflowerblue' @C['0'] = 'white'; @C['1a'] = 'darkgreen'; @C['1b'] = 'yellow' @C['2'] = 'red'; @C['3a'] = 'green'; @C['3b'] = 'darkblue' @C['4'] = @C['fg']; @C['5a'] = 'brown'; @C['5b'] = 'white' @C['6'] = 'magenta'; @C['7'] = 'green'; @C['8'] = @C['fg'] @C['9'] = 'blue4'; @C['10a'] = 'white'; @C['10b'] = 'cyan' @C['11a'] = 'yellow'; @C['11b'] = 'mediumblue'; @C['12'] = 'tan2' @C['13a'] = 'yellow'; @C['13b'] = 'red'; @C['14'] = 'white' @C['15a'] = 'green'; @C['15b'] = 'yellow'; @C['16'] = 'gray65' @C['17'] = '#A65353'; @C['18'] = @C['fg']; @C['19'] = 'gray50' @C['20'] = 'cyan'; @C['21'] = 'gray65'; @C['22'] = @C['20'] @C['23a'] = 'blue'; @C['23b'] = 'red'; @C['23c'] = 'yellow' @C['24a'] = 'red'; @C['24b'] = 'white'; @STEP = TkVariable.new_hash @STEP.default_value_type = :numeric @XY = {} @XY6 = { '-1'=>[366, 207], '-2'=>[349, 204], '-3'=>[359, 193], '-4'=>[375, 192], '-5'=>[340, 190], '-6'=>[349, 177], '-7'=>[366, 177], '-8'=>[380, 176], '-9'=>[332, 172], '-10'=>[342, 161], '-11'=>[357, 164], '-12'=>[372, 163], '-13'=>[381, 149], '-14'=>[364, 151], '-15'=>[349, 146], '-16'=>[333, 148], '0'=>[357, 219], '1'=>[359, 261], '2'=>[359, 291], '3'=>[359, 318], '4'=>[361, 324], '5'=>[365, 329], '6'=>[367, 334], '7'=>[367, 340], '8'=>[366, 346], '9'=>[364, 350], '10'=>[361, 355], '11'=>[359, 370], '12'=>[359, 391], '13,0'=>[360, 456], '13,1'=>[376, 456], '13,2'=>[346, 456], '13,3'=>[330, 456], '13,4'=>[353, 444], '13,5'=>[368, 443], '13,6'=>[339, 442], '13,7'=>[359, 431], '13,8'=>[380, 437], '13,9'=>[345, 428], '13,10'=>[328, 434], '13,11'=>[373, 424], '13,12'=>[331, 420], '13,13'=>[360, 417], '13,14'=>[345, 412], '13,15'=>[376, 410], '13,16'=>[360, 403] } @timer = TkTimer.new(@speed[@S['speed'].numeric]){|timer| timer.set_interval(go) } do_display reset # Start everything going @timer.start end
# File ext/tk/sample/demos-en/goldberg.rb, line 1941 def _round_poly2(x0, y0, x1, y1, x2, y2, radius) d = 2 * radius maxr = 0.75 v1x = x0 - x1 v1y = y0 - y1 v2x = x2 - x1 v2y = y2 - y1 vlen1 = Math.sqrt(v1x*v1x + v1y*v1y) vlen2 = Math.sqrt(v2x*v2x + v2y*v2y) if d > maxr * vlen1 d = maxr * vlen1 end if d > maxr * vlen2 d = maxr * vlen2 end xy = [] xy << (x1 + d * v1x / vlen1) << (y1 + d * v1y / vlen1) xy << x1 << y1 xy << (x1 + d * v2x / vlen2) << (y1 + d * v2y / vlen2) return xy end
# File ext/tk/sample/demos-en/goldberg.rb, line 402 def about msg = "Ruby/Tk Version ::\nby Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)\n\n" msg += "Original Version ::\n" msg += "#{@S['title']}\nby Keith Vetter, March 2003\n(Reproduced by kind permission of the author)\n\n" msg += "Man will always find a difficult means to perform a simple task" msg += "\nRube Goldberg" Tk.messageBox(:message=>msg, :title=>'About') end
# File ext/tk/sample/demos-en/goldberg.rb, line 315 def active_GUI(var1, var2, op) st = {false=>:disabled, true=>:normal} m = @S['mode'].to_sym @S['pause'].value = (m == :MPAUSE) @start.state(st[m != :MGO]) @pause.state(st[m != :MSTART && m != :MDONE]) @step.state(st[m != :MGO && m != :MDONE]) @bstep.state(st[m != :MGO && m != :MDONE]) @reset.state(st[m != :MSTART]) if @S['details'].bool Tk.grid(@f_details, :in=>@details, :row=>2, :sticky=>:ew) else Tk.grid_forget(@f_details) end @speed_scale.label("Speed: #{@S['speed'].value}") end
Helper functions
# File ext/tk/sample/demos-en/goldberg.rb, line 216 def do_ctrl_frame @start = Tk::Button.new(@parent, :text=>'Start', :bd=>6, :command=>proc{do_button(0)}) if font = @start['font'] @start.font(font.weight('bold')) end @pause = TkCheckbutton.new(@parent, :text=>'Pause', :font=>font, :command=>proc{do_button(1)}, :relief=>:raised, :variable=>@S['pause']) @step = TkButton.new(@parent, :text=>'Single Step', :font=>font, :command=>proc{do_button(2)}) @bstep = TkButton.new(@parent, :text=>'Big Step', :font=>font, :command=>proc{do_button(4)}) @reset = TkButton.new(@parent, :text=>'Reset', :font=>font, :command=>proc{do_button(3)}) @details = TkFrame.new(@parent, :bd=>2, :relief=>:ridge) @detail = TkCheckbutton.new(@parent, :text=>'Details', :font=>font, :relief=>:raised, :variable=>@S['details']) @msg_entry = TkEntry.new(@parent, :textvariable=>@S['message'], :justify=>:center) @speed_scale = TkScale.new(@parent, :orient=>:horizontal, :from=>1, :to=>10, :font=>font, :variable=>@S['speed'], :bd=>2, :relief=>:ridge, :showvalue=>false) @about = TkButton.new(@parent, :text=>'About', :command=>proc{about}, :font=>font) Tk.grid(@start, :in=>@ctrl, :row=>0, :sticky=>:ew) @ctrl.grid_rowconfigure(1, :minsize=>10) Tk.grid(@pause, :in=>@ctrl, :row=>2, :sticky=>:ew) Tk.grid(@step, :in=>@ctrl, :sticky=>:ew) Tk.grid(@bstep, :in=>@ctrl, :sticky=>:ew) Tk.grid(@reset, :in=>@ctrl, :sticky=>:ew) @ctrl.grid_rowconfigure(10, :minsize=>20) Tk.grid(@details, :in=>@ctrl, :row=>11, :sticky=>:ew) Tk.grid(@detail, :in=>@details, :row=>0, :sticky=>:ew) @ctrl.grid_rowconfigure(50, :weight=>1) @S['mode'].trace('w', proc{|*args| active_GUI(*args)}) @S['details'].trace('w', proc{|*args| active_GUI(*args)}) @S['speed'].trace('w', proc{|*args| active_GUI(*args)}) Tk.grid(@msg_entry, :in=>@ctrl, :row=>98, :sticky=>:ew, :pady=>5) Tk.grid(@speed_scale, :in=>@ctrl, :row=>99, :sticky=>:ew) Tk.grid(@about, :in=>@ctrl, :row=>100, :sticky=>:ew) @reset.bind('3'){@S['mode'].value = -1} # Debugging end
# File ext/tk/sample/demos-en/goldberg.rb, line 269 def do_detail_frame @f_details = TkFrame.new(@details) @label = TkLabel.new(@f_details, :textvariable=>@S['cnt'], :bd=>1, :relief=>:solid, :bg=>'white') Tk.grid(@label, '-', '-', '-', :sticky=>:ew, :row=>0) idx = 1 loop { break unless respond_to?("move#{idx}") l = TkLabel.new(@f_details, :text=>idx, :anchor=>:e, :width=>2, :bd=>1, :relief=>:solid, :bg=>'white') @STEP[idx] = 0 ll = TkLabel.new(@f_details, :textvariable=>@STEP.ref(idx), :width=>5, :bd=>1, :relief=>:solid, :bg=>'white') row = (idx + 1)/2 col = ((idx + 1) & 1) * 2 Tk.grid(l, :sticky=>:ew, :row=>row, :column=>col) Tk.grid(ll, :sticky=>:ew, :row=>row, :column=>(col + 1)) idx += 1 } @f_details.grid_columnconfigure(1, :weight=>1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 162 def do_display() @ctrl = TkFrame.new(@parent, :relief=>:ridge, :bd=>2, :padx=>5, :pady=>5) @screen = TkFrame.new(@parent, :bd=>2, :relief=>:raised).pack(:side=>:left, :fill=>:both, :expand=>true) @canvas = TkCanvas.new(@parent, :width=>850, :height=>700, :bg=>@C['bg'], :highlightthickness=>0){ scrollregion([0, 0, 1000, 1000]) # Kludge to move everything up yview_moveto(0.05) }.pack(:in=>@screen, :side=>:top, :fill=>:both, :expand=>true) @canvas.bind('3'){ @pause.invoke } @canvas.bind('Destroy'){ @timer.stop } do_ctrl_frame do_detail_frame # msg = TkLabel.new(@parent, :bg=>@C['bg'], :fg=>'white') { msg = Tk::Label.new(@parent, :bg=>@C['bg'], :fg=>'white') { font 'Arial 10' wraplength 600 justify 'left' text "This is a demonstration of just how complex you can make your animations become. Click the ball to start things moving!\n\"Man will always find a difficult means to perform a simple task\" - Rube Goldberg" } msg.place(:in=>@canvas, :relx=>0, :rely=>0, :anchor=>:nw) frame = TkFrame.new(@parent, :bg=>@C['bg']) # TkButton.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) { Tk::Button.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) { text 'Dismiss' command proc{ tmppath = $goldberg_demo $goldberg_demo = nil tmppath.destroy } }.pack('side'=>'left') # TkButton.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) { Tk::Button.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) { text 'See Code' command proc{showCode 'goldberg'} }.pack('side'=>'left', 'padx'=>5) # @show = TkButton.new(frame, :text=>'>>', :command=>proc{show_ctrl}, @show = Tk::Button.new(frame, :text=>'>>', :command=>proc{show_ctrl}, :bg=>@C['bg'], :activebackground=>@C['bg']) @show.pack('side'=>'left') frame.place(:in=>@canvas, :relx=>1, :rely=>0, :anchor=>:ne) Tk.update end
START HERE! banner
# File ext/tk/sample/demos-en/goldberg.rb, line 417 def draw0 color = @C['0'] TkcText.new(@canvas, [579, 119], :text=>'START HERE!', :fill=>color, :anchor=>:w, :tag=>'I0', :font=>['Times Roman', 12, :italic, :bold]) TkcLine.new(@canvas, [719, 119, 763, 119], :tag=>'I0', :fill=>color, :width=>5, :arrow=>:last, :arrowshape=>[18, 18, 5]) @canvas.itembind('I0', '1'){ start } end
Dropping ball
# File ext/tk/sample/demos-en/goldberg.rb, line 445 def draw1 color = @C['1a'] color2 = @C['1b'] TkcPolygon.new(@canvas, [ 844, 133, 800, 133, 800, 346, 820, 346, 820, 168, 844, 168, 844, 133 ], :width=>3, :fill=>color, :outline=>'') TkcPolygon.new(@canvas, [ 771, 133, 685, 133, 685, 168, 751, 168, 751, 346, 771, 346, 771, 133 ], :width=>3, :fill=>color, :outline=>'') TkcOval.new(@canvas, box(812, 122, 9), :tag=>'I1', :fill=>color2, :outline=>'') @canvas.itembind('I1', '1'){ start } end
Boat
# File ext/tk/sample/demos-en/goldberg.rb, line 957 def draw10 color = @C['10a'] color2 = @C['10b'] xy = [191, 230, 233, 230, 233, 178, 191, 178] # Sail TkcPolygon.new(@canvas, xy, :fill=>color, :width=>3, :outline=>@C['fg'], :tag=>'I10') xy = box(209, 204, 31) # Front TkcArc.new(@canvas, xy, :outline=>'', :fill=>color, :style=>:pie, :start=>120, :extent=>120, :tag=>'I10') TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :start=>120, :extent=>120, :tag=>'I10') xy = box(249, 204, 31) # Back TkcArc.new(@canvas, xy, :outline=>'', :fill=>@C['bg'], :width=>3, :style=>:pie, :start=>120, :extent=>120, :tag=>'I10') TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :start=>120, :extent=>120, :tag=>'I10') xy = [200, 171, 200, 249] # Mast TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I10') xy = [159, 234, 182, 234] # Bow sprit TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I10') xy = [180, 234, 180, 251, 220, 251] # Hull TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>6, :tag=>'I10') xy = [92, 255, 221, 255] # Waves sine(xy, 2, 25, :fill=>color2, :width=>1, :tag=>'I10w') xy = @canvas.coords('I10w')[4..-5] # Water xy.concat([222, 266, 222, 277, 99, 277]) TkcPolygon.new(@canvas, xy, :fill=>color2, :outline=>color2) xy = [222, 266, 222, 277, 97, 277, 97, 266] # Water bottom TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = box(239, 262, 17) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :start=>95, :extent=>103) xy = box(76, 266, 21) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :extent=>190) end
2nd ball drop
# File ext/tk/sample/demos-en/goldberg.rb, line 1018 def draw11 color = @C['11a'] color2 = @C['11b'] xy = [23, 264, 55, 591] # Color the down tube TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>'') xy = box(71, 460, 48) # Color the outer loop TkcOval.new(@canvas, xy, :fill=>color, :outline=>'') xy = [55, 264, 55, 458] # Top right side TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = [55, 504, 55, 591] # Bottom right side TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = box(71, 460, 48) # Outer loop TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :start=>110, :extent=>-290, :tag=>'I11i') xy = box(71, 460, 16) # Inner loop TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>'', :width=>3, :tag=>'I11i') TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>@C['bg'], :width=>3) xy = [23, 264, 23, 591] # Left side TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = box(1, 266, 23) # Top left curve TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :extent=>90) xy = box(75, 235, 9) # The ball TkcOval.new(@canvas, xy, :fill=>color2, :outline=>'', :width=>3, :tag=>'I11') end
Hand
# File ext/tk/sample/demos-en/goldberg.rb, line 1066 def draw12 xy = [ 20, 637, 20, 617, 20, 610, 20, 590, 40, 590, 40, 590, 60, 590, 60, 610, 60, 610 ] xy.concat([60, 610, 65, 620, 60, 631]) # Thumb xy.concat([60, 631, 60, 637, 60, 662, 60, 669, 52, 669, 56, 669, 50, 669, 50, 662, 50, 637]) y0 = 637 # Bumps for fingers y1 = 645 50.step(21, -10){|x| x1 = x - 5 x2 = x - 10 xy << x << y0 << x1 << y1 << x2 << y0 } TkcPolygon.new(@canvas, xy, :fill=>@C['12'], :outline=>@C['fg'], :smooth=>true, :tag=>'I12', :width=>3) end
Fax
# File ext/tk/sample/demos-en/goldberg.rb, line 1098 def draw13 color = @C['13a'] xy = [86, 663, 149, 663, 149, 704, 50, 704, 50, 681, 64, 681, 86, 671] xy2 = [ 784, 663, 721, 663, 721, 704, 820, 704, 820, 681, 806, 681, 784, 671 ] radii = [2, 9, 9, 8, 5, 5, 2] round_poly(@canvas, xy, radii, :width=>3, :outline=>@C['fg'], :fill=>color) round_poly(@canvas, xy2, radii, :width=>3, :outline=>@C['fg'], :fill=>color) xy = [56, 677] x, y = xy TkcRectangle.new(@canvas, box(x, y, 4), :fill=>'', :outline=>@C['fg'], :width=>3, :tag=>'I13') xy = [809, 677] x, y = xy TkcRectangle.new(@canvas, box(x, y, 4), :fill=>'', :outline=>@C['fg'], :width=>3, :tag=>'I13R') xy = [112, 687] # Label TkcText.new(@canvas, xy, :text=>'FAX', :fill=>@C['fg'], :font=>['Times Roman', 12, :bold]) xy = [762, 687] TkcText.new(@canvas, xy, :text=>'FAX', :fill=>@C['fg'], :font=>['Times Roman', 12, :bold]) xy = [138, 663, 148, 636, 178, 636] # Paper guide TkcLine.new(@canvas, xy, :smooth=>true, :fill=>@C['fg'], :width=>3) xy = [732, 663, 722, 636, 692, 636] TkcLine.new(@canvas, xy, :smooth=>true, :fill=>@C['fg'], :width=>3) sine([149, 688, 720, 688], 5, 15, :tag=>'I13_s', :fill=>@C['fg'], :width=>3) end
Paper in fax
# File ext/tk/sample/demos-en/goldberg.rb, line 1159 def draw14 color = @C['14'] xy = [102, 661, 113, 632, 130, 618] # Left paper edge TkcLine.new(@canvas, xy, :smooth=>true, :fill=>color, :width=>3, :tag=>'I14L_0') xy = [148, 629, 125, 640, 124, 662] # Right paper edge TkcLine.new(@canvas, xy, :smooth=>true, :fill=>color, :width=>3, :tag=>'I14L_1') draw14a('L') xy = [ 768.0, 662.5, 767.991316225, 662.433786215, 767.926187912, 662.396880171 ] TkcLine.new(@canvas, xy, :smooth=>true, :fill=>color, :width=>3, :tag=>'I14R_0') @canvas.lower('I14R_0') # NB. these numbers are VERY sensitive, you must start with final size # and shrink down to get the values xy = [ 745.947897349, 662.428358855, 745.997829056, 662.452239237, 746.0, 662.5 ] TkcLine.new(@canvas, xy, :smooth=>true, :fill=>color, :width=>3, :tag=>'I14R_1') @canvas.lower('I14R_1') end
# File ext/tk/sample/demos-en/goldberg.rb, line 1185 def draw14a(side) color = @C['14'] xy = @canvas.coords("I14#{side}_0") xy2 = @canvas.coords("I14#{side}_1") x0, y0, x1, y1, x2, y2 = xy x3, y3, x4, y4, x5, y5 = xy2 zz = [ x0, y0, x0, y0, xy, x2, y2, x2, y2, x3, y3, x3, y3, xy2, x5, y5, x5, y5 ].flatten @canvas.delete("I14#{side}") TkcPolygon.new(@canvas, zz, :tag=>"I14#{side}", :smooth=>true, :fill=>color, :outline=>color, :width=>3) @canvas.lower("I14#{side}") end
Light beam
# File ext/tk/sample/demos-en/goldberg.rb, line 1232 def draw15 color = @C['15a'] xy = [824, 599, 824, 585, 820, 585, 829, 585] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I15a') xy = [789, 599, 836, 643] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3) xy = [778, 610, 788, 632] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3) xy = [766, 617, 776, 625] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3) xy = [633, 600, 681, 640] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3) xy = [635, 567, 657, 599] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>2) xy = [765, 557, 784, 583] TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>2) sine([658, 580, 765, 580], 3, 15, :tag=>'I15_s', :fill=>@C['fg'], :width=>3) end
Bell
# File ext/tk/sample/demos-en/goldberg.rb, line 1284 def draw16 color = @C['16'] xy = [722, 485, 791, 556] TkcRectangle.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>3) xy = box(752, 515, 25) # Bell TkcOval.new(@canvas, xy, :fill=>color, :outline=>'black', :tag=>'I16b', :width=>2) xy = box(752, 515, 5) # Bell button TkcOval.new(@canvas, xy, :fill=>'black', :outline=>'black', :tag=>'I16b') xy = [784, 523, 764, 549] # Clapper TkcLine.new(@canvas, xy, :width=>3, :tag=>'I16c', :fill=>@C['fg']) xy = box(784, 523, 4) TkcOval.new(@canvas, xy, :fill=>@C['fg'], :outline=>@C['fg'], :tag=>'I16d') end
Cat
# File ext/tk/sample/demos-en/goldberg.rb, line 1319 def draw17 color = @C['17'] xy = [584, 556, 722, 556] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = [584, 485, 722, 485] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = [664, 523, 717, 549] # Body TkcArc.new(@canvas, xy, :outline=>@C['fg'], :fill=>color, :width=>3, :style=>:chord, :start=>128, :extent=>260, :tag=>'I17') xy = [709, 554, 690, 543] # Paw TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>color, :width=>3, :tag=>'I17') xy = [657, 544, 676, 555] TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>color, :width=>3, :tag=>'I17') xy = box(660, 535, 15) # Lower face TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :style=>:arc, :start=>150, :extent=>240, :tag=>'I17_') TkcArc.new(@canvas, xy, :outline=>'', :fill=>color, :width=>1, :style=>:chord, :start=>150, :extent=>240, :tag=>'I17_') xy = [674, 529, 670, 513, 662, 521, 658, 521, 650, 513, 647, 529] # Ears TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') TkcPolygon.new(@canvas, xy, :fill=>color, :outline=>'', :width=>1, :tag=>['I17_', 'I17_c']) xy = [652, 542, 628, 539] # Whiskers TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [652, 543, 632, 545] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [652, 546, 632, 552] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [668, 543, 687, 538] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>['I17_', 'I17_w']) xy = [668, 544, 688, 546] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>['I17_', 'I17_w']) xy = [668, 547, 688, 553] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>['I17_', 'I17_w']) xy = [649, 530, 654, 538, 659, 530] # Left eye TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :smooth=>true, :tag=>'I17') xy = [671, 530, 666, 538, 661, 530] # Right eye TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :smooth=>true, :tag=>'I17') xy = [655, 543, 660, 551, 665, 543] # Mouth TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :smooth=>true, :tag=>'I17') end
Sling shot
# File ext/tk/sample/demos-en/goldberg.rb, line 1420 def draw18 color = @C['18'] xy = [721, 506, 627, 506] # Sling hold TkcLine.new(@canvas, xy, :width=>4, :fill=>@C['fg'], :tag=>'I18') xy = [607, 500, 628, 513] # Sling rock TkcOval.new(@canvas, xy, :fill=>color, :outline=>'', :tag=>'I18a') xy = [526, 513, 606, 507, 494, 502] # Sling band TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>4, :tag=>'I18b') xy = [485, 490, 510, 540, 510, 575, 510, 540, 535, 491] # Sling TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>6) end
Water pipe
# File ext/tk/sample/demos-en/goldberg.rb, line 1472 def draw19 color = @C['19'] xx = [[249, 181], [155, 118], [86, 55], [22, 0]] xx.each{|x1, x2| TkcRectangle.new(@canvas, x1, 453, x2, 467, :fill=>color, :outline=>'', :tag=>'I19') TkcLine.new(@canvas, x1, 453, x2, 453, :fill=>@C['fg'], :width=>1) # Pipe top TkcLine.new(@canvas, x1, 467, x2, 467, :fill=>@C['fg'], :width=>1) # Pipe bottom } @canvas.raise('I11i') xy = box(168, 460, 16) # Bulge by the joint TkcOval.new(@canvas, xy, :fill=>color, :outline=>'') TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>21, :extent=>136) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>-21, :extent=>-130) xy = [249, 447, 255, 473] # First joint 26x6 TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = box(257, 433, 34) # Bend up TkcArc.new(@canvas, xy, :outline=>'', :fill=>color, :width=>1, :style=>:pie, :start=>0, :extent=>-91) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>0, :extent=>-90) xy = box(257, 433, 20) TkcArc.new(@canvas, xy, :outline=>'', :fill=>@C['bg'], :width=>1, :style=>:pie, :start=>0, :extent=>-92) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>0, :extent=>-90) xy = box(257, 421, 34) # Bend left TkcArc.new(@canvas, xy, :outline=>'', :fill=>color, :width=>1, :style=>:pie, :start=>0, :extent=>91) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>0, :extent=>90) xy = box(257, 421, 20) TkcArc.new(@canvas, xy, :outline=>'', :fill=>@C['bg'], :width=>1, :style=>:pie, :start=>0, :extent=>90) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>0, :extent=>90) xy = box(243, 421, 34) # Bend down TkcArc.new(@canvas, xy, :outline=>'', :fill=>color, :width=>1, :style=>:pie, :start=>90, :extent=>90) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>90, :extent=>90) xy = box(243, 421, 20) TkcArc.new(@canvas, xy, :outline=>'', :fill=>@C['bg'], :width=>1, :style=>:pie, :start=>90, :extent=>90) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>1, :style=>:arc, :start=>90, :extent=>90) xy = [270, 427, 296, 433] # 2nd joint bottom TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = [270, 421, 296, 427] # 2nd joint top TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = [249, 382, 255, 408] # Third joint right TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = [243, 382, 249, 408] # Third joint left TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = [203, 420, 229, 426] # Last joint TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>1) xy = box(168, 460, 6) # Handle joint TkcOval.new(@canvas, xy, :fill=>@C['fg'], :outline=>'', :tag=>'I19a') xy = [168, 460, 168, 512] # Handle bar TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>5, :tag=>'I19b') end
Lighting the match
# File ext/tk/sample/demos-en/goldberg.rb, line 479 def draw2 color = @C['2'] # Fulcrum TkcPolygon.new(@canvas, [750, 369, 740, 392, 760, 392], :fill=>@C['fg'], :outline=>@C['fg']) # Strike box TkcRectangle.new(@canvas, [628, 335, 660, 383], :fill=>'', :outline=>@C['fg']) (0..2).each{|y| yy = 335 + y*16 TkcBitmap.new(@canvas, [628, yy], :bitmap=>'gray25', :anchor=>:nw, :foreground=>@C['fg']) TkcBitmap.new(@canvas, [644, yy], :bitmap=>'gray25', :anchor=>:nw, :foreground=>@C['fg']) } # Lever TkcLine.new(@canvas, [702, 366, 798, 366], :fill=>@C['fg'], :width=>6, :tag=>'I2_0') # R strap TkcLine.new(@canvas, [712, 363, 712, 355], :fill=>@C['fg'], :width=>3, :tag=>'I2_1') # L strap TkcLine.new(@canvas, [705, 363, 705, 355], :fill=>@C['fg'], :width=>3, :tag=>'I2_2') # Match stick TkcLine.new(@canvas, [679, 356, 679, 360, 717, 360, 717, 356, 679, 356], :fill=>@C['fg'], :width=>3, :tag=>'I2_3') # Match head TkcPolygon.new(@canvas, [ 671, 352, 677.4, 353.9, 680, 358.5, 677.4, 363.1, 671, 365, 664.6, 363.1, 662, 358.5, 664.6, 353.9 ], :fill=>color, :outline=>color, :tag=>'I2_4') end
Water pouring
Bucket
# File ext/tk/sample/demos-en/goldberg.rb, line 1593 def draw21 color = @C['21'] xy = [217, 451, 244, 490] # Right handle TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :tag=>'I21_a') xy = [201, 467, 182, 490] # Left handle TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :tag=>'I21_a') xy = [245, 490, 237, 535] # Right side xy2 = [189, 535, 181, 490] # Left side TkcPolygon.new(@canvas, xy + xy2, :fill=>color, :outline=>'', :tag=>['I21', 'I21f']) TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2, :tag=>'I21') TkcLine.new(@canvas, xy2, :fill=>@C['fg'], :width=>2, :tag=>'I21') xy = [182, 486, 244, 498] # Top TkcOval.new(@canvas, xy, :fill=>color, :outline=>'', :width=>2, :tag=>['I21', 'I21f']) TkcOval.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>2, :tag=>['I21', 'I21t']) xy = [189, 532, 237, 540] # Bottom TkcOval.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>2, :tag=>['I21', 'I21b']) end
Bucket drop
Blow dart
# File ext/tk/sample/demos-en/goldberg.rb, line 1666 def draw23 color = @C['23a'] color2 = @C['23b'] color3 = @C['23c'] xy = [185, 623, 253, 650] # Block TkcRectangle.new(@canvas, xy, :fill=>'black', :outline=>@C['fg'], :width=>2, :tag=>'I23a') xy = [187, 592, 241, 623] # Balloon TkcOval.new(@canvas, xy, :outline=>'', :fill=>color, :tag=>'I23b') TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :tag=>'I23b', :style=>:arc, :start=>12, :extent=>336) xy = [239, 604, 258, 589, 258, 625, 239, 610] # Balloon nozzle TkcPolygon.new(@canvas, xy, :outline=>'', :fill=>color, :tag=>'I23b') TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I23b') xy = [285, 611, 250, 603] # Dart body TkcOval.new(@canvas, xy, :fill=>color2, :outline=>@C['fg'], :width=>3, :tag=>'I23d') xy = [249, 596, 249, 618, 264, 607, 249, 596] # Dart tail TkcPolygon.new(@canvas, xy, :fill=>color3, :outline=>@C['fg'], :width=>3, :tag=>'I23d') xy = [249, 607, 268, 607] # Dart detail TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I23d') xy = [285, 607, 305, 607] # Dart needle TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I23d') end
Balloon
# File ext/tk/sample/demos-en/goldberg.rb, line 1715 def draw24 color = @C['24a'] xy = [366, 518, 462, 665] # Balloon TkcOval.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3, :tag=>'I24') xy = [414, 666, 414, 729] # String TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I24') xy = [410, 666, 404, 673, 422, 673, 418, 666] # Nozzle TkcPolygon.new(@canvas, xy, :fill=>color, :outline=>@C['fg'], :width=>3, :tag=>'I24') xy = [387, 567, 390, 549, 404, 542] # Reflections TkcLine.new(@canvas, xy, :fill=>@C['fg'], :smooth=>true, :width=>2, :tag=>'I24') xy = [395, 568, 399, 554, 413, 547] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :smooth=>true, :width=>2, :tag=>'I24') xy = [403, 570, 396, 555, 381, 553] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :smooth=>true, :width=>2, :tag=>'I24') xy = [408, 564, 402, 547, 386, 545] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :smooth=>true, :width=>2, :tag=>'I24') end
Weight and pulleys
# File ext/tk/sample/demos-en/goldberg.rb, line 564 def draw3 color = @C['3a'] color2 = @C['3b'] xy = [ [602, 296], [577, 174], [518, 174] ] xy.each{|x, y| # 3 Pulleys TkcOval.new(@canvas, box(x, y, 13), :fill=>color, :outline=>@C['fg'], :width=>3) TkcOval.new(@canvas, box(x, y, 2), :fill=>@C['fg'], :outline=>@C['fg']) } # Wall to flame TkcLine.new(@canvas, [750, 309, 670, 309], :tag=>'I3_s', :width=>3, :fill=>@C['fg'], :smooth=>true) # Flame to pulley 1 TkcLine.new(@canvas, [670, 309, 650, 309], :tag=>'I3_0', :width=>3, :fill=>@C['fg'], :smooth=>true) TkcLine.new(@canvas, [650, 309, 600, 309], :tag=>'I3_1', :width=>3, :fill=>@C['fg'], :smooth=>true) # Pulley 1 half way to 2 TkcLine.new(@canvas, [589, 296, 589, 235], :tag=>'I3_2', :width=>3, :fill=>@C['fg']) # Pulley 1 other half to 2 TkcLine.new(@canvas, [589, 235, 589, 174], :width=>3, :fill=>@C['fg']) # Across the top TkcLine.new(@canvas, [577, 161, 518, 161], :width=>3, :fill=>@C['fg']) # Down to weight TkcLine.new(@canvas, [505, 174, 505, 205], :tag=>'I3_w', :width=>3, :fill=>@C['fg']) # Draw the weight as 2 circles, two rectangles and 1 rounded rectangle x1, y1, x2, y2 = [515, 207, 495, 207] TkcOval.new(@canvas, box(x1, y1, 6), :tag=>'I3_', :fill=>color2, :outline=>color2) TkcOval.new(@canvas, box(x2, y2, 6), :tag=>'I3_', :fill=>color2, :outline=>color2) TkcRectangle.new(@canvas, x1, y1 - 6, x2, y2 + 6, :tag=>'I3_', :fill=>color2, :outline=>color2) TkcPolygon.new(@canvas, round_rect([492, 220, 518, 263], 15), :smooth=>true, :tag=>'I3_', :fill=>color2, :outline=>color2) TkcLine.new(@canvas, [500, 217, 511, 217], :tag=>'I3_', :fill=>color2, :width=>10) # Bottom weight target TkcLine.new(@canvas, [502, 393, 522, 393, 522, 465], :tag=>'I3__', :fill=>@C['fg'], :joinstyle=>:miter, :width=>10) end
Cage and door
# File ext/tk/sample/demos-en/goldberg.rb, line 643 def draw4 color = @C['4'] x0, y0, x1, y1 = [527, 356, 611, 464] # Horizontal bars y0.step(y1, 12){|y| TkcLine.new(@canvas, [x0, y, x1, y], :fill=>color, :width=>1) } # Vertical bars x0.step(x1, 12){|x| TkcLine.new(@canvas, [x, y0, x, y1], :fill=>color, :width=>1) } # Swing gate TkcLine.new(@canvas, [518, 464, 518, 428], :tag=>'I4', :fill=>color, :width=>1) end
Mouse
# File ext/tk/sample/demos-en/goldberg.rb, line 675 def draw5 color = @C['5a'] color2 = @C['5b'] xy = [377, 248, 410, 248, 410, 465, 518, 465] # Mouse course xy.concat [518, 428, 451, 428, 451, 212, 377, 212] TkcPolygon.new(@canvas, xy, :fill=>color2, :outline=>@C['fg'], :width=>3) xy = [ 534.5, 445.5, 541, 440, 552, 436, 560, 436, 569, 440, 574, 446, 575, 452, 574, 454, 566, 456, 554, 456, 545, 456, 537, 454, 530, 452 ] TkcPolygon.new(@canvas, xy, :tag=>['I5', 'I5_0'], :fill=>color) TkcLine.new(@canvas, [573, 452, 592, 458, 601, 460, 613, 456], # Tail :tag=>['I5', 'I5_1'], :fill=>color, :smooth=>true, :width=>3) xy = box(540, 446, 2) # Eye xy = [540, 444, 541, 445, 541, 447, 540, 448, 538, 447, 538, 445] TkcPolygon.new(@canvas, xy, :tag=>['I5', 'I5_2'], :fill=>@C['bg'], :outline=>'', :smooth=>true) xy = [538, 454, 535, 461] # Front leg TkcLine.new(@canvas, xy, :tag=>['I5', 'I5_3'], :fill=>color, :width=>2) xy = [566, 455, 569, 462] # Back leg TkcLine.new(@canvas, xy, :tag=>['I5', 'I5_4'], :fill=>color, :width=>2) xy = [544, 455, 545, 460] # 2nd front leg TkcLine.new(@canvas, xy, :tag=>['I5', 'I5_5'], :fill=>color, :width=>2) xy = [560, 455, 558, 460] # 2nd back leg TkcLine.new(@canvas, xy, :tag=>['I5', 'I5_6'], :fill=>color, :width=>2) end
Dropping gumballs
# File ext/tk/sample/demos-en/goldberg.rb, line 734 def draw6 color = @C['6'] xy = [324, 130, 391, 204] # Ball holder xy = round_rect(xy, 10) TkcPolygon.new(@canvas, xy, :smooth=>true, :outline=>@C['fg'], :width=>3, :fill=>color) xy = [339, 204, 376, 253] # Below the ball holder TkcRectangle.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :fill=>color, :tag=>'I6c') xy = box(346, 339, 28) TkcOval.new(@canvas, xy, :fill=>color, :outline=>'') # Roter TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>2, :style=>:arc, :start=>80, :extent=>205) TkcArc.new(@canvas, xy, :outline=>@C['fg'], :width=>2, :style=>:arc, :start=>-41, :extent=>85) xy = box(346, 339, 15) # Center of rotor TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>@C['fg'], :tag=>'I6m') xy = [352, 312, 352, 254, 368, 254, 368, 322] # Top drop to rotor TkcPolygon.new(@canvas, xy, :fill=>color, :outline=>'') TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2) xy = [353, 240, 367, 300] # Poke bottom hole TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>'') xy = [341, 190, 375, 210] # Poke another hole TkcRectangle.new(@canvas, xy, :fill=>color, :outline=>'') xy = [ 368, 356, 368, 403, 389, 403, 389, 464, 320, 464, 320, 403, 352, 403, 352, 366 ] TkcPolygon.new(@canvas, xy, :fill=>color, :outline=>'', :width=>2) # Below rotor TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>2) xy = box(275, 342, 7) # On/off rotor TkcOval.new(@canvas, xy, :outline=>@C['fg'], :fill=>@C['fg']) xy = [276, 334, 342, 325] # Fan belt top TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = [276, 349, 342, 353] # Fan belt bottom TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3) xy = [337, 212, 337, 247] # What the mouse pushes TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I6_') xy = [392, 212, 392, 247] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I6_') xy = [337, 230, 392, 230] TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>7, :tag=>'I6_') who = -1 # All the balls colors = %w(red cyan orange green blue darkblue) colors *= 3 (0..16).each{|i| loc = -i color = colors[i] x, y = @XY6["#{loc}"] TkcOval.new(@canvas, box(x, y, 5), :fill=>color, :outline=>color, :tag=>"I6_b#{i}") } draw6a(12) # The wheel end
# File ext/tk/sample/demos-en/goldberg.rb, line 796 def draw6a(beta) @canvas.delete('I6_0') ox, oy = [346, 339] (0..3).each{|i| b = beta + i * 45 x, y = rotate_c(28, 0, 0, 0, b) xy = [ox + x, oy + y, ox - x, oy - y] TkcLine.new(@canvas, xy, :tag=>'I6_0', :fill=>@C['fg'], :width=>2) } end
On/off switch
# File ext/tk/sample/demos-en/goldberg.rb, line 853 def draw7 color = @C['7'] xy = [198, 306, 277, 374] # Box TkcRectangle.new(@canvas, xy, :outline=>@C['fg'], :width=>2, :fill=>color, :tag=>'I7z') @canvas.lower('I7z') xy = [275, 343, 230, 349] TkcLine.new(@canvas, xy, :tag=>'I7', :fill=>@C['fg'], :arrow=>:last, :arrowshape=>[23, 23, 8], :width=>6) xy = [225, 324] # On button x, y = xy TkcOval.new(@canvas, box(x, y, 3), :fill=>@C['fg'], :outline=>@C['fg']) xy = [218, 323] # On text font = ['Times Roman', 8] TkcText.new(@canvas, xy, :text=>'on', :anchor=>:e, :fill=>@C['fg'], :font=>font) xy = [225, 350] # Off button x, y = xy TkcOval.new(@canvas, box(x, y, 3), :fill=>@C['fg'], :outline=>@C['fg']) xy = [218, 349] # Off text TkcText.new(@canvas, xy, :text=>'off', :anchor=>:e, :fill=>@C['fg'], :font=>font) end
Electricity to the fan
Fan
# File ext/tk/sample/demos-en/goldberg.rb, line 911 def draw9 color = @C['9'] xy = [266, 194, 310, 220] TkcOval.new(@canvas, xy, :outline=>color, :fill=>color) xy = [280, 209, 296, 248] TkcOval.new(@canvas, xy, :outline=>color, :fill=>color) xy = [ 288, 249, 252, 249, 260, 240, 280, 234, 296, 234, 316, 240, 324, 249, 288, 249 ] TkcPolygon.new(@canvas, xy, :fill=>color, :smooth=>true) xy = [248, 205, 265, 214, 264, 205, 265, 196] # Spinner TkcPolygon.new(@canvas, xy, :fill=>color) xy = [255, 206, 265, 234] # Fan blades TkcOval.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>3, :tag=>'I9_0') xy = [255, 176, 265, 204] TkcOval.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>3, :tag=>'I9_0') xy = [255, 206, 265, 220] TkcOval.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>1, :tag=>'I9_1') xy = [255, 190, 265, 204] TkcOval.new(@canvas, xy, :fill=>'', :outline=>@C['fg'], :width=>1, :tag=>'I9_1') end
Each Move## keeps its state info in STEP, this retrieves and increments it
# File ext/tk/sample/demos-en/goldberg.rb, line 358 def go(who = nil) now = Tk::Clock.clicks(:miliseconds) if who # Start here for debugging @S['active'] = [who] @S['mode'].value = :MGO end return if @S['mode'].to_sym == :MDEBUG # Debugging # If not paused, do the next move n = next_step if @S['mode'].to_sym != :MPAUSE @S['mode'].value = :MPAUSE if @S['mode'].to_sym == :MSSTEP # Single step @S['mode'].value = :MSSTEP if @S['mode'].to_sym == :MBSTEP && n # big step elapsed = Tk::Clock.clicks(:miliseconds) - now delay = @speed[@S['speed'].to_i] - elapsed delay = 1 if delay <= 0 return delay end
# File ext/tk/sample/demos-en/goldberg.rb, line 1578 def h20(y, f) color = @C['20'] @canvas.delete('I20') sine([208, 428, 208, y], 4, f, :tag=>['I20', 'I20s'], :width=>3, :fill=>color, :smooth=>true) TkcLine.new(@canvas, @canvas.coords('I20s'), :width=>3, :fill=>color, :smooth=>1, :tag=>['I20', 'I20a']) TkcLine.new(@canvas, @canvas.coords('I20s'), :width=>3, :fill=>color, :smooth=>1, :tag=>['I20', 'I20b']) @canvas.move('I20a', 8, 0) @canvas.move('I20b', 16, 0) end
# File ext/tk/sample/demos-en/goldberg.rb, line 427 def move0(step = nil) step = get_step(0, step) if @S['mode'].to_sym != :MSTART # Start the ball rolling move_abs('I0', [-100, -100]) # Hide the banner return 2 end pos = [ [673, 119], [678, 119], [683, 119], [688, 119], [693, 119], [688, 119], [683, 119], [678, 119] ] step = step % pos.length move_abs('I0', pos[step]) return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 462 def move1(step = nil) step = get_step(1, step) pos = [ [807, 122], [802, 122], [797, 123], [793, 124], [789, 129], [785, 153], [785, 203], [785, 278, :x], [785, 367], [810, 392], [816, 438], [821, 503], [824, 585, :y], [838, 587], [848, 593], [857, 601], [-100, -100] ] return 0 if step >= pos.length where = pos[step] move_abs('I1', where) move15a if where[2] == :y return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 998 def move10(step = nil) step = get_step(10, step) pos = [ [195, 212], [193, 212], [190, 212], [186, 212], [181, 212], [176, 212], [171, 212], [166, 212], [161, 212], [156, 212], [151, 212], [147, 212], [142, 212], [137, 212], [132, 212, :x], [127, 212], [121, 212], [116, 212], [111, 212] ] return 0 if step >= pos.length where = pos[step] move_abs('I10', where) return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1049 def move11(step = nil) step = get_step(11, step) pos = [ [75, 235], [70, 235], [65, 237], [56, 240], [46, 247], [38, 266], [38, 296], [38, 333], [38, 399], [38, 475], [74, 496], [105, 472], [100, 437], [65, 423], [-100, -100], [38, 505], [38, 527, :x], [38, 591] ] return 0 if step >= pos.length where = pos[step] move_abs('I11', where) return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1136 def move13(step = nil) step = get_step(13, step) numsteps = 7 if step == numsteps + 2 move_abs('I13_star', [-100, -100]) @canvas.itemconfigure('I13R', :fill=>@C['13b'], :width=>2) return 2 end if step == 0 # Button down @canvas.delete('I13') sparkle([-100, -100], 'I13_star') # Create off screen return 1 end x0, y0 = anchor('I13_s', :w) x1, y1 = anchor('I13_s', :e) x = x0 + (x1 - x0) * (step - 1) / numsteps.to_f move_abs('I13_star', [x, y0]) return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1202 def move14(step = nil) step = get_step(14, step) # Paper going down sc = 0.9 - 0.05*step if sc < 0.3 @canvas.delete('I14L') return 0 end ox, oy = @canvas.coords('I14L_0') @canvas.scale('I14L_0', ox, oy, sc, sc) ox, oy = @canvas.coords('I14L_1')[-2..-1] @canvas.scale('I14L_1', ox, oy, sc, sc) draw14a('L') # Paper going up sc = 0.35 + 0.05*step sc = 1/sc ox, oy = @canvas.coords('I14R_0') @canvas.scale('I14R_0', ox, oy, sc, sc) ox, oy = @canvas.coords('I14R_1')[-2..-1] @canvas.scale('I14R_1', ox, oy, sc, sc) draw14a('R') return((step == 10)? 3: 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1261 def move15(step = nil) step = get_step(15, step) numsteps = 6 if step == numsteps + 2 move_abs('I15_star', [-100, -100]) return 2 end if step == 0 # Break the light beam sparkle([-100, -100], 'I15_star') xy = [765, 621, 745, 621] @canvas.coords('I15', xy) return 1 end x0, y0 = anchor('I15_s', :w) x1, y1 = anchor('I15_s', :e) x = x0 + (x1 - x0) * (step - 1) / numsteps.to_f move_abs('I15_star', [x, y0]) return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1300 def move16(step = nil) step = get_step(16, step) # Note: we never stop ox, oy = [760, 553] if (step & 1).nonzero? beta = 12 @canvas.move('I16b', 3, 0) else beta = -12 @canvas.move('I16b', -3, 0) end rotate_item('I16c', ox, oy, beta) rotate_item('I16d', ox, oy, beta) return ((step == 1)? 3: 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1375 def move17(step = nil) step = get_step(17, step) if step == 0 @canvas.delete('I17') # Delete most of the cat xy = [655, 543, 660, 535, 665, 543] # Mouth TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :smooth=>true, :tag=>'I17_') xy = box(654, 530, 4) # Left eye TkcOval.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :fill=>'', :tag=>'I17_') xy = box(666, 530, 4) # Right eye TkcOval.new(@canvas, xy, :outline=>@C['fg'], :width=>3, :fill=>'', :tag=>'I17_') @canvas.move('I17_', 0, -20) # Move face up xy = [652, 528, 652, 554] # Front leg TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [670, 528, 670, 554] # 2nd front leg TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [ # Body 675, 506, 694, 489, 715, 513, 715, 513, 715, 513, 716, 525, 716, 525, 716, 525, 706, 530, 695, 530, 679, 535, 668, 527, 668, 527, 668, 527, 675, 522, 676, 517, 677, 512 ] TkcPolygon.new(@canvas, xy, :fill=>@canvas.itemcget('I17_c', :fill), :outline=>@C['fg'], :width=>3, :smooth=>true, :tag=>'I17_') xy = [716, 514, 716, 554] # Back leg TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [694, 532, 694, 554] # 2nd back leg TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :tag=>'I17_') xy = [715, 514, 718, 506, 719, 495, 716, 488] # Tail TkcLine.new(@canvas, xy, :fill=>@C['fg'], :width=>3, :smooth=>true, :tag=>'I17_') @canvas.raise('I17w') # Make whiskers visible @canvas.move('I17_', -5, 0) # Move away from the wall a bit return 2 end return 0 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1434 def move18(step = nil) step = get_step(18, step) pos = [ [587, 506], [537, 506], [466, 506], [376, 506], [266, 506, :x], [136, 506], [16, 506], [-100, -100] ] b = [] b[0] = [490, 502, 719, 507, 524, 512] # Band collapsing b[1] = [ 491, 503, 524, 557, 563, 505, 559, 496, 546, 506, 551, 525, 553, 536, 538, 534, 532, 519, 529, 499 ] b[2] = [ 491, 503, 508, 563, 542, 533, 551, 526, 561, 539, 549, 550, 530, 500 ] b[3] = [ 491, 503, 508, 563, 530, 554, 541, 562, 525, 568, 519, 544, 530, 501 ] return 0 if step >= pos.length if step == 0 @canvas.delete('I18') @canvas.itemconfigure('I18b', :smooth=>true) end if b[step] @canvas.coords('I18b', b[step]) end where = pos[step] move_abs('I18a', where) return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 520 def move2(step = nil) step = get_step(2, step) stages = [0, 0, 1, 2, 0, 2, 1, 0, 1, 2, 0, 2, 1] xy = [] xy[0] = [ 686, 333, 692, 323, 682, 316, 674, 309, 671, 295, 668, 307, 662, 318, 662, 328, 671, 336 ] xy[1] = [ 687, 331, 698, 322, 703, 295, 680, 320, 668, 297, 663, 311, 661, 327, 671, 335 ] xy[2] = [ 686, 331, 704, 322, 688, 300, 678, 283, 678, 283, 674, 298, 666, 309, 660, 324, 672, 336 ] if step >= stages.length @canvas.delete('I2') return 0 end if step == 0 # Rotate the match beta = 20 ox, oy = anchor('I2_0', :s) # Where to pivot i = 0 until @canvas.find_withtag("I2_#{i}").empty? rotate_item("I2_#{i}", ox, oy, beta) i += 1 end # For the flame TkcPolygon.new(@canvas, [], :tag=>'I2', :smooth=>true, :fill=>@C['2']) return 1 end @canvas.coords('I2', xy[stages[step]]) return ((step == 7)? 3: 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1559 def move20(step = nil) step = get_step(20, step) pos = [451, 462, 473, 484, 496, 504, 513, 523, 532] freq = [20, 40, 40, 40, 40, 40, 40, 40, 40] pos = [ [451, 20], [462, 40], [473, 40], [484, 40], [496, 40], [504, 40], [513, 40], [523, 40], [532, 40, :x] ] return 0 if step >= pos.length @canvas.delete('I20') where = pos[step] y, f = where h20(y, f) return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1617 def move21(step = nil) step = get_step(21, step) numsteps = 30 return 0 if step >= numsteps x1, y1, x2, y2 = @canvas.coords('I21b') # lx1, ly1, lx2, ly2 = @canvas.coords('I21t') lx1, ly1, lx2, ly2 = [183, 492, 243, 504] f = step / numsteps.to_f y2 = y2 - 3 xx1 = x1 + (lx1 - x1) * f yy1 = y1 + (ly1 - y1) * f xx2 = x2 + (lx2 - x2) * f yy2 = y2 + (ly2 - y2) * f @canvas.itemconfigure('I21b', :fill=>@C['20']) @canvas.delete('I21w') TkcPolygon.new(@canvas, x2, y2, x1, y1, xx1, yy1, xx2, yy1, :tag=>['I21', 'I21w'], :outline=>'', :fill=>@C['20']) @canvas.lower('I21w', 'I21') @canvas.raise('I21b') @canvas.lower('I21f') return((step == numsteps - 1)? 3: 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1650 def move22(step = nil) step = get_step(22, step) pos = [[213, 513], [213, 523], [213, 543, :x], [213, 583], [213, 593]] @canvas.itemconfigure('I21f', :fill=>@C['22']) if step == 0 return 0 if step >= pos.length where = pos[step] move_abs('I21', where) h20(where[1], 40) @canvas.delete('I21_a') # Delete handles return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1694 def move23(step = nil) step = get_step(23, step) pos = [ [277, 607], [287, 607], [307, 607, :x], [347, 607], [407, 607], [487, 607], [587, 607], [687, 607], [787, 607], [-100, -100] ] return 0 if step >= pos.length if step <= 1 ox, oy = anchor('I23a', :n) @canvas.scale('I23b', ox, oy, 0.9, 0.5) end where = pos[step] move_abs('I23d', where) return 3 if where[2] == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 1740 def move24(step = nil) step = get_step(24, step) return 0 if step > 4 return 2 if step == 4 if step == 0 @canvas.delete('I24') # Exploding balloon xy = [ 347, 465, 361, 557, 271, 503, 272, 503, 342, 574, 259, 594, 259, 593, 362, 626, 320, 737, 320, 740, 398, 691, 436, 738, 436, 739, 476, 679, 528, 701, 527, 702, 494, 627, 548, 613, 548, 613, 480, 574, 577, 473, 577, 473, 474, 538, 445, 508, 431, 441, 431, 440, 400, 502, 347, 465, 347, 465 ] TkcPolygon.new(@canvas, xy, :tag=>'I24', :fill=>@C['24b'], :outline=>@C['24a'], :width=>10, :smooth=>true) msg = Tk.subst(@S['message'].value) TkcText.new(@canvas, centroid('I24'), :text=>msg, :tag=>['I24', 'I24t'], :justify=>:center, :font=>['Times Roman', 18, :bold]) return 1 end @canvas.itemconfigure('I24t', :font=>['Times Roman', 18 + 6*step, :bold]) @canvas.move('I24', 0, -60) ox, oy = centroid('I24') @canvas.scale('I24', ox, oy, 1.25, 1.25) return 1 end
Displaying the message
Collapsing balloon
# File ext/tk/sample/demos-en/goldberg.rb, line 1784 def move26(step = nil) step = get_step(26, step) if step >= 3 @canvas.delete('I24', 'I26') TkcText.new(@canvas, 430, 740, :anchor=>:s, :tag=>'I26', :text=>'click to continue', :font=>['Times Roman', 24, :bold]) @canvas.bind('1', proc{reset}) return 4 end ox, oy = centroid('I24') @canvas.scale('I24', ox, oy, 0.8, 0.8) @canvas.move('I24', 0, 60) @canvas.itemconfigure('I24t', :font=>['Times Roman', 30 - 6*step, :bold]) return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 619 def move3(step = nil) step = get_step(3, step) pos = [ [505, 247], [505, 297], [505, 386.5], [505, 386.5] ] rope = [] rope[0] = [750, 309, 729, 301, 711, 324, 690, 300] rope[1] = [750, 309, 737, 292, 736, 335, 717, 315, 712, 320] rope[2] = [750, 309, 737, 309, 740, 343, 736, 351, 725, 340] rope[3] = [750, 309, 738, 321, 746, 345, 742, 356] return 0 if step >= pos.length @canvas.delete("I3_#{step}") # Delete part of the rope move_abs('I3_', pos[step]) # Move weight down @canvas.coords('I3_s', rope[step]) # Flapping rope end @canvas.coords('I3_w', [505, 174].concat(pos[step])) if step == 2 @canvas.move('I3__', 0, 30) return 2 end return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 711 def move5(step = nil) step = get_step(5, step) pos = [ [553, 452], [533, 452], [513, 452], [493, 452], [473, 452], [463, 442, 30], [445.5, 441.5, 30], [425.5, 434.5, 30], [422, 414], [422, 394], [422, 374], [422, 354], [422, 334], [422, 314], [422, 294], [422, 274, -30], [422, 260.5, -30, :x], [422.5, 248.5, -28], [425, 237] ] return 0 if step >= pos.length x, y, beta, nxt = pos[step] move_abs('I5', [x, y]) if beta ox, oy = centroid('I5_0') (0..6).each{|id| rotate_item("I5_#{id}", ox, oy, beta) } end return 3 if nxt == :x return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 807 def move6(step = nil) step = get_step(6, step) return 0 if step > 62 if step < 2 # Open gate for balls to drop @canvas.move('I6_', -7, 0) if step == 1 # Poke a hole xy = [348, 226, 365, 240] TkcRectangle.new(@canvas, xy, :fill=>@canvas.itemcget('I6c', :fill), :outline=>'') end return 1 end s = step - 1 # Do the gumball drop dance (0..(((s - 1)/3).to_i)).each{|i| tag = "I6_b#{i}" break if @canvas.find_withtag(tag).empty? loc = s - 3*i if @XY6["#{loc},#{i}"] move_abs(tag, @XY6["#{loc},#{i}"]) elsif @XY6["#{loc}"] move_abs(tag, @XY6["#{loc}"]) end } if s % 3 == 1 first = (s + 2)/3 i = first loop { tag = "I6_b#{i}" break if @canvas.find_withtag(tag).empty? loc = first - i move_abs(tag, @XY6["#{loc}"]) i += 1 } end if s >= 3 # Rotate the motor idx = s % 3 draw6a(12 + s * 15) end return((s == 3)? 3 : 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 893 def move8(step = nil) step = get_step(8, step) return 0 if step > 3 if step == 0 sparkle(anchor('I8_s', :s), 'I8') return 1 elsif step == 1 move_abs('I8', anchor('I8_s', :c)) elsif step == 2 move_abs('I8', anchor('I8_s', :n)) else @canvas.delete('I8') end return((step == 2)? 3: 1) end
# File ext/tk/sample/demos-en/goldberg.rb, line 940 def move9(step = nil) step = get_step(9, step) if (step & 1).nonzero? @canvas.itemconfigure('I9_0', :width=>4) @canvas.itemconfigure('I9_1', :width=>1) @canvas.lower('I9_1', 'I9_0') else @canvas.itemconfigure('I9_0', :width=>1) @canvas.itemconfigure('I9_1', :width=>4) @canvas.lower('I9_0', 'I9_1') end return 3 if step == 0 return 1 end
# File ext/tk/sample/demos-en/goldberg.rb, line 375 def next_step retval = false # Return value if @S['mode'].to_sym != :MSTART && @S['mode'].to_sym != :MDONE @S['cnt'].numeric += 1 end alive = [] @S['active'].each{|who| who = who.to_i n = send("move#{who}") if (n & 1).nonzero? # This guy still alive alive << who end if (n & 2).nonzero? # Next guy is active alive << (who + 1) retval = true end if (n & 4).nonzero? # End of puzzle flag @S['mode'].value = :MDONE # Done mode @S['active'] = [] # No more animation return true end } @S['active'] = alive return retval end
# File ext/tk/sample/demos-en/goldberg.rb, line 1829 def rotate_c(x, y, ox, oy, beta) # rotates vector (ox,oy)->(x,y) by beta degrees clockwise x -= ox # Shift to origin y -= oy beta = beta * Math.atan(1) * 4 / 180.0 # Radians xx = x * Math.cos(beta) - y * Math.sin(beta) # Rotate yy = x * Math.sin(beta) + y * Math.cos(beta) xx += ox # Shift back yy += oy [xx, yy] end
# File ext/tk/sample/demos-en/goldberg.rb, line 1915 def round_poly(canv, xy, radii, opts) lenXY = xy.length lenR = radii.length if lenXY != 2*lenR raise "wrong number of vertices and radii" end knots = [] x0 = xy[-2]; y0 = xy[-1] x1 = xy[0]; y1 = xy[1] xy << xy[0] << xy[1] 0.step(lenXY - 1, 2){|i| radius = radii[i/2] r = canv.winfo_pixels(radius) x2 = xy[i+2]; y2 = xy[i+3] z = _round_poly2(x0, y0, x1, y1, x2, y2, r) knots.concat(z) x0 = x1; y0 = y1 x1 = x2; y1 = y2 } TkcPolygon.new(canv, knots, {:smooth=>true}.update(opts)) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1891 def round_rect(xy, radius, opts={}) x0, y0, x3, y3 = xy r = @canvas.winfo_pixels(radius) d = 2 * r # Make sure that the radius of the curve is less than 3/8 size of the box! maxr = 0.75 if d > maxr * (x3 - x0) d = maxr * (x3 - x0) end if d > maxr * (y3 - y0) d = maxr * (y3 - y0) end x1 = x0 + d x2 = x3 - d y1 = y0 + d y2 = y3 - d xy = [x0, y0, x1, y0, x2, y0, x3, y0, x3, y1, x3, y2] xy.concat([x3, y3, x2, y3, x1, y3, x0, y3, x0, y2, x0, y1]) return xy end
# File ext/tk/sample/demos-en/goldberg.rb, line 1871 def sine(xy0, amp, freq, opts = {}) x0, y0, x1, y1 = xy0 step = 2 xy = [] if y0 == y1 # Horizontal x0.step(x1, step){|x| beta = (x - x0) * 2 * Math::PI / freq y = y0 + amp * Math.sin(beta) xy << x << y } else y0.step(y1, step){|y| beta = (y - y0) * 2 * Math::PI / freq x = x0 + amp * Math.sin(beta) xy << x << y } end TkcLine.new(@canvas, xy, opts) end
# File ext/tk/sample/demos-en/goldberg.rb, line 1968 def sparkle(oxy, tag) xy = [ [299, 283], [298, 302], [295, 314], [271, 331], [239, 310], [242, 292], [256, 274], [281, 273] ] xy.each{|x, y| TkcLine.new(@canvas, 271, 304, x, y, :fill=>'white', :width=>3, :tag=>tag) } move_abs(tag, oxy) end