rubydraw 0.3.1.8 → 0.3.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ext/object.rb CHANGED
@@ -1,34 +1,45 @@
1
1
  class Object
2
- # Execute the given block on the appearance of an instance of +event+ and pass that
3
- # instance to the block.
4
- #
5
- # Example:
6
- # class MyWindow < Rubydraw::Window
7
- # def initialize
8
- # super(300, 300)
9
- # whenever(Rubydraw::Events::QuitRequest) do
10
- # puts "Goodbye!"
11
- # close
12
- # end
13
- # whenever(Rubydraw::Events::MouseMove) do |event|
14
- # new_pos = event.position
15
- # puts "Mouse moved to #{new_pos.x}, #{new_pos.y}.}"
16
- # end
17
- # end
18
- # end
19
- def whenever(event, window=self, &block)
20
- # A very simple rule: +window+ must be a window. Therefore, since +window+ is self
21
- # by default, instances of Rubydraw::Window calling this method don't have to set
22
- # that parameter.
23
- unless window.is_a?(Rubydraw::Window)
24
- raise ArgumentError, "window must be a Rubydraw::Window"
25
- end
26
- event_block = window.registered_actions[event]
27
- # If nobody has registered a block for this event, prepare the way.
28
- if event_block.nil?
29
- window.registered_actions[event] = []
30
- end
31
- # Now add the block.
32
- window.registered_actions[event] << block
2
+ # Execute the given block on the appearance of an instance of +event+ and pass that
3
+ # instance to the block.
4
+ #
5
+ # Example:
6
+ # class MyWindow < Rubydraw::Window
7
+ # def initialize
8
+ # super(300, 300)
9
+ # whenever(Rubydraw::Events::QuitRequest) do
10
+ # puts "Goodbye!"
11
+ # close
12
+ # end
13
+ # whenever(Rubydraw::Events::MouseMove) do |event|
14
+ # new_pos = event.position
15
+ # puts "Mouse moved to #{new_pos.x}, #{new_pos.y}.}"
16
+ # end
17
+ # end
18
+ # end
19
+ def register_action(event, window=self, &block)
20
+ # A very simple rule: +window+ must be a window. Therefore, since +window+ is self
21
+ # by default, instances of Rubydraw::Window calling this method don't have to set
22
+ # that parameter.
23
+ unless window.is_a?(Rubydraw::Window)
24
+ raise ArgumentError, "window must be a Rubydraw::Window"
33
25
  end
26
+ event_block = window.registered_actions[event]
27
+ # If nobody has registered a block for this event, prepare the way.
28
+ if event_block.nil?
29
+ window.registered_actions[event] = {}
30
+ end
31
+ # Now add the block.
32
+ window.registered_actions[event][self] = block
33
+ end
34
+
35
+ alias whenever register_action
36
+
37
+ # Adds the ability to remove actions from registered_actions. Useful if, for example,
38
+ # one were to implement a button that only works if it is shown.
39
+ def unregister_action(event, window=self)
40
+ unless window.is_a?(Rubydraw::Window)
41
+ raise ArgumentError, "window must be a Rubydraw::Window"
42
+ end
43
+ window.registered_actions[event].delete(self)
44
+ end
34
45
  end
@@ -66,7 +66,7 @@ module Rubydraw
66
66
  class UnknownEvent < Event
67
67
  # The SDL event should be passed so that the programmer using this library can still
68
68
  # attempt to implement behavior, but it will have to match and SDL event, not a
69
- # Rubydraw::Events::Event.
69
+ # Rubydraw Event.
70
70
  def from_sdl_event(sdl_event)
71
71
  self.new(sdl_event)
72
72
  end
@@ -215,7 +215,7 @@ module Rubydraw
215
215
  # Rubydraw::Events::FocusGain and Rubydraw::Events::FocusLose.
216
216
  class FocusEvent < Event
217
217
  def self.wants_to_match?
218
- false
218
+ not self == FocusEvent
219
219
  end
220
220
 
221
221
  def self.matching_sdl_type
