ruby-processing 1.0.1 → 1.0.2

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,9 @@
1
+ v1.0.2 Bugfixes and Java Args...
2
+ * Application exporting, long plagued, should now be a little
3
+ closer to rock-solid. If you need to pass command-line options
4
+ to the JVM, add a java_args.txt file in your sketch's data
5
+ folder that sets stack size, memory size, or whatever ails you.
6
+
1
7
  v1.0.1 Gemmin' it up.
2
8
  * The smallest version bump is the biggest change:
3
9
  Ruby-Processing has undergone a great refactor, kicked off by
@@ -11,7 +11,7 @@ require 'ruby-processing/helpers/string'
11
11
 
12
12
  # The top-level namespace, a home for all Ruby-Processing classes.
13
13
  module Processing
14
- VERSION = [1,0,1]
14
+ VERSION = [1,0,2]
15
15
 
16
16
  # Returns the current version of Ruby-Processing.
17
17
  def self.version
@@ -22,6 +22,11 @@ module Processing
22
22
 
23
23
  include_class "javax.swing.JFrame"
24
24
 
25
+ # Include some processing classes that we'd like to use:
26
+ %w(PShape PImage PGraphics PFont PVector).each do |klass|
27
+ include_class "processing.core.#{klass}"
28
+ end
29
+
25
30
  # Alias some methods for familiarity for Shoes coders.
26
31
  attr_accessor :frame, :title
27
32
  alias_method :oval, :ellipse
@@ -52,7 +57,7 @@ module Processing
52
57
 
53
58
  # Class methods that we should make available in the instance.
54
59
  [:map, :pow, :norm, :lerp, :second, :minute, :hour, :day, :month, :year,
55
- :sq, :constrain, :dist, :blend_color].each do |meth|
60
+ :sq, :constrain, :dist, :blend_color, :degrees, :radians, :mag].each do |meth|
56
61
  method = <<-EOS
57
62
  def #{meth}(*args)
58
63
  self.class.#{meth}(*args)
@@ -91,6 +96,7 @@ module Processing
91
96
  end
92
97
  def self.load_library(*args); self.load_libraries(*args); end
93
98
 
99
+
94
100
  # For pure ruby libraries.
95
101
  # The library should have an initialization ruby file
96
102
  # of the same name as the library folder.
@@ -184,7 +190,9 @@ module Processing
184
190
  # If you'd like to do something fancy, feel free.
185
191
  def set_sketch_path(path=nil)
186
192
  field = self.java_class.declared_field('sketchPath')
187
- field.set_value(Java.ruby_to_java(self), path || File.dirname(SKETCH_PATH))
193
+ local = File.dirname(SKETCH_PATH)
194
+ default = $__windows_app_mode__ ? "#{local}/lib" : local
195
+ field.set_value(Java.ruby_to_java(self), path || default)
188
196
  end
189
197
 
190
198
 
@@ -63,9 +63,9 @@ module Processing
63
63
  libs = []
64
64
  code = source.dup
65
65
  loop do
