panda_canvas 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/panda_canvas/animation_canvas.rb +40 -0
- data/lib/panda_canvas/animation_clean_room.rb +31 -0
- data/lib/panda_canvas/drawing_canvas.rb +47 -0
- data/lib/panda_canvas/{clean_room.rb → drawing_clean_room.rb} +4 -9
- data/lib/panda_canvas/{canvas.rb → drawing_methods.rb} +7 -36
- data/lib/panda_canvas/version.rb +1 -1
- data/lib/panda_canvas.rb +13 -5
- metadata +9 -6
@@ -0,0 +1,40 @@
|
|
1
|
+
module PandaCanvas
|
2
|
+
|
3
|
+
# AnimationCanvas is a subclassed Gosu::Window that is used for animation.
|
4
|
+
class AnimationCanvas < Gosu::Window
|
5
|
+
|
6
|
+
include DrawingMethods
|
7
|
+
|
8
|
+
# TexPlay image, which is drawn in the window.
|
9
|
+
attr_reader :image
|
10
|
+
|
11
|
+
# Creates a new canvas window with dimensions +width+ and +height+.
|
12
|
+
# A +block+ is passed to be executed.
|
13
|
+
def initialize(width, height, &block)
|
14
|
+
super(width, height, false)
|
15
|
+
self.caption = 'Panda Canvas'
|
16
|
+
@block = block
|
17
|
+
@image = TexPlay.create_image(self, width, height)
|
18
|
+
@clean_room = AnimationCleanRoom.new(@image)
|
19
|
+
@clean_room.canvas_calls = []
|
20
|
+
@clean_room.frame = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
# Draws the image in memory.
|
24
|
+
def draw
|
25
|
+
@image.draw(0, 0, 0)
|
26
|
+
@clean_room.canvas_calls.each {|call| send call[0], *call[1..-1] }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Runs an animation block.
|
30
|
+
def update
|
31
|
+
@image.rect 0, 0, width, height, :color => :black, :fill => true
|
32
|
+
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
33
|
+
@clean_room.canvas_calls = []
|
34
|
+
@clean_room.frame += 1
|
35
|
+
@clean_room.instance_eval &@block
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end # PandaCanvas
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PandaCanvas
|
2
|
+
|
3
|
+
# AnimationCleanRoom is used to capture and store method calls for delayed execution.
|
4
|
+
class AnimationCleanRoom
|
5
|
+
|
6
|
+
# Array of methods that need to be passed to canvas.
|
7
|
+
attr_accessor :canvas_calls
|
8
|
+
|
9
|
+
# Current frame number.
|
10
|
+
attr_accessor :frame
|
11
|
+
|
12
|
+
# Initializes the clean object for method call capturing.
|
13
|
+
# TexPlay +image+ is used for TexPlay drawing methods.
|
14
|
+
def initialize(image)
|
15
|
+
@image = image
|
16
|
+
end
|
17
|
+
|
18
|
+
# Capures and stores all missing method calls in the instance.
|
19
|
+
def method_missing(sym, *args)
|
20
|
+
if DrawingMethods::CANVAS_CALLS.include? sym
|
21
|
+
@canvas_calls << [sym, *args]
|
22
|
+
elsif Gosu::Image.public_instance_methods.include? sym
|
23
|
+
@image.send sym, *args
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end # CleanRoom
|
30
|
+
|
31
|
+
end # PandaCanvas
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module PandaCanvas
|
2
|
+
|
3
|
+
# DrawingCanvas is a subclassed Gosu::Window that is used for drawing.
|
4
|
+
class DrawingCanvas < Gosu::Window
|
5
|
+
|
6
|
+
include DrawingMethods
|
7
|
+
|
8
|
+
# TexPlay image, which is drawn in the window.
|
9
|
+
attr_reader :image
|
10
|
+
|
11
|
+
# Creates a new canvas window with dimensions +width+ and +height+.
|
12
|
+
# A +block+ is passed to be executed.
|
13
|
+
def initialize(width, height, &block)
|
14
|
+
super(width, height, false)
|
15
|
+
self.caption = 'Panda Canvas'
|
16
|
+
@image = TexPlay.create_image(self, width, height)
|
17
|
+
clean_room = DrawingCleanRoom.new
|
18
|
+
clean_room.instance_eval(&block)
|
19
|
+
@calls = clean_room.calls
|
20
|
+
@canvas_calls = []
|
21
|
+
end
|
22
|
+
|
23
|
+
# Draws the image in memory.
|
24
|
+
def draw
|
25
|
+
@image.draw(0, 0, 0)
|
26
|
+
@canvas_calls.each {|call| send call[0], *call[1..-1] }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Runs a range of commands until the next flush.
|
30
|
+
def update
|
31
|
+
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
32
|
+
unless @calls.empty?
|
33
|
+
flush_index = @calls.index(DrawingCleanRoom::FLUSH)
|
34
|
+
@calls.slice!(0...flush_index).each do |call|
|
35
|
+
if DrawingMethods::CANVAS_CALLS.include? call[0]
|
36
|
+
@canvas_calls << call
|
37
|
+
else
|
38
|
+
@image.send call[0], *call[1..-1]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@calls.shift
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end # Canvas
|
46
|
+
|
47
|
+
end # PandaCanvas
|
@@ -1,18 +1,12 @@
|
|
1
1
|
module PandaCanvas
|
2
2
|
|
3
|
-
#
|
4
|
-
class
|
3
|
+
# DrawingCleanRoom is used to capture and store method calls for delayed execution.
|
4
|
+
class DrawingCleanRoom
|
5
5
|
|
6
6
|
# Signature for the +flush+ method.
|
7
7
|
# This method is used to stop calculation and draw the frame.
|
8
8
|
FLUSH = [:flush].freeze
|
9
9
|
|
10
|
-
# Signature set for defaults that are executed in each update event.
|
11
|
-
CANVAS_UPDATE = [[:font, 12]]
|
12
|
-
|
13
|
-
# Names of calls that need to be sent directly to Canvas instead of the TexPlay image on draw.
|
14
|
-
CANVAS_CALLS = [:font, :text, :text_rel].freeze
|
15
|
-
|
16
10
|
# Returns an array of captured method calls.
|
17
11
|
# A +flush+ is appended at the end.
|
18
12
|
def calls
|
@@ -28,7 +22,8 @@ module PandaCanvas
|
|
28
22
|
def method_missing(sym, *args)
|
29
23
|
if sym == :flush
|
30
24
|
@_calls << FLUSH
|
31
|
-
elsif
|
25
|
+
elsif (DrawingMethods::CANVAS_CALLS.include? sym) ||
|
26
|
+
(Gosu::Image.public_instance_methods.include? sym)
|
32
27
|
@_calls << [sym, *args]
|
33
28
|
else
|
34
29
|
super
|
@@ -1,31 +1,17 @@
|
|
1
1
|
module PandaCanvas
|
2
2
|
|
3
|
-
|
4
|
-
class Canvas < Gosu::Window
|
3
|
+
module DrawingMethods
|
5
4
|
|
6
|
-
#
|
7
|
-
|
5
|
+
# Signature set for defaults that are executed in each update event.
|
6
|
+
CANVAS_UPDATE = [[:font, 12]]
|
8
7
|
|
9
|
-
#
|
10
|
-
|
11
|
-
def initialize(width, height, calls)
|
12
|
-
super(width, height, false)
|
13
|
-
self.caption = 'Panda Canvas'
|
14
|
-
@image = TexPlay.create_image(self, width, height)
|
15
|
-
@calls = calls
|
16
|
-
@canvas_calls = []
|
17
|
-
@used_fonts = {}
|
18
|
-
end
|
19
|
-
|
20
|
-
# Draws the image in memory.
|
21
|
-
def draw
|
22
|
-
@image.draw(0, 0, 0)
|
23
|
-
@canvas_calls.each {|call| send call[0], *call[1..-1] }
|
24
|
-
end
|
8
|
+
# Names of calls that need to be sent directly to Canvas instead of the TexPlay image on draw.
|
9
|
+
CANVAS_CALLS = [:font, :text, :text_rel].freeze
|
25
10
|
|
26
11
|
# Sets the font with name +font_name+ and +height+ in pixels to be used when drawing text.
|
27
12
|
# All subsequent text drawing calls will use the given font.
|
28
13
|
def font(height, font_name=Gosu::default_font_name)
|
14
|
+
@used_fonts ||= {}
|
29
15
|
key = [font_name, height]
|
30
16
|
if @used_fonts.include? key
|
31
17
|
@font = @used_fonts[key]
|
@@ -59,21 +45,6 @@ module PandaCanvas
|
|
59
45
|
@font.draw_rel(s, x, y, 0, rel_x, rel_y, 1, 1, color)
|
60
46
|
end
|
61
47
|
|
62
|
-
|
63
|
-
def update
|
64
|
-
CleanRoom::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
65
|
-
unless @calls.empty?
|
66
|
-
@calls.slice!(0...@calls.index(CleanRoom::FLUSH)).each do |call|
|
67
|
-
if CleanRoom::CANVAS_CALLS.include? call[0]
|
68
|
-
@canvas_calls << call
|
69
|
-
else
|
70
|
-
@image.send call[0], *call[1..-1]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
@calls.shift
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end # Canvas
|
48
|
+
end # DrawingMethods
|
78
49
|
|
79
50
|
end # PandaCanvas
|
data/lib/panda_canvas/version.rb
CHANGED
data/lib/panda_canvas.rb
CHANGED
@@ -2,8 +2,11 @@ libdir = File.dirname(__FILE__)
|
|
2
2
|
$:.unshift(libdir) unless $:.include?(libdir)
|
3
3
|
|
4
4
|
require 'texplay'
|
5
|
-
require 'panda_canvas/
|
6
|
-
require 'panda_canvas/
|
5
|
+
require 'panda_canvas/drawing_methods'
|
6
|
+
require 'panda_canvas/animation_canvas'
|
7
|
+
require 'panda_canvas/animation_clean_room'
|
8
|
+
require 'panda_canvas/drawing_canvas'
|
9
|
+
require 'panda_canvas/drawing_clean_room'
|
7
10
|
|
8
11
|
# Panda Canvas is an educational 2D drawing canvas.
|
9
12
|
module PandaCanvas
|
@@ -17,9 +20,14 @@ module PandaCanvas
|
|
17
20
|
# Takes a +block+ with drawing code.
|
18
21
|
# The code is then drawn in a window with dimensions +width+ and +height+.
|
19
22
|
def draw(width=640, height=480, &block)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
@canvas = DrawingCanvas.new(width, height, &block)
|
24
|
+
@canvas.show
|
25
|
+
end
|
26
|
+
|
27
|
+
# Takes a +block+ with animation code.
|
28
|
+
# The code is then drawn in a window with dimensions +width+ and +height+.
|
29
|
+
def animate(width=640, height=480, &block)
|
30
|
+
@canvas = AnimationCanvas.new(width, height, &block)
|
23
31
|
@canvas.show
|
24
32
|
end
|
25
33
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dimitry Solovyov
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-24 00:00:00 +03:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,8 +56,11 @@ extensions: []
|
|
56
56
|
extra_rdoc_files: []
|
57
57
|
|
58
58
|
files:
|
59
|
-
- lib/panda_canvas/
|
60
|
-
- lib/panda_canvas/
|
59
|
+
- lib/panda_canvas/animation_canvas.rb
|
60
|
+
- lib/panda_canvas/animation_clean_room.rb
|
61
|
+
- lib/panda_canvas/drawing_canvas.rb
|
62
|
+
- lib/panda_canvas/drawing_clean_room.rb
|
63
|
+
- lib/panda_canvas/drawing_methods.rb
|
61
64
|
- lib/panda_canvas/version.rb
|
62
65
|
- lib/panda_canvas.rb
|
63
66
|
- LICENSE
|