rubygame 2.3.0-x86-mswin32-60

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 (99) hide show
  1. data/CREDITS +60 -0
  2. data/LICENSE +504 -0
  3. data/NEWS +252 -0
  4. data/README +123 -0
  5. data/ROADMAP +109 -0
  6. data/Rakefile +440 -0
  7. data/doc/extended_readme.rdoc +49 -0
  8. data/doc/getting_started.rdoc +47 -0
  9. data/doc/macosx_install.rdoc +70 -0
  10. data/doc/windows_install.rdoc +123 -0
  11. data/ext/rubygame/rubygame_core.so +0 -0
  12. data/ext/rubygame/rubygame_event.c +644 -0
  13. data/ext/rubygame/rubygame_event.h +48 -0
  14. data/ext/rubygame/rubygame_event.obj +0 -0
  15. data/ext/rubygame/rubygame_gfx.c +942 -0
  16. data/ext/rubygame/rubygame_gfx.h +101 -0
  17. data/ext/rubygame/rubygame_gfx.obj +0 -0
  18. data/ext/rubygame/rubygame_gfx.so +0 -0
  19. data/ext/rubygame/rubygame_gl.c +154 -0
  20. data/ext/rubygame/rubygame_gl.h +32 -0
  21. data/ext/rubygame/rubygame_gl.obj +0 -0
  22. data/ext/rubygame/rubygame_image.c +252 -0
  23. data/ext/rubygame/rubygame_image.h +41 -0
  24. data/ext/rubygame/rubygame_image.obj +0 -0
  25. data/ext/rubygame/rubygame_image.so +0 -0
  26. data/ext/rubygame/rubygame_joystick.c +247 -0
  27. data/ext/rubygame/rubygame_joystick.h +41 -0
  28. data/ext/rubygame/rubygame_joystick.obj +0 -0
  29. data/ext/rubygame/rubygame_main.c +155 -0
  30. data/ext/rubygame/rubygame_main.h +36 -0
  31. data/ext/rubygame/rubygame_main.obj +0 -0
  32. data/ext/rubygame/rubygame_mixer.c +1024 -0
  33. data/ext/rubygame/rubygame_mixer.h +36 -0
  34. data/ext/rubygame/rubygame_mixer.obj +0 -0
  35. data/ext/rubygame/rubygame_mixer.so +0 -0
  36. data/ext/rubygame/rubygame_music.c +1017 -0
  37. data/ext/rubygame/rubygame_music.h +29 -0
  38. data/ext/rubygame/rubygame_music.obj +0 -0
  39. data/ext/rubygame/rubygame_screen.c +448 -0
  40. data/ext/rubygame/rubygame_screen.h +43 -0
  41. data/ext/rubygame/rubygame_screen.obj +0 -0
  42. data/ext/rubygame/rubygame_shared.c +272 -0
  43. data/ext/rubygame/rubygame_shared.h +68 -0
  44. data/ext/rubygame/rubygame_shared.obj +0 -0
  45. data/ext/rubygame/rubygame_sound.c +863 -0
  46. data/ext/rubygame/rubygame_sound.h +29 -0
  47. data/ext/rubygame/rubygame_sound.obj +0 -0
  48. data/ext/rubygame/rubygame_surface.c +1151 -0
  49. data/ext/rubygame/rubygame_surface.h +62 -0
  50. data/ext/rubygame/rubygame_surface.obj +0 -0
  51. data/ext/rubygame/rubygame_time.c +183 -0
  52. data/ext/rubygame/rubygame_time.h +32 -0
  53. data/ext/rubygame/rubygame_time.obj +0 -0
  54. data/ext/rubygame/rubygame_ttf.c +599 -0
  55. data/ext/rubygame/rubygame_ttf.h +69 -0
  56. data/ext/rubygame/rubygame_ttf.obj +0 -0
  57. data/ext/rubygame/rubygame_ttf.so +0 -0
  58. data/lib/rubygame.rb +41 -0
  59. data/lib/rubygame/clock.rb +128 -0
  60. data/lib/rubygame/color.rb +79 -0
  61. data/lib/rubygame/color/models/base.rb +111 -0
  62. data/lib/rubygame/color/models/hsl.rb +153 -0
  63. data/lib/rubygame/color/models/hsv.rb +149 -0
  64. data/lib/rubygame/color/models/rgb.rb +78 -0
  65. data/lib/rubygame/color/palettes/css.rb +49 -0
  66. data/lib/rubygame/color/palettes/palette.rb +100 -0
  67. data/lib/rubygame/color/palettes/x11.rb +177 -0
  68. data/lib/rubygame/constants.rb +238 -0
  69. data/lib/rubygame/event.rb +313 -0
  70. data/lib/rubygame/ftor.rb +370 -0
  71. data/lib/rubygame/hotspot.rb +265 -0
  72. data/lib/rubygame/keyconstants.rb +237 -0
  73. data/lib/rubygame/mediabag.rb +94 -0
  74. data/lib/rubygame/named_resource.rb +254 -0
  75. data/lib/rubygame/queue.rb +288 -0
  76. data/lib/rubygame/rect.rb +612 -0
  77. data/lib/rubygame/sfont.rb +223 -0
  78. data/lib/rubygame/sprite.rb +511 -0
  79. data/samples/FreeSans.ttf +0 -0
  80. data/samples/GPL.txt +340 -0
  81. data/samples/README +40 -0
  82. data/samples/chimp.bmp +0 -0
  83. data/samples/chimp.rb +302 -0
  84. data/samples/demo_gl.rb +151 -0
  85. data/samples/demo_gl_tex.rb +197 -0
  86. data/samples/demo_music.rb +77 -0
  87. data/samples/demo_rubygame.rb +296 -0
  88. data/samples/demo_sfont.rb +52 -0
  89. data/samples/demo_ttf.rb +193 -0
  90. data/samples/demo_utf8.rb +53 -0
  91. data/samples/fist.bmp +0 -0
  92. data/samples/load_and_blit.rb +22 -0
  93. data/samples/panda.png +0 -0
  94. data/samples/punch.wav +0 -0
  95. data/samples/ruby.png +0 -0
  96. data/samples/song.ogg +0 -0
  97. data/samples/term16.png +0 -0
  98. data/samples/whiff.wav +0 -0
  99. metadata +164 -0
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This demonstrates the use of ruby-opengl alongside rubygame to produce
4
+ # hardware-accelerated three-dimensional graphics.
5
+ #
6
+ # Please note that rubygame itself does not perform any OpenGL functions,
7
+ # it only allows ruby-opengl to use the Screen as its viewport. You MUST
8
+ # have ruby-opengl installed to run this demo!
9
+
10
+ require 'rubygame'
11
+
12
+ begin
13
+ require 'opengl'
14
+ rescue LoadError
15
+ puts "ATTENTION: This demo requires the opengl extension for ruby."
16
+ raise
17
+ end
18
+
19
+ WIDE = 640
20
+ HIGH = 480
21
+
22
+ Rubygame.init
23
+
24
+ Rubygame::GL.set_attrib(Rubygame::GL::RED_SIZE, 5)
25
+ Rubygame::GL.set_attrib(Rubygame::GL::GREEN_SIZE, 5)
26
+ Rubygame::GL.set_attrib(Rubygame::GL::BLUE_SIZE, 5)
27
+ Rubygame::GL.set_attrib(Rubygame::GL::DEPTH_SIZE, 16)
28
+ Rubygame::GL.set_attrib(Rubygame::GL::DOUBLEBUFFER, 1)
29
+
30
+ Rubygame::Screen.set_mode([WIDE,HIGH], 16, [Rubygame::OPENGL])
31
+ queue = Rubygame::EventQueue.new()
32
+ clock = Rubygame::Clock.new { |c| c.target_framerate = 60 }
33
+
34
+ ObjectSpace.garbage_collect
35
+ GL::Viewport( 0, 0, WIDE, HIGH )
36
+
37
+ GL::MatrixMode( GL::PROJECTION )
38
+ GL::LoadIdentity( )
39
+ GLU::Perspective( 35, WIDE/(HIGH.to_f), 3, 10)
40
+
41
+ GL::MatrixMode( GL::MODELVIEW )
42
+ GL::LoadIdentity( )
43
+
44
+ GL::Enable(GL::DEPTH_TEST)
45
+ GL::DepthFunc(GL::LESS)
46
+
47
+ GL::ShadeModel(GL::FLAT)
48
+
49
+ color =
50
+ [[ 1.0, 1.0, 0.0],
51
+ [ 1.0, 0.0, 0.0],
52
+ [ 0.0, 0.0, 0.0],
53
+ [ 0.0, 1.0, 0.0],
54
+ [ 0.0, 1.0, 1.0],
55
+ [ 1.0, 1.0, 1.0],
56
+ [ 1.0, 0.0, 1.0],
57
+ [ 0.0, 0.0, 1.0]]
58
+
59
+ cube =
60
+ [[ 0.5, 0.5, -0.5],
61
+ [ 0.5, -0.5, -0.5],
62
+ [-0.5, -0.5, -0.5],
63
+ [-0.5, 0.5, -0.5],
64
+ [-0.5, 0.5, 0.5],
65
+ [ 0.5, 0.5, 0.5],
66
+ [ 0.5, -0.5, 0.5],
67
+ [-0.5, -0.5, 0.5]]
68
+
69
+ cube_list = 1
70
+
71
+ GL::NewList(cube_list,GL::COMPILE_AND_EXECUTE)
72
+ GL::PushMatrix()
73
+ GL::Begin(GL::QUADS)
74
+ GL::Color(1.0, 0.0, 0.0);
75
+ GL::Vertex(cube[0]);
76
+ GL::Vertex(cube[1]);
77
+ GL::Vertex(cube[2]);
78
+ GL::Vertex(cube[3]);
79
+
80
+ GL::Color(0.0, 1.0, 0.0);
81
+ GL::Vertex(cube[3]);
82
+ GL::Vertex(cube[4]);
83
+ GL::Vertex(cube[7]);
84
+ GL::Vertex(cube[2]);
85
+
86
+ GL::Color(0.0, 0.0, 1.0);
87
+ GL::Vertex(cube[0]);
88
+ GL::Vertex(cube[5]);
89
+ GL::Vertex(cube[6]);
90
+ GL::Vertex(cube[1]);
91
+
92
+ GL::Color(0.0, 1.0, 1.0);
93
+ GL::Vertex(cube[5]);
94
+ GL::Vertex(cube[4]);
95
+ GL::Vertex(cube[7]);
96
+ GL::Vertex(cube[6]);
97
+
98
+ GL::Color(1.0, 1.0, 0.0);
99
+ GL::Vertex(cube[5]);
100
+ GL::Vertex(cube[0]);
101
+ GL::Vertex(cube[3]);
102
+ GL::Vertex(cube[4]);
103
+
104
+ GL::Color(1.0, 0.0, 1.0);
105
+ GL::Vertex(cube[6]);
106
+ GL::Vertex(cube[1]);
107
+ GL::Vertex(cube[2]);
108
+ GL::Vertex(cube[7]);
109
+ GL::PopMatrix()
110
+ GL::End()
111
+ GL::EndList()
112
+
113
+ angle = 0
114
+
115
+ catch(:rubygame_quit) do
116
+ loop do
117
+ queue.each do |event|
118
+ case event
119
+ when Rubygame::KeyDownEvent
120
+ case event.key
121
+ when Rubygame::K_ESCAPE
122
+ throw :rubygame_quit
123
+ when Rubygame::K_Q
124
+ throw :rubygame_quit
125
+ end
126
+ when Rubygame::QuitEvent
127
+ throw :rubygame_quit
128
+ end
129
+ end
130
+
131
+ GL.ClearColor(0.0, 0.0, 0.0, 1.0);
132
+ GL.Clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT);
133
+
134
+ GL::MatrixMode(GL::MODELVIEW);
135
+ GL::LoadIdentity( )
136
+ GL::Translate(0, 0, -4)
137
+ GL::Rotate(45, 0, 1, 0)
138
+ GL::Rotate(45, 1, 0, 0)
139
+ GL::Rotate(angle, 0.0, 0.0, 1.0)
140
+ GL::Rotate(angle*2, 0.0, 1.0, 0.0)
141
+
142
+ GL::CallList(cube_list)
143
+
144
+ Rubygame::GL.swap_buffers()
145
+ ObjectSpace.garbage_collect
146
+
147
+ angle += clock.tick()/50.0
148
+ angle -= 360 if angle >= 360
149
+
150
+ end
151
+ end
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This demonstrates the use of ruby-opengl alongside rubygame to produce
4
+ # hardware-accelerated three-dimensional graphics. Additionally, it
5
+ # demonstrates the use of rubygame Surfaces as OpenGL textures.
6
+ #
7
+ # Please note that rubygame itself does not perform any OpenGL functions,
8
+ # it only allows ruby-opengl to use the Screen as its viewport. You MUST
9
+ # have ruby-opengl installed to run this demo!
10
+
11
+ require 'rubygame'
12
+
13
+ begin
14
+ require 'opengl'
15
+ rescue LoadError
16
+ puts "ATTENTION: This demo requires the opengl extension for ruby."
17
+ raise
18
+ end
19
+
20
+ WIDE = 640
21
+ HIGH = 480
22
+ SCALE = 500.0
23
+ shadedCube=true
24
+ TEXTURE = "ruby.png"
25
+
26
+ Rubygame.init
27
+
28
+ Rubygame::GL.set_attrib(Rubygame::GL::RED_SIZE, 5)
29
+ Rubygame::GL.set_attrib(Rubygame::GL::GREEN_SIZE, 5)
30
+ Rubygame::GL.set_attrib(Rubygame::GL::BLUE_SIZE, 5)
31
+ Rubygame::GL.set_attrib(Rubygame::GL::DEPTH_SIZE, 16)
32
+ Rubygame::GL.set_attrib(Rubygame::GL::DOUBLEBUFFER, 1)
33
+
34
+ Rubygame::Screen.set_mode([WIDE,HIGH], 16, [Rubygame::OPENGL])
35
+ queue = Rubygame::EventQueue.new()
36
+ clock = Rubygame::Clock.new { |c| c.target_framerate = 60 }
37
+
38
+ ObjectSpace.garbage_collect
39
+ GL::Viewport( 0, 0, WIDE, HIGH )
40
+
41
+ GL::MatrixMode( GL::PROJECTION )
42
+ GL::LoadIdentity( )
43
+ GLU::Perspective( 35, WIDE/(HIGH.to_f), 3, 10)
44
+
45
+ GL::MatrixMode( GL::MODELVIEW )
46
+ GL::LoadIdentity( )
47
+
48
+ GL::Enable(GL::DEPTH_TEST)
49
+ GL::DepthFunc(GL::LESS)
50
+
51
+ GL::ShadeModel(GL::FLAT)
52
+
53
+ surface = Rubygame::Surface.load_image(TEXTURE)
54
+
55
+ tex_id = GL::GenTextures(1)
56
+ GL::BindTexture(GL::TEXTURE_2D, tex_id[0])
57
+ GL::TexImage2D(GL::TEXTURE_2D, 0, GL::RGB, surface.w, surface.h, 0, GL::RGB,
58
+ GL::UNSIGNED_BYTE, surface.pixels)
59
+ GL::TexParameter(GL::TEXTURE_2D,GL::TEXTURE_MIN_FILTER,GL::NEAREST);
60
+ GL::TexParameter(GL::TEXTURE_2D,GL::TEXTURE_MAG_FILTER,GL::LINEAR);
61
+
62
+ color =
63
+ [[ 1.0, 1.0, 0.0],
64
+ [ 1.0, 0.0, 0.0],
65
+ [ 0.0, 0.0, 0.0],
66
+ [ 0.0, 1.0, 0.0],
67
+ [ 0.0, 1.0, 1.0],
68
+ [ 1.0, 1.0, 1.0],
69
+ [ 1.0, 0.0, 1.0],
70
+ [ 0.0, 0.0, 1.0]]
71
+
72
+ cube =
73
+ [[ 0.5, 0.5, -0.5],
74
+ [ 0.5, -0.5, -0.5],
75
+ [-0.5, -0.5, -0.5],
76
+ [-0.5, 0.5, -0.5],
77
+ [-0.5, 0.5, 0.5],
78
+ [ 0.5, 0.5, 0.5],
79
+ [ 0.5, -0.5, 0.5],
80
+ [-0.5, -0.5, 0.5]]
81
+
82
+ cube_st =
83
+ [[[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
84
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
85
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
86
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
87
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
88
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
89
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]],
90
+ [[ 1, 1], [ 1, 0], [ 0, 0], [ 0, 1]]]
91
+
92
+ cube_list = 1
93
+
94
+ GL::NewList(cube_list,GL::COMPILE_AND_EXECUTE)
95
+ GL::PushMatrix()
96
+ GL::Enable(GL::TEXTURE_2D)
97
+ GL::BindTexture(GL::TEXTURE_2D, tex_id[0])
98
+
99
+ GL::Begin(GL::QUADS)
100
+
101
+ GL::TexCoord(cube_st[0][0]);
102
+ GL::Vertex(cube[0]);
103
+ GL::TexCoord(cube_st[0][1]);
104
+ GL::Vertex(cube[1]);
105
+ GL::TexCoord(cube_st[0][2]);
106
+ GL::Vertex(cube[2]);
107
+ GL::TexCoord(cube_st[0][3]);
108
+ GL::Vertex(cube[3]);
109
+
110
+ GL::TexCoord(cube_st[1][0]);
111
+ GL::Vertex(cube[3]);
112
+ GL::TexCoord(cube_st[1][1]);
113
+ GL::Vertex(cube[4]);
114
+ GL::TexCoord(cube_st[1][2]);
115
+ GL::Vertex(cube[7]);
116
+ GL::TexCoord(cube_st[1][3]);
117
+ GL::Vertex(cube[2]);
118
+
119
+ GL::TexCoord(cube_st[2][0]);
120
+ GL::Vertex(cube[0]);
121
+ GL::TexCoord(cube_st[2][1]);
122
+ GL::Vertex(cube[5]);
123
+ GL::TexCoord(cube_st[2][2]);
124
+ GL::Vertex(cube[6]);
125
+ GL::TexCoord(cube_st[2][3]);
126
+ GL::Vertex(cube[1]);
127
+
128
+ GL::TexCoord(cube_st[3][0]);
129
+ GL::Vertex(cube[5]);
130
+ GL::TexCoord(cube_st[3][1]);
131
+ GL::Vertex(cube[4]);
132
+ GL::TexCoord(cube_st[3][2]);
133
+ GL::Vertex(cube[7]);
134
+ GL::TexCoord(cube_st[3][3]);
135
+ GL::Vertex(cube[6]);
136
+
137
+ GL::TexCoord(cube_st[4][0]);
138
+ GL::Vertex(cube[5]);
139
+ GL::TexCoord(cube_st[4][1]);
140
+ GL::Vertex(cube[0]);
141
+ GL::TexCoord(cube_st[4][2]);
142
+ GL::Vertex(cube[3]);
143
+ GL::TexCoord(cube_st[4][3]);
144
+ GL::Vertex(cube[4]);
145
+
146
+ GL::TexCoord(cube_st[5][0]);
147
+ GL::Vertex(cube[6]);
148
+ GL::TexCoord(cube_st[5][1]);
149
+ GL::Vertex(cube[1]);
150
+ GL::TexCoord(cube_st[5][2]);
151
+ GL::Vertex(cube[2]);
152
+ GL::TexCoord(cube_st[5][3]);
153
+ GL::Vertex(cube[7]);
154
+ GL::PopMatrix()
155
+ GL::End()
156
+ GL::EndList()
157
+
158
+ angle = 0
159
+
160
+ catch(:rubygame_quit) do
161
+ loop do
162
+ queue.each do |event|
163
+ case event
164
+ when Rubygame::KeyDownEvent
165
+ case event.key
166
+ when Rubygame::K_ESCAPE
167
+ throw :rubygame_quit
168
+ when Rubygame::K_Q
169
+ throw :rubygame_quit
170
+ end
171
+ when Rubygame::QuitEvent
172
+ throw :rubygame_quit
173
+ end
174
+ end
175
+
176
+
177
+ GL.ClearColor(0.0, 0.0, 0.0, 1.0);
178
+ GL.Clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT);
179
+
180
+ GL::MatrixMode(GL::MODELVIEW);
181
+ GL::LoadIdentity( )
182
+ GL::Translate(0, 0, -4)
183
+ GL::Rotate(45, 0, 1, 0)
184
+ GL::Rotate(45, 1, 0, 0)
185
+ GL::Rotate(angle, 0.0, 0.0, 1.0)
186
+ GL::Rotate(angle*2, 0.0, 1.0, 0.0)
187
+
188
+ GL::CallList(cube_list)
189
+
190
+ Rubygame::GL.swap_buffers()
191
+ ObjectSpace.garbage_collect
192
+
193
+ angle += clock.tick()/50.0
194
+ angle -= 360 if angle >= 360
195
+
196
+ end
197
+ end
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygame'
4
+
5
+ include Rubygame
6
+ Rubygame.init()
7
+
8
+ def test_music()
9
+
10
+ # Use the lines below to get rid of artsd and contact ALSA directly on Linux.
11
+ # ARTSD happens to be buggy on my old, old linux distro.
12
+ if false
13
+ if RUBY_PLATFORM =~ /linux/
14
+ `killall artsd`
15
+ ENV['SDL_AUDIODRIVER'] = "alsa"
16
+ end
17
+ end
18
+
19
+ puts "Using audio driver:" + Rubygame.audio_driver
20
+
21
+ if ARGV[0]
22
+ file = ARGV[0]
23
+ else
24
+ file = "song.ogg"
25
+ puts "If you want, you could give a filename as an argument to this script."
26
+ end
27
+
28
+ Music.autoload_dirs = [ File.dirname(__FILE__) ]
29
+ mus = Music[file];
30
+
31
+ unless mus
32
+ puts "ERROR: Couldn't find audio file '#{file}'."
33
+ end
34
+
35
+ puts "Testing fading in over 3 seconds, repeating forever."
36
+ mus.play( :fade_in => 3, :repeats => -1 );
37
+ puts('ERROR: Music not fading in') unless mus.fading?(:in)
38
+ sleep 3
39
+
40
+ puts "Playing for 2 seconds."
41
+ sleep 2
42
+
43
+ puts "Lowering volume to half for 3 seconds."
44
+ mus.volume = 0.5;
45
+ puts "ERROR: Volume wasn't adjusted" unless mus.volume == 0.5
46
+ sleep 3
47
+
48
+ puts "Restoring volume to full."
49
+ mus.volume = 1.0;
50
+ sleep 2
51
+
52
+ puts "Pausing for 1 seconds."
53
+ mus.pause
54
+ puts "ERROR: Music not paused." unless mus.paused?
55
+ sleep 1
56
+
57
+ puts "Resuming."
58
+ mus.unpause
59
+ puts "ERROR: Music not resumed" unless mus.playing?
60
+
61
+ puts "Playing for 2 seconds."
62
+ sleep 2
63
+
64
+ puts "Fading out over 2 seconds."
65
+ mus.fade_out(2);
66
+ puts "ERROR: Music not fading out " unless mus.fading?(:out)
67
+
68
+ while mus.playing? or mus.fading? == :out do Thread.pass end
69
+ # Test playing of music to the end
70
+
71
+ puts "ERROR: Music not ended" if mus.playing?
72
+ end
73
+
74
+ music_thread = Thread.new do test_music() end
75
+ music_thread.join
76
+ Rubygame.quit()
77
+
@@ -0,0 +1,296 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This program is released to the PUBLIC DOMAIN.
4
+ # It is distributed in the hope that it will be useful,
5
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
6
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
+
8
+ # This script is messy, but it demonstrates almost all of
9
+ # Rubygame's features, so it acts as a test program to see
10
+ # whether your installation of Rubygame is working.
11
+
12
+ require "rubygame"
13
+ include Rubygame
14
+
15
+ $stdout.sync = true
16
+
17
+ # Use smooth scaling/rotating? You can toggle this with S key
18
+ $smooth = false
19
+
20
+ Rubygame.init()
21
+
22
+ queue = EventQueue.new() # new EventQueue with autofetch
23
+ queue.ignore = [MouseMotionEvent]
24
+ clock = Clock.new()
25
+ clock.target_framerate = 50
26
+
27
+ unless ($gfx_ok = (VERSIONS[:sdl_gfx] != nil))
28
+ raise "SDL_gfx is not available. Bailing out."
29
+ end
30
+
31
+
32
+ # Set up autoloading for Surfaces. Surfaces will be loaded automatically
33
+ # the first time you use Surface["filename"]. Check out the docs for
34
+ # Rubygame::NamedResource for more info about that.
35
+ #
36
+ Surface.autoload_dirs = [ File.dirname(__FILE__) ]
37
+
38
+
39
+ class Panda
40
+ include Sprites::Sprite
41
+
42
+ # Autoload the "panda.png" image and set its colorkey
43
+ @@pandapic = Surface["panda.png"]
44
+ @@pandapic.set_colorkey(@@pandapic.get_at(0,0))
45
+
46
+ attr_accessor :vx, :vy, :speed
47
+ def initialize(x,y)
48
+ super()
49
+ @vx, @vy = 0,0
50
+ @speed = 40
51
+ @image = @@pandapic
52
+ @rect = Rect.new(x,y,*@@pandapic.size)
53
+ end
54
+
55
+ def update_image(time)
56
+ # do nothing in base class, rotate/zoom image in subs
57
+ end
58
+
59
+ def update(time)
60
+ x,y = @rect.center
61
+ self.update_image(time)
62
+ @rect.size = @image.size
63
+
64
+ base = @speed * time/1000.0
65
+ @rect.centerx = x + @vx * base
66
+ @rect.centery = y + @vy * base
67
+ end
68
+
69
+ end
70
+
71
+ class SpinnyPanda < Panda
72
+ attr_accessor :rate
73
+ def initialize(x,y,rate=0.1)
74
+ super(x,y)
75
+ @rate = rate
76
+ @angle = 0
77
+ end
78
+
79
+ def update_image(time)
80
+ @angle += (@rate * time) % 360
81
+ @image = @@pandapic.rotozoom(@angle,1,$smooth)
82
+ end
83
+ end
84
+
85
+ class ExpandaPanda < Panda
86
+ attr_accessor :rate
87
+ def initialize(x,y,rate=0.1)
88
+ super(x,y)
89
+ @rate = rate
90
+ @delta = 0
91
+ end
92
+
93
+ def update_image(time)
94
+ @delta = (@delta + time*@rate/36) % (Math::PI*2)
95
+ zoom = 1 + Math.sin(@delta)/2
96
+ @image = @@pandapic.zoom(zoom,$smooth)
97
+ end
98
+ end
99
+
100
+ class WobblyPanda < Panda
101
+ attr_accessor :rate
102
+ def initialize(x,y,rate=0.1)
103
+ super(x,y)
104
+ @rate = rate
105
+ @delta = 0
106
+ end
107
+
108
+ def update_image(time)
109
+ @delta = (@delta + time*@rate/36) % (Math::PI*2)
110
+ zoomx = (1.5 + Math.sin(@delta)/6) * @@pandapic.width
111
+ zoomy = (1.5 + Math.cos(@delta)/5) * @@pandapic.height
112
+ @image = @@pandapic.zoom_to(zoomx,zoomy,$smooth)
113
+ end
114
+ end
115
+
116
+ pandas = Sprites::Group.new
117
+ pandas.extend(Sprites::UpdateGroup)
118
+ pandas.extend(Sprites::DepthSortGroup)
119
+
120
+ # Create the SDL window
121
+ screen = Screen.set_mode([320,240])
122
+ screen.title = "Rubygame test"
123
+ screen.show_cursor = false;
124
+
125
+ # Create the very cute panda objects!
126
+ panda1 = SpinnyPanda.new(100,50)
127
+ panda2 = ExpandaPanda.new(150,50)
128
+ panda3 = WobblyPanda.new(200,50,0.5)
129
+
130
+ panda1.depth = 0 # in between the others
131
+ panda2.depth = 10 # behind both of the others
132
+ panda3.depth = -10 # in front of both of the others
133
+
134
+ # Put the pandas in a sprite group
135
+ pandas.push(panda1,panda2,panda3)
136
+
137
+ # Make the background surface
138
+ background = Surface.new(screen.size)
139
+
140
+ # Filling with colors in a variety of ways
141
+ background.fill( Color::ColorRGB.new([0.1, 0.2, 0.35]) )
142
+ background.fill( :black, [70,120,80,80] )
143
+ background.fill( "dark red", [80,110,80,80] )
144
+
145
+ # Create and test a new surface
146
+ a = Surface.new([100,100])
147
+
148
+ # Draw a bunch of shapes on the new surface to try out the drawing module
149
+ a.fill([70,70,255])
150
+ rect1 = Rect.new([3,3,94,94])
151
+ a.fill([40,40,1500],rect1)
152
+ a.draw_box_s([30,30],[70,70],[0,0,0])
153
+ a.draw_box([31,31],[69,69],[255,255,255])
154
+ a.draw_circle_s([50,50],10,[100,150,200])
155
+ # Two diagonal white lines, the right anti-aliased, the left not.
156
+ a.draw_line([31,69],[49,31],[255,255,255])
157
+ a.draw_line_a([49,31],[69,69],[255,255,255])
158
+ # Finally, copy this interesting surface onto the background image
159
+ a.blit(background,[50,50],[0,0,90,80])
160
+
161
+ # Draw some shapes on the background for fun
162
+ # ... a filled pentagon with a lighter border
163
+ background.draw_polygon_s(\
164
+ [[50,150],[100,140],[150,160],[120,180],[60,170]],\
165
+ [100,100,100])
166
+ background.draw_polygon_a(\
167
+ [[50,150],[100,140],[150,160],[120,180],[60,170]],\
168
+ [200,200,200])
169
+ # ... a pepperoni pizza!! (if you use your imagination...)
170
+ background.draw_arc_s([250,200],34,[210,150],[180,130,50])
171
+ background.draw_arc_s([250,200],30,[210,150],[230,180,80])
172
+ background.draw_circle_s( [240,180], 4, :dark_red )
173
+ background.draw_circle_s( [265,185], 4, :dark_red )
174
+ background.draw_circle_s( [258,200], 4, :dark_red )
175
+ background.draw_circle_s( [240,215], 4, :dark_red )
176
+ background.draw_circle_s( [260,220], 4, :dark_red )
177
+
178
+ # _Try_ to make an anti-aliased, filled ellipse, but it doesn't work well.
179
+ # If you look closely at the white ellipse, you can see that it isn't
180
+ # AA on the left and right side, and there are some black specks on the top
181
+ # and bottom where the two ellipses don't quite match.
182
+ background.draw_ellipse_s([200,150],[30,25], :beige )
183
+ background.draw_ellipse_a([200,150],[30,25], :beige )
184
+
185
+ # Let's make some labels
186
+ require "rubygame/sfont"
187
+ sfont = SFont.new( Surface["term16.png"] )
188
+ sfont.render("Arrow keys move the spinning panda!").blit(background,[10,10])
189
+
190
+ TTF.setup()
191
+ ttfont_path = File.join(File.dirname(__FILE__),"FreeSans.ttf")
192
+ ttfont = TTF.new( ttfont_path, 20 )
193
+ ttfont.render("This is some TTF text!",true,[250,250,250]).blit(background,[20,200])
194
+
195
+
196
+ # Create another surface to test transparency blitting
197
+ b = Surface.new([200,50])
198
+ b.fill([150,20,40])
199
+ b.set_alpha(123)# approx. half transparent
200
+ b.blit(background,[20,40])
201
+ background.blit(screen,[0,0])
202
+
203
+ # Refresh the screen once. During the loop, we'll use 'dirty rect' updating
204
+ # to refresh only the parts of the screen that have changed.
205
+ screen.update()
206
+
207
+ if Joystick.num_joysticks > 0
208
+ Joystick.new(0) # So that joystick events will appear on the queue
209
+ end
210
+
211
+ update_time = 0
212
+ framerate = 0
213
+
214
+ catch(:rubygame_quit) do
215
+ loop do
216
+ queue.each do |event|
217
+ case event
218
+ when KeyDownEvent
219
+ case event.key
220
+ when K_ESCAPE
221
+ throw :rubygame_quit
222
+ when K_Q
223
+ throw :rubygame_quit
224
+ when K_UP
225
+ panda1.vy = -1
226
+ when K_DOWN
227
+ panda1.vy = 1
228
+ when K_LEFT
229
+ panda1.vx = -1
230
+ when K_RIGHT
231
+ panda1.vx = 1
232
+ when K_S
233
+ $smooth = !$smooth
234
+ puts "#{$smooth?'En':'Dis'}abling smooth scale/rotate."
235
+ else
236
+ print "%s"%[event.string]
237
+ end
238
+ when KeyUpEvent
239
+ case event.key
240
+ when K_UP
241
+ panda1.vy = 0
242
+ when K_DOWN
243
+ panda1.vy = 0
244
+ when K_LEFT
245
+ panda1.vx = 0
246
+ when K_RIGHT
247
+ panda1.vx = 0
248
+ end
249
+ when ActiveEvent
250
+ # ActiveEvent appears when the window gains or loses focus.
251
+ # This helps to ensure everything is refreshed after the Rubygame
252
+ # window has been covered up by a different window.
253
+ screen.update()
254
+ when QuitEvent
255
+ throw :rubygame_quit
256
+ when MouseDownEvent
257
+ puts "click: [%d,%d]"%event.pos
258
+ when JoyDownEvent
259
+ case event.button
260
+ when 4; panda1.speed = 80
261
+ when 5; panda2.speed = 80
262
+ end
263
+ #puts "jdown: %d"%[event.button]
264
+ when JoyUpEvent
265
+ case event.button
266
+ when 4; panda1.speed = 40
267
+ when 5; panda2.speed = 40
268
+ end
269
+ #puts "jup: %d"%[event.button]
270
+ when JoyAxisEvent
271
+ # max = 32767
272
+ case(event.axis)
273
+ when 0; panda1.vx = event.value / 32767.0
274
+ when 1; panda1.vy = event.value / 32767.0
275
+ when 2; panda2.vx = event.value / 32767.0
276
+ when 3; panda2.vy = event.value / 32767.0
277
+ end
278
+ #puts "jaxis: %d %d"%[event.axis,event.value]
279
+ end
280
+ end
281
+
282
+ pandas.undraw(screen,background)
283
+ pandas.update(update_time)
284
+ dirty_rects = pandas.draw(screen)
285
+ screen.update_rects(dirty_rects)
286
+
287
+ update_time = clock.tick()
288
+ unless framerate == clock.framerate
289
+ framerate = clock.framerate
290
+ screen.title = "Rubygame test [%d fps]"%framerate
291
+ end
292
+ end
293
+ end
294
+
295
+ puts "Quitting!"
296
+ Rubygame.quit()