@@ -226,10 +226,6 @@ module Rubydraw
226
226
  # Created when the window gains focus, e.g. clicking on the window after previously using
227
227
  # another application.
228
228
  class FocusGain < FocusEvent
229
- def self.wants_to_match?
230
- true
231
- end
232
-
233
229
  # Redefine Event#matches? because both this class and Rubydraw::Events::FocusLoss use
234
230
  # SDL::ActiveEvent.
235
231
  def self.matches?(sdl_event)
@@ -242,10 +238,6 @@ module Rubydraw
242
238
 
243
239
  # Created when the window loses focus.
244
240
  class FocusLoss < FocusEvent
245
- def self.wants_to_match?
246
- true
247
- end
248
-
249
241
  # Redefine Event#matches? because both this class and Rubydraw::Events::FocuGain use
250
242
  # SDL::ActiveEvent
251
243
  def self.matches?(sdl_event)
@@ -5,21 +5,20 @@ module Rubydraw
5
5
  # read the documentation for Image#draw), call it's #draw method
6
6
  # and pass it the +x+ and +y+ coordinates.
7
7
  class Image < Surface
8
- # Create a new image and load the file from a path. Or, wrap an
9
- # SDL::Surface.
10
8
  def initialize(arg)
11
- if arg.is_a?(String)
12
- # This must mean to load from a path.
13
- load_from_path(arg)
14
- elsif arg.is_a?(SDL::Surface)
15
- load_from_surface(arg)
9
+ if arg.kind_of?(SDL::Surface)
10
+ # This means we want to wrap an sdl surface.
11
+ @sdl_surface = arg
12
+ elsif arg.kind_of?(String)
13
+ # This means we want to load an image from a file.
14
+ initialize_from_path(arg)
16
15
  else
17
- raise TypeError, "Failed to load image: Expected String or SDL::Surface but got: #{arg}"
16
+ # Raise an error if it is neither. I should figure out a less strict, more dynamic way to do this.
17
+ raise SDLError, "Argument to Rubydraw::Image.new was neither an image path nor an SDL::Surface to wrap"
18
18
  end
19
- self
20
19
  end
21
20
 
22
- def load_from_path(path) #:nodoc:
21
+ def initialize_from_path(path)
23
22
  # Check if this image has already been initialized. If it has, raise
24
23
  # an error.
25
24
  unless @sdl_surface.nil?
@@ -35,16 +34,5 @@ module Rubydraw
35
34
  raise SDLError, "Failed to load image: #{SDL.GetError}"
36
35
  end
37
36
  end
38
-
39
- def load_from_surface(surface) #:nodoc:
40
- # Check if this image has already been initialized. If it has, raise
41
- # an error.
42
- unless @sdl_surface.nil?
43
- raise SDLError, "Images may only be loaded once"
44
- end
45
- @sdl_surface = surface
46
- end
47
-
48
- private :load_from_path, :load_from_surface
49
37
  end
50
38
  end
@@ -6,7 +6,7 @@ module Rubydraw
6
6
  # Rubydraw::Sound#new: Creates a new sound with the given file path
7
7
  #
8
8
  # Rubydraw::Sound#play: Plays the sound. *Note*: this method exits
9
- # immediatley; it doesn't wait until the sound is finished.
9
+ # immediately; it doesn't wait until the sound is finished.
10
10
  class Sound
11
11
  # Used to specify the volume (from 0 to 1) when this sound is played.
12
12
  # Set at 1 by default
@@ -19,11 +19,11 @@ module Rubydraw
19
19
  full_path = File.expand_path path
20
20
  SDL::Mixer.OpenAudio(22050, SDL::AUDIO_S16SYS, 2, 1024)
21
21
  @sdl_sound = SDL::Mixer::LoadWAV(full_path)
22
- # Ususally happens because the file doesn't exist.
22
+ # Usually happens because the file doesn't exist.
23
23
  if @sdl_sound.pointer.null?
24
- raise SDLError "Failed to load sound from: #{full_path} because '#{SDL.GetError}'"
24
+ raise SDLError, "Failed to load sound from: #{full_path} because '#{SDL.GetError}'"
25
25
  end