66
- matchdata = code.match(/load_\w+_library.+?["':](\S+?)["'\s]/)
66
+ matchdata = code.match(/load\w+librar(y|ies).+?["':](\S+?)["'\s]/)
67
67
  break unless matchdata
68
- match = matchdata[1]
68
+ match = matchdata[2]
69
69
  @opengl = true if match.match(/opengl/i)
70
70
  local_path = "#{local_dir}/library/#{match}"
71
71
  rp5_path = "#{RP5_ROOT}/library/#{match}"
@@ -117,13 +117,22 @@ module Processing
117
117
 
118
118
  # Trade in this Ruby instance for a JRuby instance, loading in a
119
119
  # starter script and passing it some arguments.
120
- def spin_up(starter_script, args)
120
+ def spin_up(starter_script, sketch)
121
121
  runner = "#{RP5_ROOT}/lib/ruby-processing/runners/#{starter_script}"
122
- command = "java -cp #{jruby_complete} #{dock_icon} org.jruby.Main #{runner} #{args}"
122
+ java_args = discover_java_args(sketch)
123
+ command = "java #{java_args} -cp #{jruby_complete} #{dock_icon} org.jruby.Main #{runner} #{sketch}"
123
124
  exec(command)
124
125
  # exec replaces the Ruby process with the JRuby one.
125
126
  end
126
127
 
128
+ # If you need to pass in arguments to Java, such as the ones on this page:
129
+ # http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html
130
+ # then type them into a java_args.txt in your data directory next to your sketch.
131
+ def discover_java_args(sketch)
132
+ arg_file = "#{File.dirname(sketch)}/data/java_args.txt"
133
+ File.exists?(arg_file) ? File.read(arg_file).gsub("\n", " ") : ''
134
+ end
135
+
127
136
  def ensure_exists(sketch)
128
137
  puts "Couldn't find: #{sketch}" and exit unless File.exists?(sketch)
129
138
  end
@@ -1,5 +1,10 @@
1
1
  # Windows apps start life in the wrong folder.
2
- ARGV[1] = nil and Dir.chdir('lib') if ARGV[1] == '--windows-app'
2
+ # TODO: Fix this crud as soon as possible.
3
+ if ARGV[1] == '--windows-app'
4
+ ARGV[1] = nil
5
+ Dir.chdir('lib')
6
+ $__windows_app_mode__ = true
7
+ end
3
8
 
4
9
  require "#{File.dirname(__FILE__)}/base.rb"
5
10
  require Processing::SKETCH_PATH
@@ -0,0 +1,46 @@
1
+ require 'ruby-processing'
2
+
3
+ # Click to see the difference between orthographic projection
4
+ # and perspective projection as applied to a simple box.
5
+ # The ortho function sets an orthographic projection and
6
+ # defines a parallel clipping volume. All objects with the
7
+ # same dimension appear the same size, regardless of whether
8
+ # they are near or far from the camera. The parameters to this
9
+ # function specify the clipping volume where left and right
10
+ # are the minimum and maximum x values, top and bottom are the
11
+ # minimum and maximum y values, and near and far are the minimum
12
+ # and maximum z values.
13
+
14
+ class OrthoVsPerspective < Processing::App
15
+
16
+ def setup
17
+ render_mode P3D
18
+ no_stroke
19
+ fill 204
20
+ end
21
+
22
+ def draw
23
+ background 0
24
+ lights
25
+
26
+ mouse_pressed? ? show_perspective : show_orthographic
27
+
28
+ translate width/2, height/2, 0
29
+ rotate_x -PI/6
30
+ rotate_y PI/3
31
+ box 160
32
+ end
33
+
34
+ def show_perspective
35
+ fov = PI/3.0
36
+ camera_z = (height/2.0) / tan(PI * fov / 360.0)
37
+ perspective fov, width.to_f/height.to_f, camera_z/2.0, camera_z*2.0
38
+ end
39
+
40
+ def show_orthographic
41
+ ortho -width/2, width/2, -height/2, height/2, -10, 10
42
+ end
43
+
44
+ end
45
+
46
+ OrthoVsPerspective.new :title => "Ortho Vs Perspective", :width => 640, :height => 360
@@ -0,0 +1,44 @@
1
+ require 'ruby-processing'
2
+
3
+ # Move the mouse left and right to change the field of view (fov).
4
+ # Click to modify the aspect ratio. The perspective method
5
+ # sets a perspective projection applying foreshortening, making
6
+ # distant objects appear smaller than closer ones. The parameters
7
+ # define a viewing volume with the shape of truncated pyramid.
8
+ # Objects near to the front of the volume appear their actual size,
9
+ # while farther objects appear smaller. This projection simulates
10
+ # the perspective of the world more accurately than orthographic projection.
11
+ # The version of perspective without parameters sets the default
12
+ # perspective and the version with four parameters allows the programmer
13
+ # to set the area precisely.
14
+
15
+ class Perspective < Processing::App
16
+
17
+ def setup
18
+ render_mode P3D
19
+ no_stroke
20
+ end
21
+
22
+ def draw
23
+ lights
24
+ background 204
25
+ camera_y = height/2.0
26
+ fov = mouse_x/width.to_f * PI/2.0
27
+ camera_z = camera_y / tan(fov / 2.0)
28
+ aspect = width.to_f / height.to_f
29
+
30
+ aspect /= 2.0 if mouse_pressed?
31
+
32
+ perspective(fov, aspect, camera_z/10.0, camera_z*10.0)
33
+
34
+ translate width/2.0+30, height/2.0, 0
35
+ rotate_x -PI/6
36
+ rotate_y PI/3 + mouse_y/height.to_f * PI
37
+ box 45
38
+ translate 0, 0, -50
39
+ box 30
40
+ end
41
+
42
+ end
43
+
44
+ Perspective.new :title => "Perspective", :width => 640, :height => 360
@@ -0,0 +1,94 @@
1
+ require 'ruby-processing'
2
+
3
+ # Original by Ira Greenberg
4
+
5
+ # 3D castle tower constructed out of individual bricks.
6
+ # Uses the PVecor and Cube classes.
7
+
8
+ class BrickTower < Processing::App
9
+
10
+ def setup
11
+ @bricks_per_layer = 16
12
+ @brick_layers = 18
13
+ @brick_width, @brick_height, @brick_depth = 60, 25, 25
14
+ @radius = 175.0
15
+ @angle = 0
16
+ render_mode P3D
17
+ @brick = Cubeish.new(@brick_width, @brick_height, @brick_depth)
18
+ end
19
+
20
+ def draw
21
+ background 0
22
+ @temp_x, @temp_y, @temp_z = 0, 0, 0
23
+ fill 182, 62, 29
24
+ no_stroke
25
+ lights
26
+ translate(width/2.0, height*1.2, -380) # move viewpoint into position
27
+ rotate_x(radians(-45)) # tip tower to see inside
28
+ rotate_y(frame_count * PI/600) # slowly rotate tower
29
+ @brick_layers.times {|i| draw_layer(i) }
30
+ end
31
+
32
+ def draw_layer(layer_num)
33
+ @layer_num = layer_num
34
+ @temp_y -= @brick_height # increment rows
35
+ @angle = 360.0 / @bricks_per_layer * @layer_num / 2.0 # alternate brick seams
36
+ @bricks_per_layer.times {|i| draw_bricks(i) }
37
+ end
38
+
39
+ def draw_bricks(brick_num)
40
+ @brick_num = brick_num
41
+ @temp_z = cos(radians(@angle)) * @radius
42
+ @temp_x = sin(radians(@angle)) * @radius
43
+ push_matrix
44
+ translate @temp_x, @temp_y, @temp_z
45
+ rotate_y(radians(@angle))
46
+ top_layer = @layer_num == @brick_layers - 1
47
+ even_brick = @brick_num % 2 == 0
48
+ @brick.create unless top_layer # main tower
49
+ @brick.create if top_layer && even_brick # add crenelation
50
+ pop_matrix
51
+ @angle += 360.0 / @bricks_per_layer
52
+ end
53
+ end
54
+
55
+
56
+ # The Cubeish class works a little different than the cube in the
57
+ # Processing example. SIDES tells you where the negative numbers go.
58
+ # We dynamically create each of the PVectors by passing in the
59
+ # appropriate signs.
60
+ class Cubeish
61
+ SIDES = {:front => ['-- ', ' - ', ' ', '- '],
62
+ :left => ['-- ', '---', '- -', '- '],
63
+ :right => [' - ', ' --', ' -', ' '],
64
+ :back => ['---', ' --', ' -', '- -'],
65
+ :top => ['-- ', '---', ' --', ' - '],
66
+ :bottom => ['- ', '- -', ' -', ' ']}
67
+
68
+ SIGNS = {'-' => -1,
69
+ ' ' => 1}
70
+
71
+ def initialize(width, height, depth)
72
+ @vertices = {}
73
+ @w, @h, @d = width, height, depth
74
+
75
+ SIDES.each do |side, signs|
76
+ @vertices[side] = signs.map do |s|
77
+ s = s.split('').map {|el| SIGNS[el] }
78
+ Processing::PVector.new(s[0]*@w/2, s[1]*@h/2, s[2]*@d/2)
79
+ end
80
+ end
81
+ end
82
+
83
+ def create
84
+ @vertices.each do |name, vectors|
85
+ $app.begin_shape BrickTower::QUADS
86
+ vectors.each {|v| $app.vertex(v.x, v.y, v.z) }
87
+ $app.end_shape
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+
94
+ BrickTower.new :title => "Brick Tower", :width => 640, :height => 360
@@ -0,0 +1,79 @@
1
+ # From the Processing Examples
2
+ # by Zach Lieberman
3
+ # Ruby version thanks to Nick Sieger
4
+
5
+ require 'ruby-processing'
6
+
7
+ class KineticType < Processing::App
8
+ load_library :opengl
9
+
10
+ WORDS = ["sometimes it's like", "the lines of text", "are so happy", "that they want to dance",
11
+ "or leave the page or jump", "can you blame them?", "living on the page like that",
12
+ "waiting to be read..."]
13
+
14
+ def setup
15
+ library_loaded?(:opengl) ? render_mode(OPENGL) : render_mode(P3D)
16
+ frame_rate 30
17
+ # Load the font from the sketch's data directory.
18
+ text_font load_font("Univers66.vlw.gz"), 1.0
19
+ fill 255
20
+
21
+ # Creating the line objects
22
+ @lines = Array.new(WORDS.length) do |i|
23
+ Line.new(WORDS[i], 0, i*70)
24
+ end
25
+ end
26
+
27
+ def draw
28
+ background 0
29
+ translate -240, -120, -450
30
+ rotate_y 0.3
31
+ # Now animate every line object & draw it...
32
+ @lines.each_with_index do |line, i|
33
+ push_matrix
34
+ translate 0.0, line.ypos, 0.0
35
+ line.draw(i)
36
+ pop_matrix
37
+ end
38
+ end
39
+ end
40
+
41
+ class Line
42
+ include Math
43
+ attr_accessor :string, :xpos, :ypos, :letters
44
+
45
+ def initialize(string, x, y)
46
+ @string, @xpos, @ypos = string, x, y
47
+ spacing = 0.0
48
+ @letters = @string.split('').map do |c|
49
+ spacing += $app.text_width(c)
50
+ Letter.new(c, spacing, 0.0)
51
+ end
52
+ end
53
+
54
+ def compute_curve(line_num)
55
+ base = $app.millis / 10000.0 * PI * 2
56
+ sin((line_num + 1.0) * base) * sin((8.0 - line_num) * base)
57
+ end
58
+
59
+ def draw(line_num)
60
+ curve = compute_curve(line_num)
61
+ @letters.each_with_index do |letter, i|
62
+ $app.translate($app.text_width(@letters[i-1].char)*75, 0.0, 0.0) if i > 0
63
+ $app.rotate_y(curve * 0.035)
64
+ $app.push_matrix
65
+ $app.scale(75.0, 75.0, 75.0)
66
+ $app.text(letter.char, 0.0, 0.0)
67
+ $app.pop_matrix
68
+ end
69
+ end
70
+ end
71
+
72
+ class Letter
73
+ attr_accessor :char, :x, :y
74
+ def initialize(c, x, y)
75
+ @char, @x, @y = c, x, y
76
+ end
77
+ end
78
+
79
+ KineticType.new :width => 200, :height => 200, :title => "Kinetic Type"
@@ -0,0 +1,3 @@
1
+ Here lie a scattering of examples that come with the Processing download.
2
+ They are categorized by kind, and some of the code has been converted
3
+ into more idiomatic Ruby.
@@ -0,0 +1,95 @@
1
+ require 'ruby-processing'
2
+
3
+ # Original by luis2048
4
+
5
+ # A picture is shown and it looks like a magnifying glass
6
+ # is drawn over the picture. One of the most famous demos
7
+ # that has a lens effect is 2nd reality by future crew.
8
+ # The trick is to precalculate the entire effect. Just make
9
+ # an array that for each pixel in the destination picture
10
+ # tells which pixel to take from the source picture. This
11
+ # array is called the transformation array. The tricky part
12
+ # is to calculate the transformation array to make the
13
+ # destination look like a lens is beeing held over the source
14
+ # picture. Based on lens formula by on Abe Racadabra.
15
+
16
+ class Lens < Processing::App
17
+
18
+ def setup
19
+ @lens_d = 160
20
+ @lens_list = []
21
+ @xx, @yy, @dx, @dy = 0, 0, 3, 3
22
+
23
+ # Create buffered image for lens effect.
24
+ @lens_effect = create_graphics(width, height, P2D)
25
+
26
+ # Load background image.
27
+ @lens_effect.begin_draw
28
+ @lens_effect.image(load_image('red_smoke.jpg'), 0, 0, width, height)
29
+ @lens_effect.end_draw
30
+ image(@lens_effect, 0, 0, width, height)
31
+
32
+ # Create buffered image for warping.
33
+ @lens_image = create_graphics(@lens_d, @lens_d, P2D)
34
+ @lens_image2 = create_graphics(@lens_d, @lens_d, P2D)
35
+
36
+ compute_lens_transformation
37
+ end
38
+
39
+ def compute_lens_transformation
40
+ mag_factor = 40
41
+ m, a, b = 0, 0, 0
42
+ r = @lens_d / 2
43
+ s = sqrt(r*r - mag_factor*mag_factor)
44
+
45
+ for y in (-r...r)
46
+ for x in (-r..r)
47
+ if (x*x + y*y >= s*s)
48
+ a, b = x, y
49
+ else
50
+ z = sqrt(r*r - x*x - y*y)
51
+ a = (x * mag_factor / z + 0.5).to_i
52
+ b = (y * mag_factor / z + 0.5).to_i
53
+ end
54
+ @lens_list[(y+r) * @lens_d + (x+r)] = (b+r) * @lens_d + (a+r)
55
+ end
56
+ end
57
+ end
58
+
59
+ def bounce_lens
60
+ @dx = -@dx if (@xx+@dx+@lens_d > @lens_effect.width) || (@xx+@dx < 0)
61
+ @dy = -@dy if (@yy+@dy+@lens_d > @lens_effect.height) || (@yy+@dy < 0)
62
+ end
63
+
64
+ def move_lens
65
+ @xx += @dx
66
+ @yy += @dy
67
+ end
68
+
69
+ def draw
70
+ bounce_lens
71
+ move_lens
72
+
73
+ # Save the background of image at the coordinate where the
74
+ # lens effect will be applied.
75
+ @lens_image2.copy(@lens_effect, @xx, @yy, @lens_d, @lens_d, 0, 0, @lens_d, @lens_d)
76
+
77
+ # Output into a buffered image for reuse.
78
+ @lens_image.load_pixels
79
+
80
+ # For each pixel in the destination, apply the color from the
81
+ # appropriate pixel in the saved background. The @lens_list array
82
+ # tells us the appropriate offset.
83
+ # This inner loop has been optimized a bit.
84
+ px, px2 = @lens_image.pixels, @lens_image2.pixels
85
+ list = @lens_list
86
+ px.length.times {|i| px[i] = px2[list[i]] }
87
+ @lens_image.update_pixels
88
+
89
+ # Overlay the lens
90
+ image(@lens_image, @xx, @yy, @lens_d, @lens_d)
91
+ end
92
+
93
+ end
94
+
95
+ Lens.new :title => "Lens", :width => 640, :height => 360
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-processing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Ashkenas
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2009-01-17 00:00:00 -05:00
15
+ date: 2009-01-20 00:00:00 -05:00
16
16
  default_executable: rp5
17
17
  dependencies: []
18
18
 
@@ -183,7 +183,6 @@ files:
183
183
  - samples/full_screen.rb
184
184
  - samples/getting_started.rb
185
185
  - samples/jwishy.rb
186
- - samples/kinetic_type.rb
187
186
  - samples/learning_processing
188
187
  - samples/learning_processing/ABOUT
189
188
  - samples/learning_processing/chapter_01
@@ -307,6 +306,23 @@ files:
307
306
  - samples/learning_processing/chapter_16
308
307
  - samples/learning_processing/chapter_16/01_display_video.rb
309
308
  - samples/learning_processing/chapter_16/02_manipulate_video_image.rb
309
+ - samples/processing_app
310
+ - samples/processing_app/3D
311
+ - samples/processing_app/3D/camera
312
+ - samples/processing_app/3D/camera/ortho_vs_perspective.rb
313
+ - samples/processing_app/3D/camera/perspective.rb
314
+ - samples/processing_app/3D/form
315
+ - samples/processing_app/3D/form/brick_tower.rb
316
+ - samples/processing_app/3D/typography
317
+ - samples/processing_app/3D/typography/data
318
+ - samples/processing_app/3D/typography/data/Univers66.vlw.gz
319
+ - samples/processing_app/3D/typography/kinetic_type.rb
320
+ - samples/processing_app/ABOUT
321
+ - samples/processing_app/topics
322
+ - samples/processing_app/topics/effects
323
+ - samples/processing_app/topics/effects/data
324
+ - samples/processing_app/topics/effects/data/red_smoke.jpg
325
+ - samples/processing_app/topics/effects/lens.rb
310
326
  - samples/reflection.rb
311
327
  - samples/simple_buffer.rb
312
328
  - samples/tree.rb
@@ -1,100 +0,0 @@
1
- # From the Processing Examples
2
- # by Zach Lieberman
3
- # Ruby version thanks to Nick Sieger
4
-
5
- require 'ruby-processing'
6
-
7
- class KineticType < Processing::App
8
- load_library :opengl
9
-
10
- WORDS = ["sometimes it's like", "the lines of text", "are so happy", "that they want to dance",
11
- "or leave the page or jump", "can you blame them?", "living on the page like that",
12
- "waiting to be read..."]
13
-
14
- def setup
15
- library_loaded?(:opengl) ? render_mode(OPENGL) : render_mode(P3D)
16
-
17
- frame_rate 30
18
-
19
- # Array of line objects
20
- @lns = [];
21
-
22
- # Try to create the font from scratch.
23
- hint(ENABLE_NATIVE_FONTS)
24
- f = create_font("Monospaced", 66)
25
- text_font f, 1.0
26
-
27
- # White type, black background
28
- fill 255
29
-
30
- # Creating the line objects
31
- i = -1
32
- @lines = WORDS.map do |ln|
33
- i += 1
34
- Line.new self, ln, 0, i * 70, f
35
- end
36
- end
37
-
38
- def draw
39
- background 0
40
-
41
- translate (width / 2.0) - 350, (height / 2.0) - 240, -450
42
- rotateY 0.3
43
-
44
- # Now animate every line object & draw it...
45
- @lines.each_with_index do |line,i|
46
- f1 = sin((i + 1.0) * (millis() / 10000.0) * TWO_PI)
47
- f2 = sin((8.0 - i) * (millis() / 10000.0) * TWO_PI)
48
- push_matrix
49
- translate 0.0, line.ypos, 0.0
50
- 0.upto(line.letters.length - 1) do |j|
51
- if j != 0
52
- translate(text_width(line.letters[j - 1].char)*75, 0.0, 0.0)
53
- end
54
- rotate_y(f1 * 0.035 * f2)
55
- push_matrix
56
- scale(75.0, 75.0, 75.0)
57
- text(line.letters[j].char, 0.0, 0.0)
58
- pop_matrix
59
- end
60
- pop_matrix
61
- end
62
- rescue => e
63
- puts e.to_s, *e.backtrace
64
- raise e
65
- end
66
-
67
- # Any class inheriting from this app object
68
- # can use all the plain Processing calls.
69
- class AppObject
70
- attr_accessor :app
71
- def method_missing(meth, *args, &block)
72
- app.send(meth, *args, &block)
73
- end
74
- end
75
-
76
- class Line < AppObject
77
- attr_accessor :string, :xpos, :ypos, :highlight_num,
78
- :font, :speed, :curl_in_x, :letters
79
-
80
- def initialize(app, s, i, j, bagelfont)
81
- @app, @string, @xpos, @ypos, @font = app, s, i, j, bagelfont
82
- @letters = []
83
- f1 = 0.0
84
- s.each_byte do |c|
85
- f1 += text_width c
86
- @letters << Letter.new(c, f1, 0.0)
87
- end
88
- @curl_in_x = 0.1
89
- end
90
- end
91
-
92
- class Letter
93
- attr_accessor :char, :x, :y
94
- def initialize(c, x, y)
95
- @char, @x, @y = c, x, y
96
- end
97
- end
98
- end
99
-
100
- KineticType.new :width => 200, :height => 200, :title => "Kinetic Type"