rubydraw 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,20 @@
1
+ Rubydraw is a high level game/graphics library, like Gosu or Rubygame, and is written in Ruby.
2
+ Its only dependency is ruby-sdl-ffi, which it uses to access SDL functions.
3
+ –––––
4
+ NOTE: I can't get +ruby-sdl-ffi+ (the library Rubydraw uses to access SDL) to work with +Ruby
5
+ 1.9.2+, so I don't know if it even does. If it does work, and/or you know how to make it work,
6
+ I would appreciate it if you notify me. So basically, I can't test anything with +1.9.2+. Sorry
7
+ for the inconvenience!
8
+
9
+ HOW TO INSTALL
10
+ To install this library which isn't on Rubygems.org YET, navigate to this directory in the command
11
+ line tool and give "rubydraw/build_and_install" permissions to run. Then simply run it. Hooray, it
12
+ should be working now! Test it in irb with "require 'rubydraw'". Also: I will upload this gem to
13
+ rubygems when it is actually usable (if it ever is).
14
+
15
+ HOW TO USE
16
+ There isn't a proper guide yet, so just read the comments in the other files. Or you can fire up the
17
+ gem server and read the RDoc.
18
+
19
+ Thanks for checking this little project. I hope it doesn't give you headaches.
20
+ Have fun!
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ require 'rubydraw'
3
+
4
+ class MyWindow < Rubydraw::Window
5
+ # Create a new window with an bug image inside it
6
+ def initialize(width, height)
7
+ super(width, height)
8
+ @image = Rubydraw::Image.new(self, "media/bug.png")
9
+ @max = 100
10
+
11
+ register_action(Rubydraw::Events::MouseMove) {|event| puts "Mouse moved! New position: #{event.position.x}, #{event.position.y}"}
12
+ register_action(Rubydraw::Events::QuitRequest) {close}
13
+ end
14
+
15
+ def mouse_moved(event)
16
+ new_position = event.position
17
+ puts "Mouse moved! New position: #{new_position.x}, #{new_position.y}"
18
+ end
19
+
20
+ # Draw the image inside this window.
21
+ def tick
22
+ @image.draw(Rubydraw::Point[width / 2, height / 2])
23
+ end
24
+ end
25
+
26
+ w = MyWindow.new(300, 300)
27
+ w.open
Binary file
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'rubydraw'
3
+
4
+ class MyWindow < Rubydraw::Window
5
+ def initialize(width, height)
6
+ super(width, height)
7
+ puts "New window created with width: #{@width} and height #{@height}"
8
+ end
9
+ def handle_event(event)
10
+ case event
11
+ when Rubydraw::Event::Quit
12
+ close
13
+ end
14
+ end
15
+ end
16
+
17
+ print "Window height: "
18
+ w = gets.to_i
19
+ print "Window width: "
20
+ h = gets.to_i
21
+
22
+ window = MyWindow.new(w, h).open
23
+
24
+ # Wait for a while to let the user enjoy the window
25
+ sleep 10
data/lib/rubydraw.rb ADDED
@@ -0,0 +1,32 @@
1
+ # The only dependency
2
+ require 'ruby-sdl-ffi'
3
+
4
+ # Require all the rubydraw files
5
+ #files = ["window", "image", "sdl_error", "event_queue", "events", "point"]
6
+ files = %w[
7
+ window
8
+ image
9
+ sdl_error
10
+ keys
11
+ event_queue
12
+ events
13
+ point]
14
+ files.each {|f| require("rubydraw/" + f)}
15
+
16
+ # Rubydraw is a high level game/graphics library, like Gosu or Rubygame, and is written completely
17
+ # in Ruby. Its only dependency is ruby-sdl-ffi, which it uses to access SDL functions.
18
+ #
19
+ # NOTE: I can't get +ruby-sdl-ffi+ (the library Rubydraw uses to access SDL) to work with +Ruby
20
+ # 1.9.2,+ so I don't know if it even does. If it does work, and/or you know how to make it work,
21
+ # I would appreciate it if you notify me. So basically, I can't test anything with +1.9.2+. Sorry
22
+ # for the inconvenience!
23
+ module Rubydraw
24
+ # Initialize SDL.
25
+ def self.initialize_sdl
26
+ if SDL::Init(SDL::INIT_EVERYTHING) != 0
27
+ raise DrawError "Could not initialize SDL"
28
+ end
29
+ end
30
+ end
31
+
32
+ Rubydraw::initialize_sdl
@@ -0,0 +1,16 @@
1
+ module Rubydraw
2
+ # Rubydraw uses an EventQueue to collect SDL events, e.g. mouse movements
3
+ # keystrokes, and window actions. A new EventQueue is automatically created
4
+ # when a Rubydraw::Window is initialized. Every tick, the window asks its
5
+ # event queue (created in Rubydraw::Window#initialize) for the new events
6
+ class EventQueue
7
+ # Get all the new events
8
+ def get_events
9
+ events = []
10
+ until((event = SDL::PollEvent()).nil?)
11
+ events << Events.match(event)
12
+ end
13
+ events
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,192 @@
1
+ class Object
2
+ # Returns false by default. Is overridden in Rubydraw::Events::Event#is_event?
3
+ def event?
4
+ false
5
+ end
6
+ end
7
+
8
+ class Class
9
+ # Returns all subclasses. Credit goes to http://stackoverflow.com/questions/436159/how-to-get-all-subclasses
10
+ def all_subclasses
11
+ result = []
12
+ ObjectSpace.each_object(Class) { |klass| result << klass if klass < self }
13
+ result
14
+ end
15
+ end
16
+
17
+ module Rubydraw
18
+ # A module containing Rubydraw events and their SDL event "bindings".
19
+ module Events
20
+ # Translate the given SDL event to its corresponding Rubydraw event, by asking
21
+ # each event class if it matches the SDL event. No case statements here.
22
+ def self.match(sdl_event)
23
+ sdl_event_type = sdl_event.type
24
+ event_classes = Event.all_subclasses.compact
25
+ rubydraw_event = UnknownEvent.new
26
+ event_classes.each { |event| rubydraw_event = event.from_sdl_event(sdl_event) if event.matches?(sdl_event_type) }
27
+ rubydraw_event
28
+ end
29
+
30
+ # The basic Event class. All events should inherit from this class, otherwise it
31
+ # won't be recognized as an event and therefore will *not* participate in event
32
+ # matching.
33
+ class Event
34
+ # Just creates a new instance of this class by default. Override this if the subclass
35
+ # requires parameters in +initialize,+ like Rubydraw::Events::MouseDown::from_sdl_event.
36
+ def self.from_sdl_event(sdl_event)
37
+ self.new
38
+ end
39
+
40
+ # Returns true if this is the overlaying class for the given SDL event. Override this
41
+ # for custom matching.
42
+ def self.matches?(sdl_event)
43
+ sdl_event == matching_sdl_event
44
+ end
45
+
46
+ # Returns true for all event objects. Also see Object#event?
47
+ def event?
48
+ true
49
+ end
50
+
51
+ # Returns the matching SDL event, override this in subclasses. Returns nil by
52
+ # default.
53
+ def self.matching_sdl_event
54
+ nil
55
+ end
56
+ end
57
+
58
+ # A special event class that is called when no Rubydraw event is matched to an
59
+ # SDL event.
60
+ class UnknownEvent < Event
61
+ end
62
+
63
+ # Provides methods used in both Rubydraw::Events::KeyPressed and
64
+ # Rubydraw::Events::KeyReleased. No instances of this class should be created,
65
+ # but instances of subclasses are fine.
66
+ class KeyboardEvent < Event
67
+ def self.from_sdl_event(sdl_event)
68
+ self.new(sdl_event.keysym.sym)
69
+ end
70
+
71
+ attr_reader(:key)
72
+
73
+ def initialize(key)
74
+ unless key.is_a?(Numeric)
75
+ raise SDLError "Failed to create new event because key is not a number."
76
+ end
77
+
78
+ @key = key
79
+ end
80
+ end
81
+
82
+ # Created when any keyboard button is pressed, specifying the key.
83
+ #
84
+ # @key:: An integer specifying the key, which can be matched with a Rubydraw
85
+ # button constants.
86
+ class KeyPressed < KeyboardEvent
87
+ def self.matching_sdl_event
88
+ SDL::KEYDOWN
89
+ end
90
+ end
91
+
92
+ # Created when any keyboard button is released, specifying the key.
93
+ #
94
+ # @key:: An integer specifying the key, which can be matched with a Rubydraw
95
+ # button constants.
96
+ class KeyReleased < KeyboardEvent
97
+ def self.matching_sdl_event
98
+ SDL::KEYUP
99
+ end
100
+ end
101
+
102
+ # Provides methods used in Rubydraw::Events::MousePressed and Rubydraw::Events::MouseReleased.
103
+ # No instances of this class should be created, but instances of subclasses are find.
104
+ class MouseButtonEvent
105
+ def from_sdl_event(sdl_event)
106
+ self.new(Point[sdl_event.x, sdl_event.y], sdl_events.button)
107
+ end
108
+
109
+ attr_reader(:position, :button)
110
+
111
+ def initialize(position, button)
112
+ @position, @button = position, button
113
+ end
114
+ end
115
+
116
+ # Created when a mouse button is down. Note: this event is used for *any* mouse
117
+ # button.
118
+ class MousePressed < Event
119
+ def self.from_sdl_event(sdl_event)
120
+ self.new(Point[sdl_event.x, sdl_event.y], sdl_event.button)
121
+ end
122
+
123
+ def self.matching_sdl_event
124
+ SDL::MOUSEBUTTONDOWN
125
+ end
126
+
127
+ attr_reader(:position, :button)
128
+
129
+ # Creates a new MousePressed event, specifying where (the position) it happened
130
+ # and what button was pressed.
131
+ def initialize(position, button)
132
+ @position, @button = position, button
133
+ end
134
+ end
135
+
136
+ # Created when a mouse button is released. Note: this event is used for *any* mouse
137
+ # button.
138
+ class MouseReleased < Event
139
+ def self.from_sdl_event(sdl_event)
140
+ self.new(Point[sdl_event.x, sdl_event.y], sdl_event.button)
141
+ end
142
+
143
+ def self.matching_sdl_event
144
+ SDL::MOUSEBUTTONUP
145
+ end
146
+
147
+ attr_reader(:position, :button)
148
+
149
+ # Creates a new MouseReleased event, specifying where (the position) it happened and
150
+ # what button was released.
151
+ def initialize(position, button)
152
+ @position, @button = position, button
153
+ end
154
+ end
155
+
156
+ # Created when the mouse is moved.
157
+ class MouseMove < Event
158
+ def self.from_sdl_event(sdl_event)
159
+ self.new(Point[sdl_event.x, sdl_event.y], Point[sdl_event.xrel, sdl_event.yrel])
160
+ end
161
+
162
+ def self.matching_sdl_event
163
+ SDL::MOUSEMOTION
164
+ end
165
+
166
+ attr_reader(:position, :relative_position)
167
+
168
+ # Create a new MouseMove event with the new mouse position.
169
+ #
170
+ # +x+ and +y+: The new position of the cursor.
171
+ #
172
+ # +relative_x+ and +relative_y+: The relative movement of the cursor since the last tick.
173
+ def initialize(position, relative_position)
174
+ @position, @relative_position = position, relative_position
175
+ end
176
+ end
177
+
178
+ # Created either when the window gains or loses focus.
179
+ class WindowFocus
180
+ def from_sdl_event(sdl_event)
181
+ self.new(sdl_event.gain)
182
+ end
183
+ end
184
+
185
+ # Created when the user attempts to close the window.
186
+ class QuitRequest < Event
187
+ def self.matching_sdl_event
188
+ SDL::QUIT
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,53 @@
1
+ module Rubydraw
2
+ # Image instances can be initialized with Image#new, passing the
3
+ # window to draw in, and the path to the image file to draw with.
4
+ # Then to actually draw the image (doesn't happen immediatley;
5
+ # read the documentation for Image#draw), call it's #draw method
6
+ # and pass it the +x+ and +y+ coordinates.
7
+ class Image
8
+ # Create a new image in the given window and load the image from
9
+ # +path.+
10
+ def initialize(window, path)
11
+ @window = window
12
+ unless window.is_a?(Rubydraw::Window)
13
+ raise Rubydraw::SDLError "Window cannot be nil"
14
+ end
15
+ # In case program is being run from a different directory,
16
+ # provide the _full_ path. Nothing relative here.
17
+ full_path = File.expand_path path
18
+ @sdl_image = SDL::Image.Load(full_path)
19
+ if @sdl_image.pointer.null?
20
+ # SDL couln't load the image; usually happens because it doesn't
21
+ # exist.
22
+ raise Rubydraw::SDLError "Failed to load image from: '#{full_path}'"
23
+ end
24
+ end
25
+
26
+ # Blit (copy) into the window at +position+ (see point.rb).
27
+ # No graphical effects are applied.
28
+ #
29
+ # Notice that you don't blit surfaces to other surfaces when using
30
+ # Rubygame, but instead you draw things.
31
+ def draw(position)
32
+ source_rect = SDL::Rect.new([0, 0, width, height])
33
+ blit_rect = SDL::Rect.new([position.x, position.y, @window.width, @window.height])
34
+ SDL::BlitSurface(@sdl_image, source_rect, @window.sdl_surface, blit_rect)
35
+ end
36
+
37
+ # Returns the image width
38
+ def width
39
+ @sdl_image.w
40
+ end
41
+
42
+ # Returns the image height
43
+ def height
44
+ @sdl_image.h
45
+ end
46
+
47
+ # Returns the SDL image that was created in Image#initialize.
48
+ # Rubydraw::Window uses this to draw this Image instance.
49
+ def sdl_image
50
+ @sdl_image
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,95 @@
1
+ module Rubydraw
2
+ # Keys defines constants which identify with a key integer.
3
+ #
4
+ # Example:
5
+ #
6
+ # def handle_event(event)
7
+ # case event
8
+ # when Rubydraw::Events::KeyPressed
9
+ # case event.key
10
+ # when Rubydraw::Keys::UpArrow
11
+ # @y -= 5
12
+ # when Rubydraw::Keys::DownArrow
13
+ # @y += 5
14
+ # when Rubydraw::Keys::RightArrow
15
+ # @x += 1
16
+ # when Rubydraw::Keys::LeftArrow
17
+ # @x -= 1
18
+ # end
19
+ # end
20
+ module Keys
21
+ UpArrow = SDL::K_UP
22
+ DownArrow = SDL::K_DOWN
23
+ RightArrow = SDL::K_RIGHT
24
+ LeftArrow = SDL::K_LEFT
25
+ # Letters
26
+ A = SDL::K_a
27
+ B = SDL::K_b
28
+ C = SDL::K_c
29
+ D = SDL::K_d
30
+ E = SDL::K_e
31
+ F = SDL::K_f
32
+ G = SDL::K_g
33
+ H = SDL::K_h
34
+ I = SDL::K_i
35
+ J = SDL::K_j
36
+ K = SDL::K_k
37
+ L = SDL::K_l
38
+ M = SDL::K_m
39
+ N = SDL::K_n
40
+ O = SDL::K_o
41
+ P = SDL::K_p
42
+ Q = SDL::K_q
43
+ R = SDL::K_r
44
+ S = SDL::K_s
45
+ T = SDL::K_t
46
+ U = SDL::K_u
47
+ V = SDL::K_v
48
+ W = SDL::K_w
49
+ X = SDL::K_x
50
+ Y = SDL::K_y
51
+ Z = SDL::K_z
52
+ # Numbers
53
+ Num0 = SDL::K_0
54
+ Num1 = SDL::K_1
55
+ Num2 = SDL::K_2
56
+ Num3 = SDL::K_3
57
+ Num4 = SDL::K_4
58
+ Num5 = SDL::K_5
59
+ Num6 = SDL::K_6
60
+ Num7 = SDL::K_7
61
+ Num8 = SDL::K_8
62
+ Num9 = SDL::K_9
63
+ # Shift
64
+ LeftShift = SDL::K_LSHIFT
65
+ RightShift = SDL::K_RSHIFT
66
+ # Whitespaces
67
+ Space = SDL::K_SPACE
68
+ Tab = SDL::K_TAB
69
+ # Control
70
+ # Alt/option
71
+ LeftAlt = SDL::K_LALT
72
+ RightAlt = SDL::K_RALT
73
+ LeftOption = LeftAlt
74
+ RightOption = RightAlt
75
+ # Function buttons
76
+ F1 = SDL::K_F1
77
+ F2 = SDL::K_F2
78
+ F3 = SDL::K_F3
79
+ F4 = SDL::K_F4
80
+ F5 = SDL::K_F5
81
+ F6 = SDL::K_F6
82
+ F7 = SDL::K_F7
83
+ F8 = SDL::K_F8
84
+ F9 = SDL::K_F9
85
+ F10 = SDL::K_F10
86
+ F11 = SDL::K_F11
87
+ F12 = SDL::K_F12
88
+ # Other stuff
89
+ Escape = SDL::K_ESCAPE
90
+ CapsLock = SDL::K_CAPSLOCK
91
+ Backspace = SDL::K_BACKSPACE
92
+ Delete = SDL::K_DELETE
93
+
94
+ end
95
+ end
@@ -0,0 +1,22 @@
1
+ module Rubydraw
2
+ # Used for specifying x and y positions in one class, instead of by themselves or
3
+ # arrays. Might look like:
4
+ #
5
+ # @image.draw(Point[5, 6])
6
+ class Point
7
+ # Shorthand new method
8
+ def self.[](x, y)
9
+ self.new(x, y)
10
+ end
11
+
12
+ attr_accessor(:x, :y)
13
+
14
+ # Create a new point with the given +x+ and +y+ positions.
15
+ def initialize(x, y)
16
+ unless x.is_a?(Numeric) and y.is_a?(Numeric)
17
+ raise RuntimeError "New Point x and y must be a number."
18
+ end
19
+ @x, @y = x, y
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ module Rubydraw
2
+ # Usually raised by anything pertaining to drawing things with SDL.
3
+ # Look at the uses to see examples.
4
+ class SDLError < RuntimeError
5
+ end
6
+ end
@@ -0,0 +1,120 @@
1
+ module Rubydraw
2
+ # Instances of Rubydraw::Window can draw themselves on the screen after you open them.
3
+ # Note: there can only be one window on the screen at a time; it is a limit
4
+ # of SDL. One important things about instances of Rubydraw::Window: its main loop
5
+ # (which starts when Rubydraw::Window#open is called) is *not* forked! It will break
6
+ # when Rubydraw::Window#close is called (as soon as I get around to implementing this).
7
+ class Window
8
+ # Create a new window.
9
+ def initialize(width, height)
10
+ unless height.is_a?(Numeric) and width.is_a?(Numeric)
11
+ # Raise an error
12
+ raise SDLError "Window width and height have to be a number."
13
+ end
14
+
15
+ @width = width
16
+ @height = height
17
+ @open = false
18
+
19
+ @event_queue = EventQueue.new
20
+
21
+ @registered_actions = {}
22
+ end
23
+
24
+ # Call this method to start updating and drawing.
25
+ def open
26
+ @open = true
27
+ # Behold, the main loop. Drumroll!
28
+ @screen = SDL::SetVideoMode(@width, @height, 0, 0)
29
+ loop do
30
+ handle_events
31
+ if @open
32
+ tick
33
+ # Update the screen to show any changes.
34
+ SDL::UpdateRect(@screen, 0, 0, 0, 0)
35
+ else
36
+ # This is where the loop is broken after Rubydraw::Window#close is called.
37
+ break
38
+ end
39
+ # Pause for a bit, so it's not such a tight loop.
40
+ sleep 0.1
41
+ end
42
+ end
43
+
44
+ # Call this method to tell SDL to quit drawing. The loop (started in
45
+ # Rubydraw::Window#open) would continue if +close+ only stopped drawing, so
46
+ # break the loop too.
47
+ def close
48
+ break_main_loop
49
+ SDL.QuitSubSystem(SDL::INIT_VIDEO)
50
+ end
51
+
52
+ # Collect and handle new events by executing blocks in +@regestered_events+. See
53
+ # Rubydraw::Window#register_action on how to use it.
54
+ def handle_events
55
+ events = @event_queue.get_events
56
+
57
+ events.each {|event|
58
+ block = @registered_actions[event.class]
59
+ block.call(event) unless block.nil?}
60
+ end
61
+
62
+ # Redefine this in a subclass to use custom event handling. Does nothing by
63
+ # default.
64
+ def handle_event(event)
65
+ end
66
+
67
+ # This causes the main loop to exit. Use Rubydraw::Window#close to close the
68
+ # window, not this.
69
+ def break_main_loop
70
+ @open = false
71
+ end
72
+
73
+ # Returns if this window is open.
74
+ def open?
75
+ @open
76
+ end
77
+
78
+ # Return the SDL surface object. Only used in Rubydraw::Image#draw for blitting to
79
+ # this window.
80
+ def sdl_surface
81
+ @screen
82
+ end
83
+
84
+
85
+ # Redefine Rubydraw::Window#tick with any code you want to be executed
86
+ # every frame, like drawing functions.
87
+ #
88
+ # Does nothing by default.
89
+ def tick
90
+ end
91
+
92
+ # Return the width of this window.
93
+ def width
94
+ @width
95
+ end
96
+
97
+ # Return the height of this window.
98
+ def height
99
+ @height
100
+ end
101
+
102
+ # Send +selector+ to +reciever+ when +event+ happens, and include the specific event
103
+ # instace as a parameter if send_params = true.
104
+
105
+ # Execute the given block on the appearance of an instance of +event+.
106
+ #
107
+ # Example:
108
+ # class MyWindow < Rubydraw::Window
109
+ # def initialize
110
+ # super(300, 300)
111
+ #
112
+ # register_action(Rubydraw::Events::MouseMove) {|event| new_pos = event.position; puts "Mouse moved to #{new_pos.x}, #{new_pos.y}"}
113
+ # register_action(Rubydraw::Events::QuitRequest) {puts "Goodbye!"; close}
114
+ # end
115
+ # end
116
+ def register_action(event, &block)
117
+ @registered_actions[event] = block
118
+ end
119
+ end
120
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubydraw
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - J. Wostenberg
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-11-12 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: ruby-sdl-ffi
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ - 4
33
+ version: "0.4"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: |-
37
+
38
+ Rubydraw is a high level drawing/game library,
39
+ like Gosu or Rubygame. Its only dependency is
40
+ ruby-sdl-ffi, which it uses to access SDL
41
+ functions.
42
+ email:
43
+ executables: []
44
+
45
+ extensions: []
46
+
47
+ extra_rdoc_files: []
48
+
49
+ files:
50
+ - README
51
+ - lib/rubydraw.rb
52
+ - lib/rubydraw/window.rb
53
+ - lib/rubydraw/image.rb
54
+ - lib/rubydraw/sdl_error.rb
55
+ - lib/rubydraw/keys.rb
56
+ - lib/rubydraw/event_queue.rb
57
+ - lib/rubydraw/events.rb
58
+ - lib/rubydraw/point.rb
59
+ - examples/window_ex.rb
60
+ - examples/image_ex.rb
61
+ - examples/media/bug.png
62
+ has_rdoc: true
63
+ homepage: https://github.com/awostenberg/rubydraw
64
+ licenses: []
65
+
66
+ post_install_message:
67
+ rdoc_options: []
68
+
69
+ require_paths:
70
+ - lib
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ requirements: []
91
+
92
+ rubyforge_project:
93
+ rubygems_version: 1.5.2
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Rubydraw is a high level drawing/graphics library, like Gosu or Rubygame
97
+ test_files: []
98
+