rubysdl 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/LICENSE +505 -0
  2. data/MANIFEST +81 -0
  3. data/NEWS.en +144 -0
  4. data/NEWS.ja +151 -0
  5. data/README.en +117 -0
  6. data/README.ja +166 -0
  7. data/SDL_kanji.c +403 -0
  8. data/SDL_kanji.h +48 -0
  9. data/depend +18 -0
  10. data/doc/Makefile +18 -0
  11. data/doc/cdrom.rsd +431 -0
  12. data/doc/collision.rsd +162 -0
  13. data/doc/event.rsd +1487 -0
  14. data/doc/font.rsd +839 -0
  15. data/doc/general.rsd +49 -0
  16. data/doc/init.rsd +175 -0
  17. data/doc/joystick.rsd +387 -0
  18. data/doc/mixer.rsd +837 -0
  19. data/doc/mpeg.rsd +595 -0
  20. data/doc/rsd.rb +125 -0
  21. data/doc/sdlskk.rsd +496 -0
  22. data/doc/time.rsd +45 -0
  23. data/doc/video.rsd +2499 -0
  24. data/doc/wm.rsd +113 -0
  25. data/extconf.rb +92 -0
  26. data/lib/rubysdl_aliases.rb +431 -0
  27. data/lib/sdl.rb +271 -0
  28. data/rubysdl.h +109 -0
  29. data/rubysdl_cdrom.c +176 -0
  30. data/rubysdl_const_list.txt +280 -0
  31. data/rubysdl_doc.en.rd +2180 -0
  32. data/rubysdl_doc_old.rd +2402 -0
  33. data/rubysdl_event.c +346 -0
  34. data/rubysdl_event2.c +417 -0
  35. data/rubysdl_event_key.c +356 -0
  36. data/rubysdl_image.c +53 -0
  37. data/rubysdl_joystick.c +156 -0
  38. data/rubysdl_kanji.c +135 -0
  39. data/rubysdl_main.c +202 -0
  40. data/rubysdl_mixer.c +422 -0
  41. data/rubysdl_mouse.c +96 -0
  42. data/rubysdl_opengl.c +63 -0
  43. data/rubysdl_pixel.c +133 -0
  44. data/rubysdl_ref.html +5550 -0
  45. data/rubysdl_ref.rd +6163 -0
  46. data/rubysdl_rwops.c +90 -0
  47. data/rubysdl_sdlskk.c +312 -0
  48. data/rubysdl_sge_video.c +622 -0
  49. data/rubysdl_smpeg.c +341 -0
  50. data/rubysdl_time.c +36 -0
  51. data/rubysdl_ttf.c +324 -0
  52. data/rubysdl_video.c +749 -0
  53. data/rubysdl_wm.c +71 -0
  54. data/sample/aadraw.rb +24 -0
  55. data/sample/alpha.rb +27 -0
  56. data/sample/alphadraw.rb +25 -0
  57. data/sample/bfont.rb +24 -0
  58. data/sample/cdrom.rb +17 -0
  59. data/sample/collision.rb +97 -0
  60. data/sample/cursor.bmp +0 -0
  61. data/sample/cursor.rb +22 -0
  62. data/sample/ellipses.rb +35 -0
  63. data/sample/event2.rb +32 -0
  64. data/sample/font.bmp +0 -0
  65. data/sample/font.rb +25 -0
  66. data/sample/fpstimer.rb +175 -0
  67. data/sample/icon.bmp +0 -0
  68. data/sample/joy2.rb +81 -0
  69. data/sample/kanji.rb +36 -0
  70. data/sample/movesp.rb +93 -0
  71. data/sample/playmod.rb +14 -0
  72. data/sample/plaympeg.rb +48 -0
  73. data/sample/playwave.rb +16 -0
  74. data/sample/randrect.rb +40 -0
  75. data/sample/sample.ttf +0 -0
  76. data/sample/sdlskk.rb +70 -0
  77. data/sample/sgetest.rb +31 -0
  78. data/sample/stetris.rb +275 -0
  79. data/sample/testgl.rb +166 -0
  80. data/sample/testsprite.rb +68 -0
  81. data/sample/transformblit.rb +41 -0
  82. metadata +121 -0