26
- # The default volume. Can be changed with Sound's volume arrtibute.
26
+ # The default volume. Can be changed with Sound's volume attribute.
27
27
  @volume = 1
28
28
  # Allocate a new SDL channel all for this sound to use.
29
29
  @channel = SDL::Mixer.AllocateChannels(SDL::Mixer.AllocateChannels(-1) + 1) - 1
@@ -13,8 +13,17 @@ module Rubydraw
13
13
  Text.new(contents, color)
14
14
  end
15
15
 
16
+ def initialize(*args)
17
+ if args.size == 1
18
+ # Must mean to wrap an SDL surface.
19
+ @sdl_surface = args[0]
20
+ else
21
+ load_from_color(*args)
22
+ end
23
+ end
24
+
16
25
  # Create a new, blank surface with the given dimensions.
17
- def initialize(dimensions, color=Rubydraw::Color::Black)
26
+ def load_from_color(dimensions, color=Rubydraw::Color::Black)
18
27
  @dimensions = dimensions
19
28
  pixel_format = SDL.GetVideoInfo.vfmt
20
29
  rmsk, gmsk, bmsk, amsk = 0xff0000, 0x00ff00, 0x0000ff, 0x000000
@@ -27,6 +36,8 @@ module Rubydraw
27
36
  self
28
37
  end
29
38
 
39
+ private :load_from_color
40
+
30
41
  # Blit (copy) into +surface at +position+ (see Rubydraw::Point).
31
42
  # No graphical effects are applied.
32
43
  def blit(surface, position)
data/lib/rubydraw/text.rb CHANGED
@@ -7,7 +7,7 @@ module Rubydraw
7
7
 
8
8
  # Create a new drawable Text object with the given font and contents.
9
9
  def initialize(contents, color, font_name="Times New Roman", font_size = 25)
10
- @font, @contents, @font_size, @color = font_name, contents, font_size, color
10
+ @contents, @font, @font_size, @color = contents, font_name, font_size, color
11
11
  if File.exist?(font_name)
12
12
  font_path = font_name
13
13
  else
@@ -24,5 +24,16 @@ module Rubydraw
24
24
  sdl_color = @color.to_sdl
25
25
  @sdl_surface = SDL::TTF.RenderText_Blended(sdl_text, @contents, sdl_color)
26
26
  end
27
+
28
+ # Redefined because if @text is an empty string, it would
29
+ # return nil.
30
+ def width
31
+ super or 0
32
+ end
33
+
34
+ # See Rubydraw::Text#width
35
+ def height
36
+ super or 0
37
+ end
27
38
  end
28
39
  end
@@ -58,6 +58,10 @@ module Rubydraw
58
58
  end
59
59
  end
60
60
 
61
+ def size
62
+ Point[width, height]
63
+ end
64
+
61
65
  # Call this method to start updating and drawing.
62
66
  def show
63
67
  @open = true
@@ -125,14 +129,20 @@ module Rubydraw
125
129
  end
126
130
 
127
131
  # Collect and handle new events by executing blocks in +@regestered_events+. See
128
- # Rubydraw::Window#register_action on how to use it.
132
+ # Object#whenever on how to use it.
129
133
  def handle_events
130
134
  events = @event_queue.get_events
131
- events.each { |event|
132
- blocks = @registered_actions[event.class]
135
+ events.each {|event|
136
+ # +blocks+ is a hashmap; the value being the object that registered it. This
137
+ # property is only used in Object#unregister_action.
138
+ events = @registered_actions
139
+ blocks = events[event.class]
133
140
  unless blocks.nil?
134
- blocks.each { |b| b.call(event) unless b.nil? }
135
- end }
141
+ blocks.each {|obj, b|
142
+ b.call(event) unless b.nil?
143
+ }
144
+ end
145
+ }
136
146
  end
137
147
 
138
148
  # Causes the main loop to exit as soon as it get the chance to.
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rubydraw
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.1.8
5
+ version: 0.3.2.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - J. Wostenberg
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-12-23 00:00:00 -07:00
13
+ date: 2012-01-14 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency