ruby-processing 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ v1.0.6 Inner Classes...
2
+ * Java-style inner classes. Any inner class of a sketch will now have the
3
+ Processing methods and constants proxied down for convenience.
4
+ * Sketches with tiny sizes get displayed in a nicer fashion.
5
+ * New Blue Logo: Ruby-Processing, literally.
6
+ * Moumar contributed a patch for the control_panel library, allowing your
7
+ sliders and buttons to have an initial value.
8
+
1
9
  v1.0.5 Spring Cleaning...
2
10
  * The "Learning Processing" examples are now a separate project, a
3
11
  long-merited change. They'll grow up on their own at
@@ -14,7 +14,7 @@ require 'ruby-processing/helpers/numeric'
14
14
 
15
15
  # The top-level namespace, a home for all Ruby-Processing classes.
16
16
  module Processing
17
- VERSION = [1,0,5] unless defined? Processing::VERSION
17
+ VERSION = [1,0,6] unless defined? Processing::VERSION
18
18
 
19
19
  # Returns the current version of Ruby-Processing.
20
20
  def self.version
@@ -45,11 +45,9 @@ module Processing
45
45
  :key_typed => :keyTyped
46
46
  }
47
47
 
48
- # Override the default width and height to make them a little larger.
49
- DEFAULT_WIDTH = 200
50
- DEFAULT_HEIGHT = 200
51
-
52
48
 
49
+ # When certain special methods get added to the sketch, we need to let
50
+ # Processing call them by their expected Java names.
53
51
  def self.method_added(method_name) #:nodoc:
54
52
  if METHODS_TO_WATCH_FOR.keys.include?(method_name)
55
53
  alias_method METHODS_TO_WATCH_FOR[method_name], method_name
@@ -176,11 +174,12 @@ module Processing
176
174
  proxy_java_fields
177
175
  set_sketch_path unless online?
178
176
  make_accessible_to_the_browser if online?
179
- @width = options[:width] || DEFAULT_WIDTH
180
- @height = options[:height] || DEFAULT_HEIGHT
181
- @title = options[:title] || File.basename(Processing::SKETCH_PATH, '.rb').titleize
182
- @render_mode ||= JAVA2D
183
- @@full_screen ||= options[:full_screen]
177
+ default_title = File.basename(Processing::SKETCH_PATH).sub(/(\.rb|\.pde)$/, '').titleize
178
+ @width = options[:width] || DEFAULT_WIDTH
179
+ @height = options[:height] || DEFAULT_HEIGHT
180
+ @title = options[:title] || default_title
181
+ @render_mode ||= JAVA2D
182
+ @@full_screen ||= options[:full_screen]
184
183
  self.init
185
184
  determine_how_to_display
186
185
  end
@@ -189,6 +188,7 @@ module Processing
189
188
  # Make sure we set the size if we set it before we start the animation thread.
190
189
  def start
191
190
  self.size(@width, @height)
191
+ mix_proxy_into_inner_classes
192
192
  super()
193
193
  end
194
194
 
@@ -309,9 +309,9 @@ module Processing
309
309
  end
310
310
 
311
311
 
312
- # Is the sketch done displaying itself?
313
- def done_displaying?
314
- @done_displaying
312
+ # Is the sketch finished?
313
+ def finished?
314
+ @declared_fields['finished'].value(java_self)
315
315
  end
316
316
 
317
317
 
@@ -351,15 +351,28 @@ module Processing
351
351
  # some methods. Add to this list as needed.
352
352
  def proxy_java_fields
353
353
  @declared_fields = {}
354
- fields = %w(sketchPath key frameRate defaultSize)
354
+ fields = %w(sketchPath key frameRate defaultSize finished)
355
355
  fields.each {|f| @declared_fields[f] = java_class.declared_field(f) }
356
356
  end
357
357
 
358
358
 
359
+ # Mix the Processing::Proxy into any inner classes defined for the
360
+ # sketch, attempting to mimic the behavior of Java's inner classes.
361
+ def mix_proxy_into_inner_classes
362
+ unwanted = /Java::ProcessingCore/
363
+ klass = Processing::App.sketch_class
364
+ klass.constants.each do |name|
365
+ const = klass.const_get name
366
+ next if const.class != Class || const.to_s.match(unwanted)
367
+ const.class_eval 'include Processing::Proxy'
368
+ end
369
+ end
370
+
371
+
359
372
  # Tests to see which display method should run.
