ruby-processing 1.0.3 → 1.0.4
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 +12 -0
- data/README +3 -0
- data/lib/core/core.jar +0 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/patches/JRubyApplet.diff +24 -0
- data/lib/patches/PATCHES.txt +3 -0
- data/lib/patches/PApplet.diff +27 -0
- data/lib/ruby-processing.rb +4 -1
- data/lib/ruby-processing/app.rb +121 -75
- data/lib/ruby-processing/exporters/applet_exporter.rb +1 -1
- data/lib/ruby-processing/exporters/base_exporter.rb +21 -16
- data/lib/ruby-processing/exporters/creator.rb +12 -6
- data/lib/ruby-processing/runner.rb +2 -2
- data/lib/ruby-processing/runners/base.rb +59 -0
- data/lib/ruby-processing/runners/live.rb +2 -2
- data/lib/ruby-processing/runners/run.rb +2 -1
- data/lib/ruby-processing/runners/watch.rb +47 -11
- data/lib/templates/applet/index.html.erb +6 -6
- data/lib/templates/create/bare_sketch.rb.erb +7 -0
- data/lib/templates/create/blank_sketch.rb.erb +2 -2
- data/library/control_panel/control_panel.rb +6 -2
- data/library/opengl/library/export.txt +0 -0
- data/library/opengl/library/opengl.jar +0 -0
- data/library/pdf/library/itext.jar +0 -0
- data/library/pdf/library/pdf.jar +0 -0
- data/library/pdf/notes.txt +3 -4
- data/samples/animator.rb +35 -39
- data/samples/bezier_playground.rb +2 -4
- data/samples/fern.rb +34 -42
- data/samples/flight_patterns.rb +48 -54
- data/samples/full_screen.rb +20 -25
- data/samples/getting_started.rb +19 -39
- data/samples/learning_processing/chapter_01/1_stroke_and_fill.rb +14 -30
- data/samples/learning_processing/chapter_01/2_nofill.rb +18 -23
- data/samples/learning_processing/chapter_01/3_rgb_color.rb +16 -28
- data/samples/learning_processing/chapter_01/4_alpha_transparency.rb +7 -1
- data/samples/learning_processing/chapter_01/5_zoog.rb +20 -33
- data/samples/learning_processing/chapter_02/1_zoog_again.rb +3 -1
- data/samples/learning_processing/chapter_03/6_interactive_zoog.rb +34 -42
- data/samples/learning_processing/chapter_16/03_adjust_video_brightness.rb +49 -0
- data/samples/learning_processing/chapter_17/01_simple_displaying_text.rb +14 -0
- data/samples/learning_processing/chapter_17/02_text_align.rb +21 -0
- data/samples/learning_processing/chapter_17/03_scrolling_headlines.rb +35 -0
- data/samples/learning_processing/chapter_17/04_text_mirror.rb +68 -0
- data/samples/learning_processing/chapter_17/05_rotating_text.rb +22 -0
- data/samples/learning_processing/chapter_17/06_text_breaking_up.rb +73 -0
- data/samples/learning_processing/chapter_17/07_boxes_along_a_curve.rb +49 -0
- data/samples/learning_processing/chapter_17/08_characters_along_a_curve.rb +51 -0
- data/samples/learning_processing/chapter_17/data/ArialMT-16.vlw +0 -0
- data/samples/learning_processing/chapter_17/data/Courier-Bold-20.vlw +0 -0
- data/samples/learning_processing/chapter_18/01_user_input.rb +39 -0
- data/samples/learning_processing/chapter_18/02_graphing_comma_separated_numbers_from_a_text_file.rb +28 -0
- data/samples/learning_processing/chapter_18/03_creating_object_from_a_text_file.rb +64 -0
- data/samples/learning_processing/chapter_18/data/data-1.txt +1 -0
- data/samples/learning_processing/chapter_18/data/data-2.txt +10 -0
- data/samples/orbit.rb +45 -0
- data/samples/processing_app/basics/image/pointillism.rb +1 -1
- data/samples/processing_app/topics/effects/lens.rb +1 -0
- metadata +30 -13
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$ImageCache.class +0 -0
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$TessCallback.class +0 -0
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL.class +0 -0
- data/library/pdf/bin/processing/pdf/PGraphicsPDF.class +0 -0
@@ -8,12 +8,12 @@ module Processing
|
|
8
8
|
class BaseExporter
|
9
9
|
include FileUtils
|
10
10
|
|
11
|
-
|
12
|
-
DEFAULT_DIMENSIONS = {'width' => '500', 'height' => '500'}
|
11
|
+
DEFAULT_DIMENSIONS = {'width' => '200', 'height' => '200'}
|
13
12
|
DEFAULT_DESCRIPTION = ''
|
14
13
|
|
15
14
|
# Returns the filepath, basename, and directory name of the sketch.
|
16
15
|
def get_main_file(file)
|
16
|
+
@file = file
|
17
17
|
return file, File.basename(file), File.dirname(file)
|
18
18
|
end
|
19
19
|
|
@@ -37,40 +37,45 @@ module Processing
|
|
37
37
|
# Searches the source for a class name.
|
38
38
|
def extract_class_name(source)
|
39
39
|
match = source.match(/(\w+)\s*<\s*Processing::App/)
|
40
|
-
match ? match[1] :
|
40
|
+
match ? match[1] : 'Sketch'
|
41
41
|
end
|
42
42
|
|
43
43
|
# Searches the source for a title.
|
44
44
|
def extract_title(source)
|
45
45
|
match = source.match(/#{@info[:class_name]}\.new.*?:title\s=>\s["'](.+)["']/m)
|
46
|
-
match ? match[1] :
|
46
|
+
match ? match[1] : File.basename(@file, '.rb').titleize
|
47
47
|
end
|
48
48
|
|
49
49
|
# Searches the source for the width and height of the sketch.
|
50
50
|
def extract_dimension(source, dimension)
|
51
|
-
match = source.match(/#{@info[:class_name]}\.new.*?:#{dimension}\s
|
52
|
-
|
51
|
+
match = source.match(/#{@info[:class_name]}\.new.*?:#{dimension}\s?=>\s?(\d+)/m)
|
52
|
+
size_match = source.match(/^[^#]*size\(?\s*(\d+)\s*,\s*(\d+)\s*\)?/)
|
53
|
+
return match[1] if match
|
54
|
+
return (dimension == 'width' ? size_match[1] : size_match[2]) if size_match
|
55
|
+
DEFAULT_DIMENSIONS[dimension]
|
53
56
|
end
|
54
57
|
|
55
58
|
# Searches the source for a description of the sketch.
|
56
59
|
def extract_description(source)
|
57
|
-
match = source.match(
|
58
|
-
match ? match[1].gsub
|
60
|
+
match = source.match(/\A((\s*#(.*?)\n)+)[^#]/m)
|
61
|
+
match ? match[1].gsub(/\s*#\s*/, "\n") : DEFAULT_DESCRIPTION
|
59
62
|
end
|
60
63
|
|
61
|
-
# Searches the source any libraries that have been loaded.
|
64
|
+
# Searches the source for any libraries that have been loaded.
|
62
65
|
def extract_libraries(source)
|
63
66
|
libs = []
|
64
67
|
code = source.dup
|
65
68
|
loop do
|
66
|
-
matchdata = code.match(
|
69
|
+
matchdata = code.match(/^[^#]*load_librar(y|ies)\s+(.+)\n/)
|
67
70
|
break unless matchdata
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
candidates = matchdata[2].gsub(/[:"'\s]/, '').split(/,/)
|
72
|
+
candidates.each do |cand|
|
73
|
+
@opengl = true if cand.match(/opengl/i)
|
74
|
+
local_path = "#{local_dir}/library/#{cand}"
|
75
|
+
rp5_path = "#{RP5_ROOT}/library/#{cand}"
|
76
|
+
libs << rp5_path if File.exists?(rp5_path)
|
77
|
+
libs << local_path if File.exists?(local_path)
|
78
|
+
end
|
74
79
|
code = matchdata.post_match
|
75
80
|
end
|
76
81
|
libs
|
@@ -3,6 +3,8 @@ module Processing
|
|
3
3
|
# This class creates blank sketches, with the boilerplate filled in.
|
4
4
|
class Creator < BaseExporter
|
5
5
|
|
6
|
+
ALL_DIGITS = /\A\d+\Z/
|
7
|
+
|
6
8
|
# Create a blank sketch, given a path.
|
7
9
|
def create!(path, args)
|
8
10
|
usage path
|
@@ -15,16 +17,20 @@ module Processing
|
|
15
17
|
end
|
16
18
|
|
17
19
|
# Get the substitutions
|
18
|
-
@name
|
19
|
-
@file_name
|
20
|
-
@title
|
21
|
-
|
22
|
-
|
20
|
+
@name = main_file.camelize
|
21
|
+
@file_name = main_file.underscore
|
22
|
+
@title = main_file.titleize
|
23
|
+
|
24
|
+
bare = !!args.delete('--bare')
|
25
|
+
@width, @height = args[0], args[1]
|
26
|
+
@with_size = @width && @width.match(ALL_DIGITS) &&
|
27
|
+
@height && @height.match(ALL_DIGITS)
|
23
28
|
|
24
29
|
# Make the file
|
25
30
|
dir = File.dirname path
|
26
31
|
mkdir_p dir
|
27
|
-
|
32
|
+
template_name = bare ? 'bare_sketch.rb.erb' : 'blank_sketch.rb.erb'
|
33
|
+
template = File.new("#{RP5_ROOT}/lib/templates/create/#{template_name}")
|
28
34
|
rendered = render_erb_from_string_with_binding(template.read, binding)
|
29
35
|
full_path = File.join(dir, "#{@file_name}.rb")
|
30
36
|
File.open(full_path, "w") {|f| f.print(rendered) }
|
@@ -18,11 +18,11 @@ module Processing
|
|
18
18
|
Examples:
|
19
19
|
rp5 unpack samples
|
20
20
|
rp5 run samples/jwishy.rb
|
21
|
-
rp5 create some_new_sketch 640 480
|
21
|
+
rp5 create some_new_sketch --bare 640 480
|
22
22
|
rp5 watch some_new_sketch.rb
|
23
23
|
rp5 applet some_new_sketch.rb
|
24
24
|
|
25
|
-
|
25
|
+
Everything Else:
|
26
26
|
http://wiki.github.com/jashkenas/ruby-processing
|
27
27
|
|
28
28
|
EOS
|
@@ -1,5 +1,64 @@
|
|
1
1
|
$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/../../")
|
2
|
+
SKETCH_ROOT = File.dirname(ARGV[0]) unless defined? SKETCH_ROOT
|
3
|
+
|
4
|
+
require 'ruby-processing'
|
5
|
+
require 'ruby-processing/app'
|
6
|
+
|
2
7
|
|
3
8
|
module Processing
|
9
|
+
|
4
10
|
SKETCH_PATH = ARGV[0]
|
11
|
+
|
12
|
+
# For use with "bare" sketches that don't want to define a class or methods
|
13
|
+
SKETCH_TEMPLATE = <<-EOS
|
14
|
+
class Sketch < Processing::App
|
15
|
+
<% if has_methods %>
|
16
|
+
<%= source %>
|
17
|
+
<% else %>
|
18
|
+
def setup
|
19
|
+
size(DEFAULT_WIDTH, DEFAULT_HEIGHT, JAVA2D)
|
20
|
+
<%= source %>
|
21
|
+
no_loop
|
22
|
+
end
|
23
|
+
<% end %>
|
24
|
+
end
|
25
|
+
EOS
|
26
|
+
|
27
|
+
# This method is the common entry point to run a sketch, bare or complete.
|
28
|
+
def self.load_and_run_sketch
|
29
|
+
source = self.read_sketch_source
|
30
|
+
has_sketch = !!source.match(/^[^#]*< Processing::App/)
|
31
|
+
has_methods = !!source.match(/^[^#]*def setup/)
|
32
|
+
|
33
|
+
if has_sketch
|
34
|
+
load Processing::SKETCH_PATH
|
35
|
+
Processing::App.sketch_class.new if !$app
|
36
|
+
return
|
37
|
+
else
|
38
|
+
require 'erb'
|
39
|
+
code = ERB.new(SKETCH_TEMPLATE).result(binding)
|
40
|
+
Object.class_eval code, Processing::SKETCH_PATH, 0
|
41
|
+
Processing::App.sketch_class.new if !$app
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Read in the sketch source code. Needs to work both online and offline.
|
47
|
+
def self.read_sketch_source
|
48
|
+
if Processing::App.online?
|
49
|
+
# Fuck the following lines. Fucking Java can go sit on broken glass.
|
50
|
+
source = ''
|
51
|
+
url = java.net.URL.new(JRUBY_APPLET.get_code_base, Processing::SKETCH_PATH)
|
52
|
+
input = java.io.BufferedReader.new(java.io.InputStreamReader.new(url.open_stream))
|
53
|
+
while line = input.read_line do
|
54
|
+
source << (line + "\n") if line
|
55
|
+
end
|
56
|
+
input.close
|
57
|
+
else
|
58
|
+
# Ahhh, much better.
|
59
|
+
source = File.read(Processing::SKETCH_PATH)
|
60
|
+
end
|
61
|
+
source
|
62
|
+
end
|
63
|
+
|
5
64
|
end
|
@@ -6,12 +6,13 @@ module Processing
|
|
6
6
|
# the feedback between code and effect.
|
7
7
|
class Watcher
|
8
8
|
|
9
|
-
# Sic a new Processing::Watcher on
|
10
|
-
def initialize
|
11
|
-
@file =
|
9
|
+
# Sic a new Processing::Watcher on the sketch
|
10
|
+
def initialize
|
11
|
+
@file = Processing::SKETCH_PATH
|
12
12
|
@time = Time.now
|
13
|
-
|
14
|
-
|
13
|
+
# Doesn't work well enough for now.
|
14
|
+
# record_state_of_ruby
|
15
|
+
Processing.load_and_run_sketch unless $app
|
15
16
|
start_watching
|
16
17
|
end
|
17
18
|
|
@@ -24,22 +25,44 @@ module Processing
|
|
24
25
|
file_mtime = File.stat(@file).mtime
|
25
26
|
if file_mtime > @time
|
26
27
|
@time = file_mtime
|
27
|
-
|
28
|
-
|
28
|
+
wipe_out_current_app!
|
29
|
+
# Taking it out the reset until it can be made to work more reliably
|
30
|
+
# rewind_to_recorded_state
|
29
31
|
GC.start
|
30
32
|
begin
|
31
|
-
|
33
|
+
Processing.load_and_run_sketch
|
32
34
|
rescue SyntaxError
|
33
35
|
print "Syntax Error in your sketch: ", $!, "\n"
|
34
36
|
end
|
35
37
|
end
|
36
|
-
sleep 0.
|
38
|
+
sleep 0.33
|
37
39
|
end
|
38
40
|
end
|
39
41
|
thread.join
|
40
42
|
end
|
41
43
|
|
42
44
|
|
45
|
+
# Used to completely remove all traces of the current sketch,
|
46
|
+
# so that it can be loaded afresh. Go down into modules to find it, even.
|
47
|
+
def wipe_out_current_app!
|
48
|
+
app = $app
|
49
|
+
return unless app
|
50
|
+
app.no_loop
|
51
|
+
# Wait for the animation thread to finish rendering
|
52
|
+
sleep 0.05
|
53
|
+
app.close
|
54
|
+
constant_names = app.class.to_s.split(/::/)
|
55
|
+
app_class_name = constant_names.pop
|
56
|
+
obj = constant_names.inject(Object) {|o, name| o.send(:const_get, name) }
|
57
|
+
obj.send(:remove_const, app_class_name)
|
58
|
+
end
|
59
|
+
|
60
|
+
# The following methods were intended to make the watcher clean up all code
|
61
|
+
# loaded in from the sketch, gems, etc, and have them be reloaded properly
|
62
|
+
# when the sketch is.... but it seems that this is neither a very good idea
|
63
|
+
# or a very possible one. If you can make the scheme work, please do,
|
64
|
+
# otherwise the following methods will probably be removed soonish.
|
65
|
+
|
43
66
|
# Do the best we can to take a picture of the current Ruby interpreter.
|
44
67
|
# For now, this means top-level constants and loaded .rb files.
|
45
68
|
def record_state_of_ruby
|
@@ -57,7 +80,7 @@ module Processing
|
|
57
80
|
new_features = $LOADED_FEATURES.reject {|f| @saved_features.include?(f) }
|
58
81
|
new_globals = Kernel.global_variables.reject {|g| @saved_globals.include?(g) }
|
59
82
|
|
60
|
-
|
83
|
+
Processing::App.recursively_remove_constants(Object, new_constants)
|
61
84
|
new_load_paths.each {|p| $LOAD_PATH.delete(p) }
|
62
85
|
new_features.each {|f| $LOADED_FEATURES.delete(f) }
|
63
86
|
new_globals.each do |g|
|
@@ -69,7 +92,20 @@ module Processing
|
|
69
92
|
end
|
70
93
|
end
|
71
94
|
|
95
|
+
|
96
|
+
# Used to clean up declared constants in code that needs to be reloaded.
|
97
|
+
def recursively_remove_constants(base, constant_names)
|
98
|
+
constants = constant_names.map {|name| base.const_get(name) }
|
99
|
+
constants.each_with_index do |c, i|
|
100
|
+
java_obj = Java::JavaLang::Object
|
101
|
+
constants[i] = constant_names[i] = nil if c.respond_to?(:ancestors) && c.ancestors.include?(java_obj)
|
102
|
+
constants[i] = nil if !c.is_a?(Class) && !c.is_a?(Module)
|
103
|
+
end
|
104
|
+
constants.each {|c| recursively_remove_constants(c, c.constants) if c }
|
105
|
+
constant_names.each {|name| base.send(:remove_const, name.to_sym) if name }
|
106
|
+
end
|
107
|
+
|
72
108
|
end
|
73
109
|
end
|
74
110
|
|
75
|
-
Processing::Watcher.new
|
111
|
+
Processing::Watcher.new
|
@@ -24,7 +24,7 @@
|
|
24
24
|
padding: 0;
|
25
25
|
}
|
26
26
|
#container {
|
27
|
-
width: <%= @
|
27
|
+
width: <%= @width + 14 %>px;
|
28
28
|
margin: 0 auto;
|
29
29
|
margin-top: 20px;
|
30
30
|
}
|
@@ -42,8 +42,8 @@
|
|
42
42
|
}
|
43
43
|
#description {
|
44
44
|
font-size: 12px;
|
45
|
-
width: <%= @width %>px;
|
46
|
-
padding: 7px;
|
45
|
+
width: <%= @width - 16 %>px;
|
46
|
+
padding: 7px 15px 7px 15px;
|
47
47
|
background: #111;
|
48
48
|
text-align: justify;
|
49
49
|
margin: 0 auto;
|
@@ -72,7 +72,7 @@
|
|
72
72
|
width="<%= @width %>" height="<%= @height %>">
|
73
73
|
|
74
74
|
<param name="archive" value="<%= @file_list %>" />
|
75
|
-
<param name="jruby.
|
75
|
+
<param name="jruby.eval" value="ARGV[0] = '<%= @main_file %>'; require 'ruby-processing/runners/run.rb'" />
|
76
76
|
<param name="image" value="images/ruby.jpg" />
|
77
77
|
<param name="boxbgcolor" value="#000000" />
|
78
78
|
<param name="lang" value="en" />
|
@@ -92,14 +92,14 @@
|
|
92
92
|
</div>
|
93
93
|
|
94
94
|
<div id="built_with">
|
95
|
-
<a href="http://
|
95
|
+
<a href="http://wiki.github.com/jashkenas/ruby-processing">
|
96
96
|
<img src="images/built_with.jpg" alt="Ruby-Processing" />
|
97
97
|
</a>
|
98
98
|
Via <a href="http://jruby.codehaus.org/">JRuby</a> and <a href="http://processing.org/">Processing</a><br />
|
99
99
|
Source: <a href="<%= @main_file %>"><%= @main_file %></a>
|
100
100
|
</div>
|
101
101
|
|
102
|
-
<%
|
102
|
+
<% if @description && !@description.empty? %>
|
103
103
|
<div id="description">
|
104
104
|
<h1><%= @title %></h1>
|
105
105
|
<p><%= @description %></p>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# <%= @title %>
|
2
2
|
|
3
3
|
class <%= @name %> < Processing::App
|
4
4
|
|
@@ -12,4 +12,4 @@ class <%= @name %> < Processing::App
|
|
12
12
|
|
13
13
|
end
|
14
14
|
|
15
|
-
<%= @name %>.new :title => "<%= @title %>", :width =>
|
15
|
+
<%= @name %>.new :title => "<%= @title %>"<%= ", :width => #{@width}" if @with_size %><%= ", :height => #{@height}" if @with_size %>
|
@@ -97,8 +97,12 @@ module ControlPanel
|
|
97
97
|
set_size 200, 30 + (64 * @elements.size)
|
98
98
|
set_default_close_operation javax.swing.JFrame::DISPOSE_ON_CLOSE
|
99
99
|
set_resizable false
|
100
|
-
|
101
|
-
|
100
|
+
# Need to wait for the sketch to finish sizing...
|
101
|
+
Thread.new do
|
102
|
+
sleep 0.2 while $app.default_size? || !$app.done_displaying?
|
103
|
+
set_location($app.width + 10, 0)
|
104
|
+
show
|
105
|
+
end
|
102
106
|
end
|
103
107
|
|
104
108
|
def add_element(element, name, has_label=true, button=false)
|
File without changes
|
Binary file
|
Binary file
|
data/library/pdf/library/pdf.jar
CHANGED
Binary file
|
data/library/pdf/notes.txt
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
The majority of the work in this library is done by iText.
|
2
2
|
http://www.lowagie.com/iText/
|
3
3
|
|
4
|
-
The version bundled in this release is 2.1.
|
4
|
+
The version bundled in this release is 2.1.4.
|
5
5
|
|
6
|
-
The files in the library must be named itext.jar
|
7
|
-
|
8
|
-
build/platform/make.sh scripts.
|
6
|
+
The files in the library must be named itext.jar because they're specifically
|
7
|
+
included on the classpath as part of the build/platform/make.sh scripts.
|
9
8
|
|
data/samples/animator.rb
CHANGED
@@ -1,47 +1,43 @@
|
|
1
1
|
# From the Processing Examples
|
2
|
+
# Uses the "bare" style, where a Processing::App sketch is implicitly wrapped
|
3
|
+
# around the code.
|
2
4
|
# -- omygawshkenas
|
3
5
|
|
4
|
-
|
6
|
+
FRAME_COUNT = 12
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
def setup
|
9
|
+
@frames = []
|
10
|
+
@last_time = 0
|
11
|
+
@current_frame = 0
|
12
|
+
@draw = false
|
13
|
+
@back_color = 204
|
14
|
+
size 350, 350
|
15
|
+
stroke_weight 4
|
16
|
+
smooth
|
17
|
+
background @back_color
|
18
|
+
FRAME_COUNT.times { @frames << get() }
|
19
|
+
end
|
8
20
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@
|
14
|
-
@back_color = 204
|
15
|
-
stroke_weight 4
|
16
|
-
smooth
|
17
|
-
background @back_color
|
18
|
-
FRAME_COUNT.times { @frames << get() }
|
19
|
-
end
|
20
|
-
|
21
|
-
def draw
|
22
|
-
time = millis()
|
23
|
-
if time > @last_time + 100
|
24
|
-
next_frame
|
25
|
-
@last_time = time
|
26
|
-
end
|
27
|
-
line(pmouse_x, pmouse_y, mouse_x, mouse_y) if @draw
|
28
|
-
end
|
29
|
-
|
30
|
-
def mouse_pressed; @draw = true; end
|
31
|
-
def mouse_released; @draw = false; end
|
32
|
-
|
33
|
-
def key_pressed
|
34
|
-
background @back_color
|
35
|
-
@frames.size.times {|i| @frames[i] = get()}
|
36
|
-
end
|
37
|
-
|
38
|
-
def next_frame
|
39
|
-
@frames[@current_frame] = get()
|
40
|
-
@current_frame += 1
|
41
|
-
@current_frame = 0 if @current_frame >= @frames.size
|
42
|
-
image(@frames[@current_frame], 0, 0)
|
21
|
+
def draw
|
22
|
+
time = millis()
|
23
|
+
if time > @last_time + 100
|
24
|
+
next_frame
|
25
|
+
@last_time = time
|
43
26
|
end
|
44
|
-
|
27
|
+
line(pmouse_x, pmouse_y, mouse_x, mouse_y) if @draw
|
28
|
+
end
|
29
|
+
|
30
|
+
def mouse_pressed; @draw = true; end
|
31
|
+
def mouse_released; @draw = false; end
|
32
|
+
|
33
|
+
def key_pressed
|
34
|
+
background @back_color
|
35
|
+
@frames.size.times {|i| @frames[i] = get()}
|
45
36
|
end
|
46
37
|
|
47
|
-
|
38
|
+
def next_frame
|
39
|
+
@frames[@current_frame] = get()
|
40
|
+
@current_frame += 1
|
41
|
+
@current_frame = 0 if @current_frame >= @frames.size
|
42
|
+
image(@frames[@current_frame], 0, 0)
|
43
|
+
end
|