graphics 1.0.0b1 → 1.0.0b4

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/History.rdoc +30 -0
  5. data/Manifest.txt +39 -7
  6. data/README.rdoc +48 -4
  7. data/Rakefile +8 -2
  8. data/examples/boid.rb +9 -18
  9. data/examples/bounce.rb +15 -23
  10. data/examples/canvas.rb +75 -0
  11. data/examples/collision.rb +6 -6
  12. data/examples/demo.rb +5 -7
  13. data/examples/editor.rb +12 -9
  14. data/examples/fluid.rb +2 -3
  15. data/examples/fluid2.rb +1 -1
  16. data/examples/{lito2.rb → gol.rb} +0 -0
  17. data/examples/{zenspider4.rb → gol2.rb} +0 -0
  18. data/examples/logo.rb +4 -7
  19. data/examples/maze.rb +136 -0
  20. data/examples/tank.rb +10 -11
  21. data/examples/tank2.rb +12 -17
  22. data/examples/targeting.rb +1 -1
  23. data/examples/vants.rb +1 -1
  24. data/examples/walker.rb +3 -12
  25. data/examples/walker2.rb +197 -0
  26. data/examples/zombies.rb +31 -35
  27. data/ext/sdl/extconf.rb +31 -0
  28. data/ext/sdl/sdl.c +1067 -0
  29. data/ext/sdl/sge/INSTALL +72 -0
  30. data/ext/sdl/sge/LICENSE +504 -0
  31. data/ext/sdl/sge/Makefile +83 -0
  32. data/ext/sdl/sge/Makefile.conf +63 -0
  33. data/ext/sdl/sge/README +219 -0
  34. data/ext/sdl/sge/Todo +7 -0
  35. data/ext/sdl/sge/WhatsNew +224 -0
  36. data/ext/sdl/sge/sge.h +31 -0
  37. data/ext/sdl/sge/sge_blib.cpp +1939 -0
  38. data/ext/sdl/sge/sge_blib.h +68 -0
  39. data/ext/sdl/sge/sge_bm_text.cpp +451 -0
  40. data/ext/sdl/sge/sge_bm_text.h +71 -0
  41. data/ext/sdl/sge/sge_collision.cpp +388 -0
  42. data/ext/sdl/sge/sge_collision.h +54 -0
  43. data/ext/sdl/sge/sge_config.h +6 -0
  44. data/ext/sdl/sge/sge_internal.h +152 -0
  45. data/ext/sdl/sge/sge_misc.cpp +92 -0
  46. data/ext/sdl/sge/sge_misc.h +37 -0
  47. data/ext/sdl/sge/sge_primitives.cpp +2516 -0
  48. data/ext/sdl/sge/sge_primitives.h +111 -0
  49. data/ext/sdl/sge/sge_rotation.cpp +683 -0
  50. data/ext/sdl/sge/sge_rotation.h +46 -0
  51. data/ext/sdl/sge/sge_shape.cpp +762 -0
  52. data/ext/sdl/sge/sge_shape.h +365 -0
  53. data/ext/sdl/sge/sge_surface.cpp +1090 -0
  54. data/ext/sdl/sge/sge_surface.h +100 -0
  55. data/ext/sdl/sge/sge_textpp.cpp +785 -0
  56. data/ext/sdl/sge/sge_textpp.h +270 -0
  57. data/ext/sdl/sge/sge_tt_text.cpp +1456 -0
  58. data/ext/sdl/sge/sge_tt_text.h +114 -0
  59. data/graphics_setup.sh +26 -0
  60. data/lib/graphics.rb +1 -1
  61. data/lib/graphics/body.rb +50 -3
  62. data/lib/graphics/extensions.rb +13 -7
  63. data/lib/graphics/simulation.rb +126 -46
  64. data/test/test_graphics.rb +52 -12
  65. data/test/test_sdl.rb +1 -0
  66. metadata +54 -23
  67. metadata.gz.sig +0 -0
  68. data/.gemtest +0 -0
  69. data/examples/lito.rb +0 -108
  70. data/examples/zenspider1.rb +0 -93
  71. data/examples/zenspider2.rb +0 -123
  72. data/examples/zenspider3.rb +0 -104
  73. data/rubysdl_setup.sh +0 -34