360
373
  def determine_how_to_display
361
374
  # Wait for init to get its grey tracksuit on and run a few laps.
362
- sleep 0.02 while default_size? && !@@full_screen
375
+ sleep 0.02 while default_size? && !finished? && !@@full_screen
363
376
 
364
377
  if online?
365
378
  display_in_an_applet
@@ -376,7 +389,6 @@ module Processing
376
389
  end
377
390
 
378
391
 
379
- # Go full screen, if possible
380
392
  def display_full_screen(display)
381
393
  @frame = java.awt.Frame.new(display.default_configuration)
382
394
  mode = display.display_mode
@@ -396,12 +408,17 @@ module Processing
396
408
 
397
409
  def display_in_a_window
398
410
  @frame = javax.swing.JFrame.new(@title)
399
- @frame.add(self)
411
+ @frame.set_layout nil
412
+ @frame.add self
400
413
  @frame.pack
401
414
  @frame.set_default_close_operation(javax.swing.JFrame::EXIT_ON_CLOSE)
402
415
  @frame.set_resizable(false)
403
- # Plus 22 for the height of the window's title bar
404
- @frame.set_size(width, height + 22)
416
+ ins = @frame.get_insets
417
+ hpad, vpad = ins.left + ins.right, ins.top + ins.bottom
418
+ frame_width = [width, MIN_WINDOW_WIDTH].max + hpad
419
+ frame_height = [height, MIN_WINDOW_HEIGHT].max + vpad
420
+ @frame.set_size(frame_width, frame_height)
421
+ set_bounds((frame_width - width) / 2.0, (frame_height - vpad - height) / 2.0, width, height)
405
422
  @frame.show
406
423
  end
407
424
 
@@ -429,5 +446,53 @@ module Processing
429
446
  window.set_member('ruby', ruby)
430
447
  end
431
448
 
432
- end
433
- end
449
+ end # Processing::App
450
+
451
+
452
+ # This module will get automatically mixed in to any inner class of
453
+ # a Processing::App, in order to mimic Java's inner classes, which have
454
+ # unfettered access to the methods defined in the surrounding class.
455
+ module Proxy
456
+
457
+ # Generate the list of method names that we'd like to proxy for inner classes.
458
+ # Nothing camelCased, nothing __internal__, just the Processing API.
459
+ def self.desired_method_names
460
+ bad_method = /__/ # Internal JRuby methods.
461
+ unwanted = PApplet.superclass.instance_methods + Object.instance_methods
462
+ methods = Processing::App.public_instance_methods
463
+ methods.reject {|m| unwanted.include?(m) || bad_method.match(m) }
464
+ end
465
+
466
+
467
+ # Proxy methods through to the sketch. Perhaps extend this to support blocks?
468
+ def self.proxy_methods
469
+ code = desired_method_names.inject('') do |code, method|
470
+ code << <<-EOS
471
+ def #{method}(*args) # def rect(*args)
472
+ $app.#{method} *args # $app.rect *args
473
+ end # end
474
+ EOS
475
+ end
476
+ module_eval(code, "Processing::Proxy", 1)
477
+ end
478
+
479
+
480
+ # Proxy the sketch's constants on to the inner classes.
481
+ def self.proxy_constants
482
+ Processing::App.constants.each do |name|
483
+ Processing::Proxy.const_set(name, Processing::App.const_get(name))
484
+ end
485
+ end
486
+
487
+
488
+ # Don't do all of the work unless we have an inner class that needs it.
489
+ def self.included(inner_class)
490
+ return if @already_defined
491
+ proxy_methods
492
+ proxy_constants
493
+ @already_defined = true
494
+ end
495
+
496
+ end # Processing::Proxy
497
+
498
+ end # Processing
@@ -8,7 +8,7 @@ module Processing
8
8
  class BaseExporter
9
9
  include FileUtils
10
10
 
11
- DEFAULT_DIMENSIONS = {'width' => 200, 'height' => 200}
11
+ DEFAULT_DIMENSIONS = {'width' => '100', 'height' => '100'}
12
12
  DEFAULT_DESCRIPTION = ''
13
13
 
14
14
  # Returns the filepath, basename, and directory name of the sketch.
@@ -28,7 +28,7 @@ module Processing
28
28
  def self.load_and_run_sketch
29
29
  source = self.read_sketch_source
30
30
  has_sketch = !!source.match(/^[^#]*< Processing::App/)
31
- has_methods = !!source.match(/^[^#]*def setup/)
31
+ has_methods = !!source.match(/^[^#]*(def\s+setup|def\s+draw)/)
32
32
 
33
33
  if has_sketch
34
34
  load Processing::SKETCH_PATH
@@ -49,7 +49,7 @@ module Processing
49
49
  return unless app
50
50
  app.no_loop
51
51
  # Wait for the animation thread to finish rendering
52
- sleep 0.05
52
+ sleep 0.075
53
53
  app.close
54
54
  constant_names = app.class.to_s.split(/::/)
55
55
  app_class_name = constant_names.pop
@@ -24,11 +24,14 @@
24
24
  padding: 0;
25
25
  }
26
26
  #container {
27
- width: <%= @width + 14 %>px;
27
+ width: <%= [@width.to_i, 200].max + 14 %>px;
28
28
  margin: 0 auto;
29
29
  margin-top: 20px;
30
+ text-align: center;
30
31
  }
31
32
  #the_applet {
33
+ margin: 0 auto;
34
+ width: <%= @width.to_i %>px;
32
35
  padding: 6px;
33
36
  padding-top: 7px; padding-bottom: 2px;
34
37
  background: #262626 url(images/top.png) top left repeat-x;
@@ -42,7 +45,7 @@
42
45
  }
43
46
  #description {
44
47
  font-size: 12px;
45
- width: <%= @width - 16 if @width %>px;
48
+ width: <%= [@width.to_i, 200].max - 16 %>px;
46
49
  padding: 7px 15px 7px 15px;
47
50
  background: #111;
48
51
  text-align: justify;
@@ -74,7 +77,8 @@
74
77
  <param name="archive" value="<%= @file_list %>" />
75
78
  <param name="jruby.eval" value="ARGV[0] = '<%= @main_file %>'; require 'ruby-processing/runners/run.rb'" />
76
79
  <param name="image" value="images/ruby.jpg" />
77
- <param name="boxbgcolor" value="#000000" />
80
+ <param name="centerimage" value="true" />
81
+ <param name="boxmessage" value="Loading <%= @title %>..." />
78
82
  <param name="lang" value="en" />
79
83
  <param name="mayscript" value="true" />
80
84
  <param name="scriptable" value="true" />
@@ -3,11 +3,12 @@
3
3
  # These controls will set instance variables on the sketches.
4
4
 
5
5
  # You can make sliders, checkboxes, buttons, and drop-down menus.
6
+ # (optionally) pass the range and default value.
6
7
 
7
8
  module ControlPanel
8
9
 
9
10
  class Slider < javax.swing.JSlider
10
- def initialize(name, range, control_panel, proc=nil)
11
+ def initialize(control_panel, name, range, initial_value, proc=nil)
11
12
  min, max = range.begin * 100, range.end * 100
12
13
  super(min, max)
13
14
  set_minor_tick_spacing((max - min).abs / 10)
@@ -20,6 +21,8 @@ module ControlPanel
20
21
  $app.instance_variable_set("@#{name}", value) unless value.nil?
21
22
  proc.call(value) if proc
22
23
  end
24
+ set_value(initial_value ? initial_value*100 : min)
25
+ fire_state_changed
23
26
  end
24
27
 
25
28
  def value
@@ -35,7 +38,7 @@ module ControlPanel
35
38
 
36
39
 
37
40
  class Menu < javax.swing.JComboBox
38
- def initialize(name, elements, control_panel, proc=nil)
41
+ def initialize(control_panel, name, elements, initial_value, proc=nil)
39
42
  super(elements.to_java(:String))
40
43
  set_preferred_size(java.awt.Dimension.new(190, 30))
41
44
  control_panel.add_element(self, name)
@@ -43,6 +46,7 @@ module ControlPanel
43
46
  $app.instance_variable_set("@#{name}", value) unless value.nil?
44
47
  proc.call(value) if proc
45
48
  end
49
+ set_selected_index(initial_value ? elements.index(initial_value) : 0)
46
50
  end
47
51
 
48
52
  def value
@@ -52,7 +56,7 @@ module ControlPanel
52
56
 
53
57
 
54
58
  class Checkbox < javax.swing.JCheckBox
55
- def initialize(name, control_panel, proc=nil)
59
+ def initialize(control_panel, name, proc=nil)
56
60
  @control_panel = control_panel
57
61
  super(name.to_s)
58
62
  set_preferred_size(java.awt.Dimension.new(190, 64))
@@ -71,7 +75,7 @@ module ControlPanel
71
75
 
72
76
 
73
77
  class Button < javax.swing.JButton
74
- def initialize(name, control_panel, proc=nil)
78
+ def initialize(control_panel, name, proc=nil)
75
79
  super(name.to_s)
76
80
  set_preferred_size(java.awt.Dimension.new(170, 64))
77
81
  control_panel.add_element(self, name, false, true)
@@ -99,7 +103,7 @@ module ControlPanel
99
103
  set_resizable false
100
104
  # Need to wait for the sketch to finish sizing...
101
105
  Thread.new do
102
- sleep 0.2 while $app.default_size? || !$app.done_displaying?
106
+ sleep 0.2 while $app.default_size?
103
107
  set_location($app.width + 10, 0)
104
108
  show
105
109
  end
@@ -120,20 +124,21 @@ module ControlPanel
120
124
  dispose
121
125
  end
122
126
 
123
- def slider(name, range=0..100, &block)
124
- slider = Slider.new(name, range, self, block || nil)
127
+ def slider(name, range=0..100, initial_value = nil, &block)
128
+ slider = Slider.new(self, name, range, initial_value, block || nil)
125
129
  end
126
130
 
127
- def menu(name, *elements, &block)
128
- menu = Menu.new(name, elements, self, block || nil)
131
+ def menu(name, elements, initial_value = nil, &block)
132
+ menu = Menu.new(self, name, elements, initial_value, block || nil)
129
133
  end
130
134
 
131
- def checkbox(name, &block)
132
- checkbox = Checkbox.new(name, self, block || nil)
135
+ def checkbox(name, initial_value = nil, &block)
136
+ checkbox = Checkbox.new(self, name, block || nil)
137
+ checkbox.do_click if initial_value == true
133
138
  end
134
139
 
135
140
  def button(name, &block)
136
- button = Button.new(name, self, block || nil)
141
+ button = Button.new(self, name, block || nil)
137
142
  end
138
143
  end
139
144
 
@@ -150,4 +155,4 @@ module ControlPanel
150
155
  end
151
156
 
152
157
 
153
- Processing::App.send :include, ControlPanel::InstanceMethods
158
+ Processing::App.send :include, ControlPanel::InstanceMethods
@@ -1,52 +1,45 @@
1
1
  # Based on http://processing.org/learning/topics/circlecollision.html
2
2
  # by Joe Holt
3
3
 
4
- require 'ruby-processing'
5
-
6
- class Vect2D
7
- attr_accessor :vx, :vy
8
- def initialize(vx = 0.0, vy = 0.0)
9
- @vx = vx
10
- @vy = vy
11
- end
12
- end
13
-
14
-
15
- class Ball
16
- attr_accessor :x, :y, :r, :m, :vec
17
- def initialize(r = 0.0, vec = nil, x = 0.0, y = 0.0)
18
- @x = x
19
- @y = y
20
- @r = r
21
- @m = r*0.1
22
- @vec = vec
23
- end
24
-
25
- def draw
26
- r = @r * 2
27
- P.ellipse @x, @y, r, r
28
- @px = @x
29
- @py = @y
30
- end
31
-
32
- def erase
33
- r = @r * 2
34
- P.rect @px, @py, r, r
35
- end
36
- end
37
-
38
-
39
4
  class Sketch < Processing::App
5
+
6
+ # This inner class demonstrates the use of Ruby-Processing's emulation of
7
+ # Java inner classes. The Balls are able to call Processing::App methods.
8
+ class Ball
9
+ attr_accessor :x, :y, :r, :m, :vec
10
+ def initialize(r = 0.0, vec = nil, x = 0.0, y = 0.0)
11
+ @x, @y, @r = x, y, r
12
+ @m = r * 0.1
13
+ @vec = vec
14
+ end
15
+
16
+ def move
17
+ @x += @vec.x
18
+ @y += @vec.y
19
+ end
20
+
21
+ def draw
22
+ r = @r * 2
23
+ ellipse @x, @y, r, r
24
+ @px, @py = @x, @y
25
+ end
26
+
27
+ def erase
28
+ r = @r * 2
29
+ rect @px, @py, r, r
30
+ end
31
+ end
32
+
40
33
 
41
34
  def setup
42
35
  smooth
43
- noStroke
44
- frameRate 30
45
- rectMode RADIUS
36
+ no_stroke
37
+ frame_rate 30
38
+ rect_mode RADIUS
46
39
 
47
40
  @balls = []
48
- 5.times { @balls << Ball.new(10, Vect2D.new(2.15, -1.35), *emptySpace(15)) }
49
- 2.times { @balls << Ball.new(40, Vect2D.new(-1.65, 0.42), *emptySpace(45)) }
41
+ 5.times { @balls << Ball.new(10, PVector.new(2.15, -1.35), *empty_space(15)) }
42
+ 2.times { @balls << Ball.new(40, PVector.new(-1.65, 0.42), *empty_space(45)) }
50
43
 
51
44
  @frame_time = nil
52
45
  @frame_count = 0
@@ -55,9 +48,7 @@ class Sketch < Processing::App
55
48
 
56
49
  def draw
57
50
  t = Time.now
58
- if @frame_time
59
- fps = 1.0 / (t - @frame_time)
60
- end
51
+ fps = 1.0 / (t - @frame_time) if @frame_time
61
52
  @frame_time = t
62
53
  @frame_count += 1
63
54
 
@@ -72,19 +63,17 @@ class Sketch < Processing::App
72
63
  # move the balls
73
64
  fill 240
74
65
  @balls.each do |ball|
75
- ball.x += ball.vec.vx
76
- ball.y += ball.vec.vy
66
+ ball.move
77
67
  ball.draw
78
- checkBoundaryCollision ball
68
+ check_boundary_collision ball
79
69
  end
80
- checkObjectCollisions
81
- 1 * 20
70
+ check_object_collisions
82
71
  end
83
72
 
84
73
 
85
- def emptySpace(r)
74
+ def empty_space(r)
86
75
  x = y = nil
87
- while !x || !emptySpace?(x, y, r) do
76
+ while !x || !empty_space?(x, y, r) do
88
77
  x = rand(width)
89
78
  y = rand(height)
90
79
  end
@@ -92,7 +81,7 @@ class Sketch < Processing::App
92
81
  end
93
82
 
94
83
 
95
- def emptySpace?(x, y, r)
84
+ def empty_space?(x, y, r)
96
85
  @balls.each do |ball|
97
86
  vx = x - ball.x
98
87
  vy = y - ball.y
@@ -103,7 +92,7 @@ class Sketch < Processing::App
103
92
  end
104
93
 
105
94
 
106
- def checkObjectCollisions
95
+ def check_object_collisions
107
96
 
108
97
  (0...(@balls.length)).each do |ia|
109
98
  ((ia+1)...(@balls.length)).each do |ib|
@@ -112,15 +101,15 @@ class Sketch < Processing::App
112
101
  bb = @balls[ib]
113
102
 
114
103
  # get distances between the balls components
115
- bVect = Vect2D.new
116
- bVect.vx = bb.x - ba.x
117
- bVect.vy = bb.y - ba.y
104
+ bVect = PVector.new
105
+ bVect.x = bb.x - ba.x
106
+ bVect.y = bb.y - ba.y
118
107
 
119
108
  # calculate magnitude of the vector separating the balls
120
- bVectMag = sqrt(bVect.vx * bVect.vx + bVect.vy * bVect.vy)
109
+ bVectMag = sqrt(bVect.x * bVect.x + bVect.y * bVect.y)
121
110
  next if bVectMag >= ba.r + bb.r
122
111
  # get angle of bVect
123
- theta = atan2(bVect.vy, bVect.vx)
112
+ theta = atan2(bVect.y, bVect.x)
124
113
  # precalculate trig values
125
114
  sine = sin(theta)
126
115
  cosine = cos(theta)
@@ -134,32 +123,32 @@ class Sketch < Processing::App
134
123
  # bTemp[0].x and bTemp[0].y will initialize
135
124
  # automatically to 0.0, which is what you want
136
125
  # since bb will rotate around ba
137
- bTemp[1].x = cosine * bVect.vx + sine * bVect.vy
138
- bTemp[1].y = cosine * bVect.vy - sine * bVect.vx
126
+ bTemp[1].x = cosine * bVect.x + sine * bVect.y
127
+ bTemp[1].y = cosine * bVect.y - sine * bVect.x
139
128
 
140
129
  # rotate Temporary velocities
141
- vTemp = [Vect2D.new, Vect2D.new]
142
- vTemp[0].vx = cosine * ba.vec.vx + sine * ba.vec.vy
143
- vTemp[0].vy = cosine * ba.vec.vy - sine * ba.vec.vx
144
- vTemp[1].vx = cosine * bb.vec.vx + sine * bb.vec.vy
145
- vTemp[1].vy = cosine * bb.vec.vy - sine * bb.vec.vx
130
+ vTemp = [PVector.new, PVector.new]
131
+ vTemp[0].x = cosine * ba.vec.x + sine * ba.vec.y
132
+ vTemp[0].y = cosine * ba.vec.y - sine * ba.vec.x
133
+ vTemp[1].x = cosine * bb.vec.x + sine * bb.vec.y
134
+ vTemp[1].y = cosine * bb.vec.y - sine * bb.vec.x
146
135
 
147
136
  # Now that velocities are rotated, you can use 1D
148
137
  # conservation of momentum equations to calculate
149
138
  # the final velocity along the x-axis.
150
- vFinal = [Vect2D.new, Vect2D.new]
139
+ vFinal = [PVector.new, PVector.new]
151
140
  # final rotated velocity for ba
152
- vFinal[0].vx = ((ba.m - bb.m) * vTemp[0].vx + 2 * bb.m *
153
- vTemp[1].vx) / (ba.m + bb.m)
154
- vFinal[0].vy = vTemp[0].vy
141
+ vFinal[0].x = ((ba.m - bb.m) * vTemp[0].x + 2 * bb.m *
142
+ vTemp[1].x) / (ba.m + bb.m)
143
+ vFinal[0].y = vTemp[0].y
155
144
  # final rotated velocity for ba
156
- vFinal[1].vx = ((bb.m - ba.m) * vTemp[1].vx + 2 * ba.m *
157
- vTemp[0].vx) / (ba.m + bb.m)
158
- vFinal[1].vy = vTemp[1].vy
145
+ vFinal[1].x = ((bb.m - ba.m) * vTemp[1].x + 2 * ba.m *
146
+ vTemp[0].x) / (ba.m + bb.m)
147
+ vFinal[1].y = vTemp[1].y
159
148
 
160
149
  # hack to avoid clumping
161
- bTemp[0].x += vFinal[0].vx
162
- bTemp[1].x += vFinal[1].vx
150
+ bTemp[0].x += vFinal[0].x
151
+ bTemp[1].x += vFinal[1].x
163
152
 
164
153
  # Rotate ball positions and velocities back
165
154
  # Reverse signs in trig expressions to rotate
@@ -178,36 +167,34 @@ class Sketch < Processing::App
178
167
  ba.y = ba.y + bFinal[0].y
179
168
 
180
169
  # update velocities
181
- ba.vec.vx = cosine * vFinal[0].vx - sine * vFinal[0].vy
182
- ba.vec.vy = cosine * vFinal[0].vy + sine * vFinal[0].vx
183
- bb.vec.vx = cosine * vFinal[1].vx - sine * vFinal[1].vy
184
- bb.vec.vy = cosine * vFinal[1].vy + sine * vFinal[1].vx
170
+ ba.vec.x = cosine * vFinal[0].x - sine * vFinal[0].y
171
+ ba.vec.y = cosine * vFinal[0].y + sine * vFinal[0].x
172
+ bb.vec.x = cosine * vFinal[1].x - sine * vFinal[1].y
173
+ bb.vec.y = cosine * vFinal[1].y + sine * vFinal[1].x
185
174
  end
186
175
  end
187
176
 
188
177
  end
189
178
 
190
179
 
191
- def checkBoundaryCollision(ball)
192
-
180
+ def check_boundary_collision(ball)
193
181
  if ball.x > width-ball.r
194
182
  ball.x = width-ball.r
195
- ball.vec.vx *= -1
183
+ ball.vec.x *= -1
196
184
  elsif ball.x < ball.r
197
185
  ball.x = ball.r
198
- ball.vec.vx *= -1
186
+ ball.vec.x *= -1
199
187
  end
200
188
  if ball.y > height-ball.r
201
189
  ball.y = height-ball.r
202
- ball.vec.vy *= -1
190
+ ball.vec.y *= -1
203
191
  elsif ball.y < ball.r
204
192
  ball.y = ball.r
205
- ball.vec.vy *= -1
193
+ ball.vec.y *= -1
206
194
  end
207
-
208
195
  end
209
196
 
210
197
  end
211
198
 
212
199
 
213
- P = Sketch.new(:width => 400, :height => 400, :title => "CircleCollision2")
200
+ Sketch.new(:width => 400, :height => 400, :title => "CircleCollision2")