@@ -0,0 +1,71 @@
1
+ /*
2
+ Ruby/SDL Ruby extension library for SDL
3
+
4
+ Copyright (C) 2001-2007 Ohbayashi Ippei
5
+
6
+ This library is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU Lesser General Public
8
+ License as published by the Free Software Foundation; either
9
+ version 2.1 of the License, or (at your option) any later version.
10
+
11
+ This library is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public
17
+ License along with this library; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ */
20
+ #include "rubysdl.h"
21
+
22
+ static VALUE sdl_wm_getCaption(VALUE mod)
23
+ {
24
+ char *title,*icon;
25
+ SDL_WM_GetCaption( &title,&icon );
26
+ return rb_ary_new3( 2,rb_str_new2(title),rb_str_new2(icon) );
27
+ }
28
+ static VALUE sdl_wm_setCaption(VALUE mod,VALUE title,VALUE icon)
29
+ {
30
+ SDL_WM_SetCaption( GETCSTR(title),GETCSTR(icon) );
31
+ return Qnil;
32
+ }
33
+ static VALUE sdl_wm_setIcon(VALUE mod,VALUE icon)
34
+ {
35
+ SDL_Surface *surface;
36
+ if( ! rb_obj_is_kind_of(icon,cSurface) )
37
+ rb_raise(rb_eArgError,"type mismatch (expected Surface)");
38
+ Data_Get_Struct(icon,SDL_Surface,surface);
39
+ SDL_WM_SetIcon(surface,NULL);
40
+ return Qnil;
41
+ }
42
+ static VALUE sdl_wm_iconifyWindow(VALUE mod)
43
+ {
44
+ if( ! SDL_WM_IconifyWindow() )
45
+ rb_raise( eSDLError,"iconify failed: %s",SDL_GetError() );
46
+ return Qnil;
47
+ }
48
+
49
+ static void defineConstForWM()
50
+ {
51
+ rb_define_const(mWM,"GRAB_QUERY",INT2NUM(SDL_GRAB_QUERY));
52
+ rb_define_const(mWM,"GRAB_OFF",INT2NUM(SDL_GRAB_OFF));
53
+ rb_define_const(mWM,"GRAB_ON",INT2NUM(SDL_GRAB_ON));
54
+ }
55
+
56
+ static VALUE sdl_wm_grabInput(VALUE mod, VALUE flag)
57
+ {
58
+ return INT2FIX(SDL_WM_GrabInput(flag));
59
+ }
60
+
61
+ void init_wm()
62
+ {
63
+ mWM=rb_define_module_under(mSDL,"WM");
64
+ rb_define_module_function(mWM,"caption",sdl_wm_getCaption,0);
65
+ rb_define_module_function(mWM,"setCaption",sdl_wm_setCaption,2);
66
+ rb_define_module_function(mWM,"icon=",sdl_wm_setIcon,1);
67
+ rb_define_module_function(mWM,"iconify",sdl_wm_iconifyWindow,0);
68
+ rb_define_module_function(mWM,"grabInput",sdl_wm_grabInput,1);
69
+
70
+ defineConstForWM();
71
+ }
@@ -0,0 +1,24 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+ SDL::WM::setCaption $0, $0
6
+
7
+ Red=screen.format.mapRGB(255,0,0)
8
+ screen.drawAALine(20,20,300,200,Red)
9
+ screen.drawAACircle(100,100,50,[87,87,87])
10
+ screen.drawAAFilledCircle(300,300,30,Red)
11
+ screen.drawAAEllipse(320,240,100,200,[200,255,0])
12
+
13
+ screen.flip
14
+
15
+ while true
16
+ while event = SDL::Event2.poll
17
+ case event
18
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
19
+ exit
20
+ end
21
+ end
22
+
23
+ sleep 0.2
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+
6
+ image = SDL::Surface.loadBMP("icon.bmp")
7
+ image.setColorKey( SDL::SRCCOLORKEY ,0)
8
+ image = image.displayFormat
9
+
10
+ event=SDL::Event.new
11
+ i=0;
12
+ while true
13
+ if event.poll != 0 then
14
+ if event.type==SDL::Event::QUIT then
15
+ break
16
+ end
17
+ if event.type==SDL::Event::KEYDOWN then
18
+ exit
19
+ end
20
+ end
21
+ screen.fillRect(0,0,640,480,0)
22
+
23
+ image.setAlpha(SDL::SRCALPHA,i%256)
24
+ screen.put(image,310,195)
25
+ i+=1
26
+ screen.flip
27
+ end
@@ -0,0 +1,25 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+ SDL::WM::setCaption $0, $0
6
+
7
+ Red=screen.format.mapRGB(255,0,0)
8
+ screen.drawAAFilledCircle(320,240,220,[140,180,0])
9
+ screen.drawAALineAlpha(20,20,300,200,Red,rand(64)+128)
10
+ screen.drawAACircleAlpha(100,100,50,[87,87,87],rand(64)+128)
11
+ screen.drawFilledCircleAlpha(300,170,50,[87,80,0],rand(64)+128)
12
+ screen.drawEllipseAlpha(320,240,100,200,[200,255,0],rand(64)+128)
13
+
14
+ screen.flip
15
+
16
+ while true
17
+ while event = SDL::Event2.poll
18
+ case event
19
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
20
+ exit
21
+ end
22
+ end
23
+
24
+ sleep 0.2
25
+ end
@@ -0,0 +1,24 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+
6
+ font = SDL::BMFont.open("font.bmp",SDL::BMFont::TRANSPARENT)
7
+
8
+ y = 0
9
+
10
+ while true
11
+ while event = SDL::Event2.poll
12
+ case event
13
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
14
+ exit
15
+ end
16
+ end
17
+ screen.fillRect(0,0,640,480,0)
18
+
19
+ y = (y + 1) % 480
20
+ font.textout(screen,"BitMapFont Testing..",40,y)
21
+
22
+ screen.updateRect(0,0,0,0)
23
+ sleep 0.005
24
+ end
@@ -0,0 +1,17 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_CDROM )
4
+
5
+ print SDL::CD.numDrive,"\n"
6
+ print SDL::CD.indexName(0),"\n"
7
+ cd=SDL::CD.open(0)
8
+ cd.status
9
+ print cd.numTracks," ",cd.status, "\n"
10
+
11
+ begin
12
+ cd.playTracks 1,0,1,0
13
+ sleep 100
14
+ ensure
15
+ cd.stop
16
+ end
17
+
@@ -0,0 +1,97 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+ SDL::WM::setCaption('collision.rb','collision.rb icon')
6
+ $image = SDL::Surface.loadBMP("icon.bmp")
7
+ $image.setColorKey( SDL::SRCCOLORKEY ,0)
8
+ $image = $image.displayFormat
9
+ $cMap = $image.makeCollisionMap
10
+
11
+ class Sprite
12
+
13
+ attr_reader :x, :y
14
+
15
+ def initialize(screen)
16
+ @screen = screen
17
+ @x=rand(screen.w)
18
+ @y=rand(screen.h)
19
+ @dx=rand(11)-5
20
+ @dy=rand(11)-5
21
+ end
22
+
23
+ def move
24
+ @x, @dx = moveCoord(@x, @dx, xMax)
25
+ @y, @dy = moveCoord(@y, @dy, yMax)
26
+ end
27
+
28
+ def bounce
29
+ @dx *= -1
30
+ @dy *= -1
31
+ move
32
+ end
33
+
34
+ def draw
35
+ SDL.blitSurface($image,0,0,$image.w,$image.h,@screen,@x,@y)
36
+ end
37
+
38
+ def collidingWith(sprite)
39
+ $cMap.collisionCheck(@x, @y, $cMap, sprite.x, sprite.y) != nil
40
+ end
41
+
42
+ private
43
+
44
+ def moveCoord(coord, delta, max)
45
+ coord += delta
46
+ if coord >= max then
47
+ delta *= -1
48
+ coord = max - 1
49
+ end
50
+ if coord < 0 then
51
+ delta *= -1
52
+ coord = 0
53
+ end
54
+ [coord, delta]
55
+ end
56
+
57
+ def xMax
58
+ @screen.w - $image.w
59
+ end
60
+
61
+ def yMax
62
+ @screen.h - $image.h
63
+ end
64
+
65
+ end
66
+
67
+ def detectCollisions(sprites)
68
+ collisions = []
69
+ for i in (0 ... sprites.size - 1) do
70
+ for j in (i + 1 ... sprites.size) do
71
+ if sprites[i].collidingWith(sprites[j])
72
+ collisions << sprites[i]
73
+ collisions << sprites[j]
74
+ end
75
+ end
76
+ end
77
+ collisions.uniq
78
+ end
79
+
80
+ sprites = (1..8).collect {Sprite.new(screen)}
81
+
82
+
83
+ while true
84
+ while event = SDL::Event2.poll
85
+ case event
86
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
87
+ exit
88
+ end
89
+ end
90
+
91
+ screen.fillRect(0,0,640,480,screen.mapRGB(64, 64, 64))
92
+ sprites.each {|i| i.move}
93
+ detectCollisions(sprites).each {|i| i.bounce}
94
+ sprites.each {|i| i.draw}
95
+ screen.updateRect(0,0,0,0)
96
+ end
97
+
Binary file
@@ -0,0 +1,22 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+ screen.fillRect 0,0,640,480,[32,240,100]
6
+ screen.flip
7
+ SDL::WM::setCaption $0,$0
8
+
9
+ image=SDL::Surface.loadBMP 'cursor.bmp'
10
+ SDL::Mouse.setCursor image,image[0,0],image[1,1],image[7,0],543
11
+
12
+
13
+ while true
14
+
15
+ while event = SDL::Event2.poll
16
+ case event
17
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
18
+ exit
19
+ end
20
+ end
21
+ sleep 0.01
22
+ end
@@ -0,0 +1,35 @@
1
+ # SDL random ellipses
2
+ # Author: Wayne Conrad <wconrad@yagni.com>
3
+
4
+ require 'sdl'
5
+
6
+ def show(function)
7
+ event = SDL::Event.new
8
+ screen = SDL::setVideoMode(640, 480, 16, SDL::SWSURFACE|SDL::ANYFORMAT)
9
+ loop do
10
+ color = screen.mapRGB(rand(256),rand(256),rand(256))
11
+ x = rand(screen.w)
12
+ y = rand(screen.h)
13
+ xr = rand(80)
14
+ yr = rand(80)
15
+ eval("screen.#{function}(x, y, xr, yr, color)")
16
+ if event.poll != 0 then
17
+ case event.type
18
+ when SDL::Event::QUIT
19
+ exit
20
+ when SDL::Event::MOUSEBUTTONDOWN
21
+ break
22
+ when SDL::Event::KEYDOWN
23
+ exit if event.keySym == SDL::Key::ESCAPE
24
+ break
25
+ end
26
+ end
27
+ SDL::Key.scan
28
+ screen.updateRect(0, 0, 0, 0)
29
+ end
30
+ end
31
+
32
+ srand
33
+ SDL.init SDL::INIT_VIDEO
34
+ show("drawEllipse")
35
+ show("drawFilledEllipse")
@@ -0,0 +1,32 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
5
+ SDL::WM::setCaption $0,$0
6
+
7
+ loop do
8
+ if event=SDL::Event2.poll then
9
+ case event
10
+ when SDL::Event2::Active
11
+ print "Active ", (event.gain)?"gain":"lost","\n"
12
+ when SDL::Event2::KeyDown
13
+ print "KeyDown sym:#{event.sym} mod:#{event.mod}","\n"
14
+ if event.sym==SDL::Key::A then
15
+ e=SDL::Event2::KeyDown.new
16
+ e.sym=3333
17
+ e.mod=3333
18
+ e.press=true
19
+ e.unicode=200
20
+ SDL::Event2.push(e)
21
+ end
22
+ when SDL::Event2::KeyUp
23
+ print "KeyUp sym:#{event.sym} mod:#{event.mod}","\n"
24
+
25
+ when SDL::Event2::Quit
26
+ exit
27
+
28
+ end
29
+ end
30
+ end
31
+
32
+
Binary file
@@ -0,0 +1,25 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+
5
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
6
+ SDL::WM::setCaption($0,$0)
7
+
8
+ SDL::TTF.init
9
+
10
+ font = SDL::TTF.open('sample.ttf',24)
11
+ font.style = SDL::TTF::STYLE_NORMAL
12
+
13
+ font.drawSolidUTF8(screen,'test SDL_ttf',300,150,255,255,255)
14
+
15
+ screen.flip
16
+
17
+ while true
18
+ while event = SDL::Event2.poll
19
+ case event
20
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
21
+ exit
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,175 @@
1
+ require 'sdl'
2
+
3
+ class FPSTimerSample
4
+ FPS_COUNT = 10
5
+
6
+ attr_accessor :fps
7
+ attr_reader :real_fps, :total_skip
8
+ attr_reader :count_sleep
9
+ # +fps+ is the number of frames per second that you want to keep,
10
+ # +accurary+ is the accurary of sleep/SDL.delay in milisecond
11
+ def initialize(fps = 60, accurary = 10, skip_limit = 15)
12
+ @fps = fps
13
+ @accurary = accurary / 1000.0
14
+ @skip_limit = skip_limit
15
+ end
16
+
17
+ # reset timer, you should call just before starting loop
18
+ def reset
19
+ @old = get_ticks
20
+ @skip = 0
21
+ @real_fps = @fps
22
+ @frame_count = 0
23
+ @fps_old = @old
24
+ @count_sleep = 0
25
+ @total_skip = 0
26
+ end
27
+
28
+ # execute given block and wait
29
+ def wait_frame
30
+ now = get_ticks
31
+ nxt = @old + (1.0/@fps)
32
+ if nxt > now || @skip > @skip_limit
33
+ yield
34
+ @skip = 0
35
+ wait(nxt)
36
+ @old = nxt
37
+ else
38
+ @skip += 1
39
+ @total_skip += 1
40
+ @old = get_ticks
41
+ end
42
+
43
+ calc_real_fps
44
+ end
45
+
46
+ private
47
+ def wait(nxt)
48
+ while nxt > get_ticks + @accurary
49
+ sleep(@accurary - 0.005)
50
+ @count_sleep += 1
51
+ end
52
+
53
+ while nxt > get_ticks
54
+ # busy loop, do nothing
55
+ end
56
+ end
57
+
58
+ def get_ticks
59
+ SDL.getTicks / 1000.0
60
+ end
61
+
62
+ def calc_real_fps
63
+ @frame_count += 1
64
+ if @frame_count >= FPS_COUNT
65
+ @frame_count = 0
66
+ now = get_ticks
67
+ @real_fps = FPS_COUNT / (now - @fps_old)
68
+ @fps_old = now
69
+ end
70
+ end
71
+ end
72
+
73
+ class FPSTimerLight
74
+ N = 12
75
+ DT = 2
76
+ FPS_COUNT = 10
77
+
78
+ attr_reader :fps
79
+ attr_reader :real_fps
80
+ # +fps+ is the number of frames per second that you want to keep,
81
+ # +accurary+ is the accurary of sleep/SDL.delay in milisecond
82
+ def initialize(fps = 60, accurary = 10, skip_limit = 15)
83
+ @fps = fps
84
+ @accurary = accurary * N
85
+ @skip_limit = 15
86
+ @one_frame = 1000*N / fps
87
+ @delay = accurary - 2
88
+ end
89
+
90
+ # reset timer, you should call just before starting loop
91
+ def reset
92
+ @old = get_ticks
93
+ @skip = 0
94
+
95
+ # for calculate real fps
96
+ @frame_count = 0
97
+ @fps_old = @old
98
+ @real_fps = @fps
99
+ end
100
+
101
+ def wait_frame
102
+ now = get_ticks
103
+ nxt = @old + @one_frame
104
+ if nxt > now || @skip > @skip_limit
105
+ yield
106
+ @skip = 0
107
+ wait(nxt)
108
+ @old = nxt
109
+ else
110
+ @skip += 1
111
+ @total_skip += 1
112
+ @old = get_ticks
113
+ end
114
+
115
+ calc_real_fps
116
+ end
117
+
118
+ private
119
+ def get_ticks
120
+ SDL.getTicks * N
121
+ end
122
+
123
+ def wait(nxt)
124
+ while nxt > get_ticks + @accurary
125
+ SDL.delay(@delay)
126
+ end
127
+
128
+ while nxt > get_ticks
129
+ # busy loop, do nothing
130
+ end
131
+ end
132
+
133
+ def calc_real_fps
134
+ @frame_count += 1
135
+ if @frame_count >= FPS_COUNT
136
+ @frame_count = 0
137
+ now = get_ticks
138
+ @real_fps = (N*1000*FPS_COUNT)/(now - @fps_old)
139
+ @fps_old = now
140
+ end
141
+ end
142
+ end
143
+
144
+ if __FILE__ == $0
145
+ timer = FPSTimerSample.new
146
+ log = []
147
+
148
+ timer.reset
149
+ 300.times do
150
+ sleep 0.005 if rand(5) == 0
151
+ timer.wait_frame do
152
+ log << timer.real_fps.to_s
153
+ end
154
+ end
155
+
156
+ puts log
157
+ printf "skip:%d\n", timer.total_skip
158
+ printf "sleep:%d\n", timer.count_sleep
159
+
160
+ puts
161
+
162
+ timer = FPSTimerLight.new
163
+ log = []
164
+
165
+ timer.reset
166
+ old = SDL.getTicks
167
+ 300.times do
168
+ sleep 0.005 if rand(5) == 0
169
+ timer.wait_frame do
170
+ log << timer.real_fps
171
+ end
172
+ end
173
+
174
+ puts log
175
+ end