@@ -0,0 +1,114 @@
1
+ /*
2
+ * SDL Graphics Extension
3
+ * Text/TrueType functions (header)
4
+ *
5
+ * Started 990815
6
+ *
7
+ * License: LGPL v2+ (see the file LICENSE)
8
+ * (c)1999-2003 Anders Lindstr�m
9
+ *
10
+ * Uses the excellent FreeType 2 library, available at:
11
+ * http://www.freetype.org/
12
+ */
13
+
14
+ /*********************************************************************
15
+ * This library is free software; you can redistribute it and/or *
16
+ * modify it under the terms of the GNU Library General Public *
17
+ * License as published by the Free Software Foundation; either *
18
+ * version 2 of the License, or (at your option) any later version. *
19
+ *********************************************************************/
20
+
21
+ #ifndef sge_tt_text_H
22
+ #define sge_tt_text_H
23
+
24
+ #include "SDL.h"
25
+ #include "sge_internal.h"
26
+
27
+ /* Text input flags */
28
+ #define SGE_IBG SGE_FLAG1
29
+ #define SGE_IDEL SGE_FLAG2
30
+ #define SGE_INOKR SGE_FLAG3
31
+
32
+ #ifndef _SGE_NOTTF
33
+
34
+ /* the truetype font structure */
35
+ typedef struct _sge_TTFont sge_TTFont;
36
+
37
+ /* Font style */
38
+ #define SGE_TTF_NORMAL SGE_FLAG0
39
+ #define SGE_TTF_BOLD SGE_FLAG1
40
+ #define SGE_TTF_ITALIC SGE_FLAG2
41
+ #define SGE_TTF_UNDERLINE SGE_FLAG3
42
+
43
+ /* ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) */
44
+ #define UNICODE_BOM_NATIVE 0xFEFF
45
+ #define UNICODE_BOM_SWAPPED 0xFFFE
46
+
47
+ #endif /* _SGE_NOTTF */
48
+
49
+
50
+
51
+ #ifdef _SGE_C
52
+ extern "C" {
53
+ #endif
54
+ #ifndef _SGE_NOTTF
55
+ DECLSPEC void sge_TTF_AAOff(void);
56
+ DECLSPEC void sge_TTF_AAOn(void);
57
+ DECLSPEC void sge_TTF_AA_Alpha(void);
58
+ DECLSPEC void sge_TTF_ByteSwappedUNICODE(int swapped);
59
+
60
+ DECLSPEC int sge_TTF_Init(void);
61
+ DECLSPEC sge_TTFont *sge_TTF_OpenFont(const char *file, int ptsize);
62
+ DECLSPEC sge_TTFont *sge_TTF_OpenFontRW( SDL_RWops *src, int freesrc, int ptsize, int xdpi, int ydpi);
63
+ DECLSPEC sge_TTFont *sge_TTF_OpenFontIndex(const char *file, int ptsize, long index, int xdpi, int ydpi);
64
+ DECLSPEC sge_TTFont *sge_TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index, int xdpi, int ydpi);
65
+ DECLSPEC int sge_TTF_SetFontSize(sge_TTFont *font, int ptsize);
66
+ DECLSPEC int sge_TTF_SetFontSizeDPI(sge_TTFont *font, int ptsize, int xdpi, int ydpi);
67
+
68
+ DECLSPEC int sge_TTF_FontHeight(sge_TTFont *font);
69
+ DECLSPEC int sge_TTF_FontAscent(sge_TTFont *font);
70
+ DECLSPEC int sge_TTF_FontDescent(sge_TTFont *font);
71
+ DECLSPEC int sge_TTF_FontLineSkip(sge_TTFont *font);
72
+ DECLSPEC long sge_TTF_FontFaces(sge_TTFont *font);
73
+ DECLSPEC int sge_TTF_FontFaceIsFixedWidth(sge_TTFont *font);
74
+ DECLSPEC char *sge_TTF_FontFaceFamilyName(sge_TTFont *font);
75
+ DECLSPEC char *sge_TTF_FontFaceStyleName(sge_TTFont *font);
76
+
77
+ DECLSPEC void sge_TTF_SetFontStyle(sge_TTFont *font, Uint8 style);
78
+ DECLSPEC Uint8 sge_TTF_GetFontStyle(sge_TTFont *font);
79
+
80
+ DECLSPEC void sge_TTF_CloseFont(sge_TTFont *font);
81
+
82
+ DECLSPEC SDL_Rect sge_TTF_TextSizeUNI(sge_TTFont *font, const Uint16 *text);
83
+ DECLSPEC SDL_Rect sge_TTF_TextSize(sge_TTFont *Font, char *Text);
84
+
85
+ DECLSPEC SDL_Rect sge_tt_textout(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
86
+ DECLSPEC SDL_Rect sge_tt_textout_UTF8(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
87
+ DECLSPEC SDL_Rect sge_tt_textout_UNI(SDL_Surface *Surface, sge_TTFont *font, const Uint16 *uni, Sint16 x, Sint16 y, Uint32 fcolor, Uint32 bcolor, int Alpha);
88
+
89
+ DECLSPEC SDL_Rect sge_tt_textoutf(SDL_Surface *Surface, sge_TTFont *font, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha ,char *format,...);
90
+
91
+ DECLSPEC int sge_tt_input_UNI(SDL_Surface *screen,sge_TTFont *font,Uint16 *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint32 fcol, Uint32 bcol, int Alpha);
92
+ DECLSPEC int sge_tt_input(SDL_Surface *screen,sge_TTFont *font,char *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint32 fcol, Uint32 bcol, int Alpha);
93
+
94
+ DECLSPEC SDL_Surface *sge_TTF_Render(sge_TTFont *font,const Uint16 *text, SDL_Color fg, SDL_Color bg, int alpha_level);
95
+ DECLSPEC SDL_Surface *sge_TTF_RenderUNICODE(sge_TTFont *font,const Uint16 *text, SDL_Color fg, SDL_Color bg);
96
+ #endif /* _SGE_NOTTF */
97
+
98
+ DECLSPEC Uint16 *sge_Latin1_Uni(const char *text);
99
+ #ifdef _SGE_C
100
+ }
101
+ #endif
102
+
103
+
104
+ #ifndef sge_C_ONLY
105
+ #ifndef _SGE_NOTTF
106
+ DECLSPEC SDL_Rect sge_tt_textout(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
107
+ DECLSPEC SDL_Rect sge_tt_textout_UTF8(SDL_Surface *Surface, sge_TTFont *font, const char *string, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
108
+ DECLSPEC SDL_Rect sge_tt_textout_UNI(SDL_Surface *Surface, sge_TTFont *font, const Uint16 *uni, Sint16 x, Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR, Uint8 bG, Uint8 bB, int Alpha);
109
+ DECLSPEC int sge_tt_input_UNI(SDL_Surface *screen,sge_TTFont *font,Uint16 *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR,Uint8 bG,Uint8 bB, int Alpha);
110
+ DECLSPEC int sge_tt_input(SDL_Surface *screen,sge_TTFont *font,char *string,Uint8 flags, int pos,int len,Sint16 x,Sint16 y, Uint8 fR, Uint8 fG, Uint8 fB, Uint8 bR,Uint8 bG,Uint8 bB, int Alpha);
111
+ #endif /* _SGE_NOTTF */
112
+ #endif /* sge_C_ONLY */
113
+
114
+ #endif /* sge_tt_text_H */
@@ -0,0 +1,26 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ for pkg in sdl sdl_image sdl_ttf sdl_mixer sdl_gfx smpeg freetype libogg libvorbis libsmpeg libpng libtiff; do
5
+ brew uninstall $pkg || true
6
+ done
7
+
8
+ for gem in graphics rubysdl rsdl; do
9
+ gem uninstall -ax $gem || true
10
+ done
11
+
12
+ # brew update
13
+
14
+ brew install sdl
15
+ brew install sdl_mixer --with-smpeg
16
+ brew install sdl_ttf
17
+ brew install sdl_image
18
+
19
+ if [ -f $0 ]; then
20
+ rake clean package
21
+ gem install pkg/graphics*.gem
22
+ else
23
+ gem install graphics --pre
24
+ fi
25
+
26
+ rsdl -rgraphics -e 'Class.new(Graphics::Simulation) { def draw n; clear :white; text "hit escape to quit", 100, 100, :black; end; }.new(500, 250, 0, "Working!").run'
@@ -2,7 +2,7 @@
2
2
  # The top-level namespace.
3
3
 
4
4
  class Graphics
5
- VERSION = "1.0.0b1" # :nodoc:
5
+ VERSION = "1.0.0b4" # :nodoc:
6
6
  end
7
7
 
8
8
  require "graphics/simulation"
@@ -27,7 +27,35 @@ class Graphics::Body
27
27
  :west => 0,
28
28
  }
29
29
 
30
- attr_accessor :x, :y, :a, :ga, :m, :w # :nodoc:
30
+ ##
31
+ # Body's x coordinate.
32
+
33
+ attr_accessor :x
34
+
35
+ ##
36
+ # Body's y coordinate.
37
+
38
+ attr_accessor :y
39
+
40
+ ##
41
+ # Body's angle, in degrees.
42
+
43
+ attr_accessor :a
44
+
45
+ ##
46
+ # Body's goal angle, in degrees.
47
+
48
+ attr_accessor :ga
49
+
50
+ ##
51
+ # Body's magnitude.
52
+
53
+ attr_accessor :m
54
+
55
+ ##
56
+ # Body's window.
57
+
58
+ attr_accessor :w
31
59
 
32
60
  ##
33
61
  # Create a new body in windowing system +w+ with a random x/y and
@@ -92,6 +120,25 @@ class Graphics::Body
92
120
  [dx, dy]
93
121
  end
94
122
 
123
+ ##
124
+ # Return the angle to another body in degrees.
125
+
126
+ def angle_to body
127
+ dx = body.x - self.x
128
+ dy = body.y - self.y
129
+
130
+ (R2D * Math.atan2(dy, dx)).degrees
131
+ end
132
+
133
+ ##
134
+ # Return the distance to another body, squared.
135
+
136
+ def distance_to_squared p
137
+ dx = p.x - x
138
+ dy = p.y - y
139
+ dx * dx + dy * dy
140
+ end
141
+
95
142
  def m_a # :nodoc:
96
143
  [m, a]
97
144
  end
@@ -139,10 +186,10 @@ class Graphics::Body
139
186
 
140
187
  if y < 0 then
141
188
  self.y = 0
142
- return :north
189
+ return :south
143
190
  elsif y > max_h then
144
191
  self.y = max_h
145
- return :south
192
+ return :north
146
193
  end
147
194
 
148
195
  nil
@@ -1,3 +1,6 @@
1
+ ##
2
+ # Integer extensions for graphics
3
+
1
4
  class Integer
2
5
  ##
3
6
  # Calculate a random chance using easy notation: 1 =~ 50 :: 1 in 50 chance
@@ -7,6 +10,9 @@ class Integer
7
10
  end
8
11
  end
9
12
 
13
+ ##
14
+ # Numeric extensions for graphics
15
+
10
16
  class Numeric
11
17
  ##
12
18
  # Is M close to N within a certain delta?
@@ -30,16 +36,16 @@ class Numeric
30
36
  # Consider this method private, even tho it is in use by the demos.
31
37
 
32
38
  def relative_angle n, max
33
- deltaCW = (self - n).degrees
34
- deltaCC = (n - self).degrees
39
+ delta_cw = (self - n).degrees
40
+ delta_cc = (n - self).degrees
35
41
 
36
- return if deltaCC < 0.1 || deltaCW < 0.1
42
+ return if delta_cc < 0.1 || delta_cw < 0.1
37
43
 
38
- if deltaCC.abs < max then
39
- deltaCC
40
- elsif deltaCW.close_to? 180 then
44
+ if delta_cc.abs < max then
45
+ delta_cc
46
+ elsif delta_cw.close_to? 180 then
41
47
  [-max, max].sample
42
- elsif deltaCW < deltaCC then
48
+ elsif delta_cw < delta_cc then
43
49
  -max
44
50
  else
45
51
  max
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- require "sdl"
3
+ require "sdl/sdl"
4
4
 
5
5
  module SDL; end # :nodoc: -- stupid rdoc :(
6
6
 
@@ -38,6 +38,12 @@ class Graphics::Simulation
38
38
  # A hash of color values to their rgb values. For text, apparently. *shrug*
39
39
  attr_accessor :rgb
40
40
 
41
+ # Number of update iterations per drawing tick.
42
+ attr_accessor :iter_per_tick
43
+
44
+ # Procs registered to handle key events.
45
+ attr_accessor :key_handler
46
+
41
47
  ##
42
48
  # Create a new simulation of a certain width and height. Optionally,
43
49
  # you can set the bits per pixel (0 for current screen settings),
@@ -47,11 +53,10 @@ class Graphics::Simulation
47
53
 
48
54
  def initialize w, h, bpp = 0, name = self.class.name, full = false
49
55
  SDL.init SDL::INIT_VIDEO
50
- SDL::TTF.init
51
56
 
52
57
  full = full ? SDL::FULLSCREEN : 0
53
58
 
54
- self.font = SDL::TTF.open("/System/Library/Fonts/Menlo.ttc", 32, 0)
59
+ self.font = find_font("Menlo", 32)
55
60
 
56
61
  SDL::WM.set_caption name, name
57
62
 
@@ -59,8 +64,29 @@ class Graphics::Simulation
59
64
  self.w, self.h = screen.w, screen.h
60
65
 
61
66
  self.color = {}
62
- self.rgb = Hash.new { |hash, k| hash[k] = screen.get_rgb(color[k]) }
67
+ self.rgb = Hash.new { |hash, k| hash[k] = screen.format.get_rgb(color[k]) }
68
+ self.paused = false
63
69
 
70
+ self.iter_per_tick = 1
71
+
72
+ self.key_handler = []
73
+
74
+ initialize_keys
75
+ initialize_colors
76
+ end
77
+
78
+ ##
79
+ # Register default key events. Handles ESC & Q (quit) and P (pause).
80
+
81
+ def initialize_keys
82
+ add_key_handler(:ESCAPE) { exit }
83
+ add_key_handler(:Q) { exit }
84
+ add_key_handler(:P) { self.paused = !paused }
85
+ add_key_handler(:SLASH) { self.iter_per_tick += 1 }
86
+ add_key_handler(:MINUS) { self.iter_per_tick -= 1; self.iter_per_tick = 1 if iter_per_tick < 1 }
87
+ end
88
+
89
+ def initialize_colors # :nodoc:
64
90
  register_color :black, 0, 0, 0
65
91
  register_color :white, 255, 255, 255
66
92
  register_color :red, 255, 0, 0
@@ -72,13 +98,27 @@ class Graphics::Simulation
72
98
 
73
99
  (0..99).each do |n|
74
100
  m = (255 * (n / 100.0)).to_i
75
- register_color ("gray%02d" % n).to_sym, m, m, m
76
- register_color ("red%02d" % n).to_sym, m, 0, 0
77
- register_color ("green%02d" % n).to_sym, 0, m, 0
78
- register_color ("blue%02d" % n).to_sym, 0, 0, m
101
+ register_color(("gray%02d" % n).to_sym, m, m, m)
102
+ register_color(("red%02d" % n).to_sym, m, 0, 0)
103
+ register_color(("green%02d" % n).to_sym, 0, m, 0)
104
+ register_color(("blue%02d" % n).to_sym, 0, 0, m)
79
105
  end
106
+ end
80
107
 
81
- self.paused = false
108
+ sys_font = "/System/Library/Fonts"
109
+ lib_font = "/Library/Fonts"
110
+ user_font = File.expand_path "~/Library/Fonts/"
111
+ FONT_GLOB = "{#{sys_font},#{lib_font},#{user_font}}" # :nodoc:
112
+
113
+ ##
114
+ # Find and open a (TTF) font. Should be as system agnostic as possible.
115
+
116
+ def find_font name, size = 16
117
+ font = Dir["#{FONT_GLOB}/#{name}.{ttc,ttf}"].first
118
+
119
+ raise ArgumentError, "Can't find font named '#{name}'" unless font
120
+
121
+ SDL::TTF.open(font, size)
82
122
  end
83
123
 
84
124
  ##
@@ -97,7 +137,8 @@ class Graphics::Simulation
97
137
  n.times.map {
98
138
  o = klass.new self
99
139
  yield o if block_given?
100
- o }
140
+ o
141
+ }
101
142
  end
102
143
 
103
144
  ##
@@ -110,15 +151,22 @@ class Graphics::Simulation
110
151
  end
111
152
 
112
153
  ##
113
- # Handle key events. By default handles ESC & Q (quit) and P
114
- # (pause). Override this if you want to handle more key events. Be
115
- # sure to call super or provide your own means of quitting and/or
116
- # pausing.
154
+ # Register a block to run for a particular key-press.
155
+
156
+ def add_key_handler k, remove = nil, &b
157
+ k = SDL::Key.const_get k
158
+ key_handler.delete_if { |a, _| k==a } if remove
159
+ key_handler.unshift [k, b]
160
+ end
161
+
162
+ ##
163
+ # Handle key events by looking through key_handler and running any
164
+ # blocks that match the key(s) being pressed.
117
165
 
118
166
  def handle_keys
119
- exit if SDL::Key.press? SDL::Key::ESCAPE
120
- exit if SDL::Key.press? SDL::Key::Q
121
- self.paused = !paused if SDL::Key.press? SDL::Key::P
167
+ key_handler.each do |k, blk|
168
+ blk[self] if SDL::Key.press? k
169
+ end
122
170
  end
123
171
 
124
172
  ##
@@ -131,18 +179,16 @@ class Graphics::Simulation
131
179
  self.start_time = Time.now
132
180
  n = 0
133
181
  event = nil
182
+
134
183
  loop do
135
184
  handle_event event, n while event = SDL::Event.poll
136
185
  SDL::Key.scan
137
186
  handle_keys
138
187
 
139
- unless paused then
140
- update n unless paused
141
-
142
- draw_and_flip n
188
+ next if paused
143
189
 
144
- n += 1 unless paused
145
- end
190
+ iter_per_tick.times { update n; n += 1 }
191
+ draw_and_flip n
146
192
  end
147
193
  end
148
194
 
@@ -179,7 +225,7 @@ class Graphics::Simulation
179
225
 
180
226
  def line x1, y1, x2, y2, c
181
227
  h = self.h
182
- screen.draw_line x1, h-y1, x2, h-y2, color[c], :antialiased
228
+ screen.draw_line x1, h-y1-1, x2, h-y2-1, color[c]
183
229
  end
184
230
 
185
231
  ##
@@ -203,7 +249,7 @@ class Graphics::Simulation
203
249
  def polygon *points, color
204
250
  points << points.first
205
251
  points.each_cons(2) do |p1, p2|
206
- w.line(*p1, *p2, color)
252
+ line(*p1, *p2, color)
207
253
  end
208
254
  end
209
255
 
@@ -219,14 +265,14 @@ class Graphics::Simulation
219
265
  # Draw a rect at x/y with w by h dimensions in color c. Ignores blending.
220
266
 
221
267
  def fast_rect x, y, w, h, c
222
- screen.fill_rect x, self.h-y-h, w, h, color[c]
268
+ screen.fast_rect x, self.h-y-h, w, h, color[c]
223
269
  end
224
270
 
225
271
  ##
226
272
  # Draw a point at x/y w/ color c.
227
273
 
228
274
  def point x, y, c
229
- screen[x, h-y] = color[c]
275
+ screen[x, h-y-1] = color[c]
230
276
  end
231
277
 
232
278
  ##
@@ -242,21 +288,36 @@ class Graphics::Simulation
242
288
  # Draw a rect at x/y with w by h dimensions in color c.
243
289
 
244
290
  def rect x, y, w, h, c, fill = false
245
- screen.draw_rect x, self.h-y-h, w, h, color[c], fill
291
+ y = self.h-y-h-1
292
+ if fill then
293
+ screen.fill_rect x, y, w, h, color[c]
294
+ else
295
+ screen.draw_rect x, y, w, h, color[c]
296
+ end
246
297
  end
247
298
 
248
299
  ##
249
300
  # Draw a circle at x/y with radius r in color c.
250
301
 
251
302
  def circle x, y, r, c, fill = false
252
- screen.draw_circle x, h-y, r, color[c], fill, :antialiased
303
+ y = h-y-1
304
+ if fill then
305
+ screen.fill_circle x, y, r, color[c]
306
+ else
307
+ screen.draw_circle x, y, r, color[c]
308
+ end
253
309
  end
254
310
 
255
311
  ##
256
312
  # Draw a circle at x/y with radiuses w/h in color c.
257
313
 
258
314
  def ellipse x, y, w, h, c, fill = false
259
- screen.draw_ellipse x, self.h-y, w, h, color[c], fill, :antialiased
315
+ y = self.h-y-1
316
+ if fill then
317
+ screen.fill_ellipse x, y, w, h, color[c]
318
+ else
319
+ screen.draw_ellipse x, y, w, h, color[c]
320
+ end
260
321
  end
261
322
 
262
323
  ##
@@ -265,7 +326,7 @@ class Graphics::Simulation
265
326
 
266
327
  def bezier x1, y1, cx1, cy1, cx2, cy2, x2, y2, c, l = 7
267
328
  h = self.h
268
- screen.draw_bezier x1, h-y1, cx1, h-cy1, cx2, h-cy2, x2, h-y2, l, color[c], :antialiased
329
+ screen.draw_bezier x1, h-y1-1, cx1, h-cy1, cx2, h-cy2, x2, h-y2-1, l, color[c]
269
330
  end
270
331
 
271
332
  ## Text
@@ -281,14 +342,15 @@ class Graphics::Simulation
281
342
  # Return the rendered text s in color c in font f.
282
343
 
283
344
  def render_text s, c, f = font
284
- f.render_solid_utf8 s, *rgb[c]
345
+ f.render screen, s, color[c]
285
346
  end
286
347
 
287
348
  ##
288
349
  # Draw text s at x/y in color c in font f.
289
350
 
290
351
  def text s, x, y, c, f = font
291
- f.draw_solid_utf8 screen, s, x, self.h-y-f.height, *rgb[c]
352
+ y = self.h-y-f.height-1
353
+ f.draw screen, s, x, y, color[c]
292
354
  end
293
355
 
294
356
  ##
@@ -313,15 +375,7 @@ class Graphics::Simulation
313
375
 
314
376
  ### Blitting Methods:
315
377
 
316
- ## utilities for later
317
-
318
- # put_pixel(x, y, color)
319
- # []=(x, y, color)
320
- # get_pixel(x, y)
321
- # [](x, y)
322
- # put(src, x, y) # see blit
323
- # copy_rect(x,y,w,h)
324
- # transform_surface(bgcolor,angle,xscale,yscale,flags)
378
+ # TODO: copy_rect(x,y,w,h)
325
379
 
326
380
  ##
327
381
  # Load an image at path into a new surface.
@@ -330,6 +384,20 @@ class Graphics::Simulation
330
384
  SDL::Surface.load path
331
385
  end
332
386
 
387
+ ##
388
+ # Load an audio file at path
389
+
390
+ def audio path
391
+ SDL::Audio.load path
392
+ end
393
+
394
+ ##
395
+ # Open the audio mixer with a number of +channels+ open.
396
+
397
+ def open_mixer channels = 1
398
+ SDL::Audio.open channels
399
+ end
400
+
333
401
  ##
334
402
  # Return the current mouse state: x, y, buttons.
335
403
 
@@ -340,10 +408,22 @@ class Graphics::Simulation
340
408
  end
341
409
 
342
410
  ##
343
- # Draw a bitmap at x/y with an angle and optional x/y scale.
411
+ # Draw a bitmap centered at x/y with optional angle, x/y scale, and flags.
412
+
413
+ def blit src, x, y, a° = 0, xscale = 1, yscale = 1, flags = 0
414
+ img = src.transform src.format.colorkey, -a°, xscale, yscale, flags
415
+
416
+ SDL::Surface.blit img, 0, 0, 0, 0, screen, x-img.w/2, h-y-img.h/2
417
+ end
418
+
419
+ ##
420
+ # Draw a bitmap at x/y with optional angle, x/y scale, and flags.
421
+
422
+ def put src, x, y, a° = 0, xscale = 1, yscale = 1, flags = 0
423
+ img = src.transform src.format.colorkey, -a°, xscale, yscale, flags
344
424
 
345
- def blit o, x, y, a°, xs=1, ys=1, opt=0
346
- SDL::Surface.transform_blit o, screen, -a°, 1, 1, o.w/2, o.h/2, x, h-y, opt
425
+ # why x-1? because transform adds a pixel to all sides even if a°==0
426
+ SDL::Surface.blit img, 0, 0, 0, 0, screen, x-1, h-y-img.h
347
427
  end
348
428
 
349
429
  ##
@@ -352,7 +432,7 @@ class Graphics::Simulation
352
432
  # primitives will work and the resulting surface is returned.
353
433
 
354
434
  def sprite w, h
355
- new_screen = SDL::Surface.new SDL::SWSURFACE, w, h, screen
435
+ new_screen = SDL::Surface.new w, h, screen.format
356
436
  old_screen = screen
357
437
  old_w, old_h = self.w, self.h
358
438
  self.w, self.h = w, h