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
Binary file
@@ -0,0 +1,81 @@
1
+ #
2
+ # Usage:
3
+ # ruby joy2.rb [n]
4
+ # n: if given, use n'th joystick
5
+ # if not given, show all connected joystick
6
+ #
7
+ require 'sdl'
8
+
9
+ White = [255,255,255]
10
+
11
+ def print_joystick_info
12
+ for i in 0..SDL::Joystick.num-1
13
+ print i,":",SDL::Joystick.indexName(0),"\n"
14
+ end
15
+ end
16
+
17
+ def display_button_state ( screen, joy )
18
+ for i in 0..joy.numButtons-1
19
+ if joy.button(i) then
20
+ screen.fillRect( i*30+30, 50, 10, 10, [0,0,128] )
21
+ else
22
+ screen.fillRect( i*30+30, 50, 10, 10, White )
23
+ end
24
+ end
25
+ end
26
+
27
+ def display_hat_state ( screen, joy )
28
+ # display the state of only first hat
29
+ if joy.numHats > 0 then
30
+ x = y = 0
31
+ x = 1 if ( joy.hat(0) & SDL::Joystick::HAT_RIGHT ) != 0
32
+ x = -1 if ( joy.hat(0) & SDL::Joystick::HAT_LEFT ) != 0
33
+ y = 1 if ( joy.hat(0) & SDL::Joystick::HAT_DOWN ) != 0
34
+ y = -1 if ( joy.hat(0) & SDL::Joystick::HAT_UP ) != 0
35
+ screen.fillRect( 450 + x*40, 200 + y*40, 10, 10, White )
36
+ end
37
+ end
38
+
39
+ def display_axis_state ( screen, joy )
40
+ for i in 0..joy.numAxes-1
41
+ screen.fillRect( i*30+130, joy.axis(i)*100/32768+200, 20, 20, White )
42
+ end
43
+ end
44
+
45
+ SDL.init( SDL::INIT_VIDEO|SDL::INIT_JOYSTICK )
46
+ screen = SDL::setVideoMode(640, 480, 16, SDL::SWSURFACE)
47
+
48
+ if SDL::Joystick.num == 0 then
49
+ print "No joystick available\n"
50
+ exit
51
+ end
52
+
53
+ if ARGV.size == 0 then
54
+ print_joystick_info
55
+ exit
56
+ end
57
+
58
+ joynum = ARGV[0].to_i
59
+
60
+ if SDL::Joystick.num < joynum then
61
+ print "Joystick No.#{joynum} is not available\n"
62
+ exit
63
+ end
64
+
65
+ joy=SDL::Joystick.open(joynum)
66
+
67
+ while true
68
+
69
+ while event = SDL::Event2.poll
70
+ case event
71
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
72
+ exit
73
+ end
74
+ end
75
+ SDL::Joystick.updateAll
76
+ screen.fillRect(0,0,640,480,0)
77
+ display_button_state screen, joy
78
+ display_hat_state screen, joy
79
+ display_axis_state screen, joy
80
+ screen.updateRect(0, 0, 0, 0)
81
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/local/bin/ruby -Ke
2
+ #
3
+ # This sample needs following two bdf files
4
+ # 8x16.bdf : alphabets
5
+ # jiskan16.bdf : chinese characters and kana
6
+ #
7
+ require 'sdl'
8
+
9
+ SDL.init( SDL::INIT_VIDEO )
10
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
11
+
12
+ font = SDL::Kanji.open("8x16.bdf",16)
13
+ font.add("jiskan16.bdf")
14
+ font.setCodingSystem(SDL::Kanji::EUC)
15
+
16
+ y = 0
17
+ x = 0
18
+
19
+ while true
20
+ while event = SDL::Event2.poll
21
+ case event
22
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
23
+ exit
24
+ end
25
+ end
26
+ screen.fillRect(0,0,640,480,0)
27
+
28
+ y = (y + 1) % 480
29
+ x = (x + 1) % 640
30
+
31
+ font.put(screen,"SDL Kanji�Υƥ�����",40,y,128,128,0)
32
+ font.putTate(screen,"�Ľ񤭤�Ǥ��ޤ���",x,60,128,128,0)
33
+
34
+ screen.updateRect(0,0,0,0)
35
+ sleep 0.005
36
+ end
@@ -0,0 +1,93 @@
1
+ require 'sdl'
2
+
3
+ SDL.init( SDL::INIT_VIDEO )
4
+
5
+ screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
6
+
7
+ image = SDL::Surface.loadBMP("icon.bmp")
8
+ image.setColorKey( SDL::SRCCOLORKEY || SDL::RLEACCEL ,0)
9
+ $image = image.displayFormat
10
+
11
+
12
+ class Sprite
13
+ def initialize
14
+ @x=rand(640)
15
+ @y=rand(480)
16
+ @dx=rand(11)-5
17
+ @dy=rand(11)-5
18
+ end
19
+
20
+ def move
21
+ @x += @dx
22
+ if @x >= 640 then
23
+ @dx *= -1
24
+ @x = 639
25
+ end
26
+ if @x < 0 then
27
+ @dx *= -1
28
+ @x = 0
29
+ end
30
+ @y += @dy
31
+ if @y >= 480 then
32
+ @dy *= -1
33
+ @y = 479
34
+ end
35
+ @y += @dy
36
+ if @y < 0 then
37
+ @dy *= -1
38
+ @y = 0
39
+ end
40
+ end
41
+
42
+ def draw(screen)
43
+ SDL.blitSurface($image,0,0,32,32,screen,@x,@y)
44
+ end
45
+
46
+ end
47
+
48
+ sprites = []
49
+ for i in 1..5
50
+ sprites << Sprite.new
51
+ end
52
+
53
+ class MovableSp
54
+ def initialize()
55
+ @ud=@lr=0;
56
+ end
57
+
58
+ def move()
59
+ @ud=@lr=0;
60
+ @lr=-1 if SDL::Key.press?(SDL::Key::H) or SDL::Key.press?(SDL::Key::LEFT)
61
+ @lr=1 if SDL::Key.press?(SDL::Key::L) or SDL::Key.press?(SDL::Key::RIGHT)
62
+ @ud=1 if SDL::Key.press?(SDL::Key::J) or SDL::Key.press?(SDL::Key::DOWN)
63
+ @ud=-1 if SDL::Key.press?(SDL::Key::K) or SDL::Key.press?(SDL::Key::UP)
64
+ end
65
+
66
+ def draw(screen)
67
+ SDL.blitSurface($image,0,0,32,32,screen,300+@lr*50,200+@ud*50)
68
+ end
69
+ end
70
+
71
+ sprites << MovableSp.new
72
+
73
+ while true
74
+ while event = SDL::Event2.poll
75
+ case event
76
+ when SDL::Event2::Quit
77
+ exit
78
+ when SDL::Event2::KeyDown
79
+ exit if event.sym == SDL::Key::ESCAPE
80
+ end
81
+ end
82
+
83
+ screen.fillRect(0,0,640,480,0)
84
+ SDL::Key.scan
85
+
86
+ sprites.each {|i|
87
+ i.move
88
+ i.draw(screen)
89
+ }
90
+ screen.updateRect(0,0,0,0)
91
+ end
92
+
93
+
@@ -0,0 +1,14 @@
1
+ # This sample needs a mod file `sample.it'.
2
+ #
3
+ require 'sdl'
4
+ SDL::init(SDL::INIT_AUDIO)
5
+
6
+ SDL::Mixer.open(22050)
7
+ SDL::Mixer::playMusic?
8
+ music = SDL::Mixer::Music.load("sample.it")
9
+
10
+ SDL::Mixer.playMusic(music,0)
11
+
12
+ while SDL::Mixer::playMusic?
13
+ sleep 1
14
+ end
@@ -0,0 +1,48 @@
1
+ # This sample needs a MPEG file `sample.mpg'.
2
+ require 'sdl'
3
+
4
+ SDL.init( SDL::INIT_VIDEO|SDL::INIT_AUDIO )
5
+ SDL::Mixer.open
6
+
7
+ screen = SDL.setVideoMode( 320, 240, 16, SDL::SWSURFACE )
8
+
9
+ mpeg = SDL::MPEG.load( 'sample.mpg' )
10
+
11
+ info = mpeg.info
12
+
13
+ p(info)
14
+
15
+ mpeg.enableAudio true
16
+ mpeg.enableVideo true
17
+
18
+ mpeg.setDisplay(screen)
19
+ mpeg.setDisplayRegion( 0, 0, screen.w, screen.h )
20
+ mpeg.play
21
+
22
+ loop do
23
+
24
+ case event = SDL::Event2.poll
25
+ when SDL::Event2::Quit
26
+ mpeg.stop
27
+ exit
28
+ when SDL::Event2::KeyDown
29
+ case event.sym
30
+ when SDL::Key::S
31
+ mpeg.stop
32
+ when SDL::Key::P
33
+ mpeg.play
34
+ when SDL::Key::R
35
+ mpeg.rewind
36
+ when SDL::Key::ESCAPE
37
+ exit
38
+ end
39
+ end
40
+
41
+ if mpeg.status != SDL::MPEG::PLAYING then
42
+ mpeg.stop
43
+ exit
44
+ end
45
+
46
+ sleep 0.1
47
+
48
+ end
@@ -0,0 +1,16 @@
1
+ # This sample needs a wave file `sample.wav', please prepare.
2
+ require 'sdl'
3
+
4
+ SDL::init(SDL::INIT_AUDIO|SDL::INIT_VIDEO)
5
+ SDL.setVideoMode(640,480,16,SDL::SWSURFACE)
6
+
7
+ SDL::Mixer.open
8
+ wave=SDL::Mixer::Wave.load("sample.wav")
9
+
10
+ SDL::Mixer.playChannel(0,wave,0)
11
+
12
+ while SDL::Mixer::play?(0)
13
+ sleep 1
14
+ end
15
+
16
+
@@ -0,0 +1,40 @@
1
+ # SDL random rect sample
2
+ # original code by adas@geocities.co.jp written by C
3
+ # auther TAMURA Kenichi <sgs02516@nifty.com>
4
+ #
5
+ require 'sdl'
6
+
7
+ src_w = 640
8
+ src_h = 480
9
+ src_d = 16
10
+
11
+ dst_w = 0
12
+ dst_h = 0
13
+
14
+ MAX = 1000
15
+ RECTSIZE = 400
16
+
17
+ SDL.init SDL::INIT_VIDEO
18
+ screen = SDL::setVideoMode src_w,src_h,src_d, SDL::SWSURFACE|SDL::ANYFORMAT
19
+
20
+ srand
21
+
22
+ (1 .. MAX).each do |i|
23
+ color = screen.mapRGB rand(256),rand(256),rand(256)
24
+ dst_w = rand(RECTSIZE) + 1
25
+ dst_h = rand(RECTSIZE) + 1
26
+ screen.fillRect rand(src_w-dst_w), rand(src_h-dst_h), dst_w, dst_h, color
27
+ screen.updateRect 0,0,0,0
28
+
29
+ while event = SDL::Event2.poll
30
+ case event
31
+ when SDL::Event2::Quit
32
+ exit
33
+ when SDL::Event2::KeyDown
34
+ exit if event.sym == SDL::Key::ESCAPE
35
+ end
36
+ end
37
+
38
+ SDL::Key.scan
39
+ end
40
+
Binary file
@@ -0,0 +1,70 @@
1
+ #
2
+ # SDLSKK from Ruby/SDL
3
+ #
4
+ # This sample needs three files.
5
+ # jisyo : SKK's dictionary
6
+ # rule_table : SDLSKK's
7
+ # nihongo.ttf : True Type Font file that has Japanese characters
8
+ #
9
+ # Usage:
10
+ # ruby sdlskk.rb [-m]
11
+ #
12
+ # -m Use minibuffer
13
+ #
14
+ require 'sdl'
15
+
16
+ use_minibuffer = (ARGV[0]=='-m')
17
+
18
+ SDL.init( SDL::INIT_VIDEO )
19
+ SDL::TTF.init
20
+ SDL::Event2.enableUNICODE
21
+
22
+ font = SDL::TTF.open( 'nihongo.ttf', 14 )
23
+
24
+ dict = SDL::SKK::Dictionary.new
25
+ dict.load( 'jisyo', false )
26
+ table = SDL::SKK::RomKanaRuleTable.new( 'rule_table' )
27
+ bind = SDL::SKK::Keybind.new
28
+ bind.set_default_key
29
+
30
+ context = SDL::SKK::Context.new( dict, table, bind, use_minibuffer )
31
+
32
+ screen = SDL::setVideoMode( 640, 480, 16, SDL::SWSURFACE )
33
+ SDL::WM.setCaption( $0, $0 )
34
+
35
+ BLACK = screen.mapRGB( 0, 0, 0 )
36
+ loop do
37
+
38
+ while event = SDL::Event2.poll do
39
+ case event
40
+ when SDL::Event2::Quit
41
+ exit
42
+ when SDL::Event2::KeyDown
43
+ if event.sym == SDL::Key::ESCAPE then
44
+ exit
45
+ end
46
+ if event.sym == SDL::Key::F1
47
+ dict.save("test_user_dict")
48
+ end
49
+
50
+ context.input( event )
51
+ end
52
+ end
53
+
54
+ text_surface = context.render_str( font, 255, 0, 255 )
55
+
56
+ screen.fillRect( 0, 0, 640, 480, BLACK )
57
+ SDL.blitSurface( text_surface, 0, 0, 0, 0, screen, 0, 0 )
58
+
59
+ if use_minibuffer then
60
+ minibuffer_surface = context.render_minibuffer_str( font, 255, 0, 255 )
61
+ if minibuffer_surface then
62
+ SDL.blitSurface( minibuffer_surface, 0, 0, 0, 0, screen, 0, 40 )
63
+ end
64
+ end
65
+
66
+ screen.updateRect( 0, 0, 0, 0 )
67
+
68
+ sleep 0.05
69
+
70
+ end
@@ -0,0 +1,31 @@
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
+ # draw red pixel at (200,200)
8
+ screen[200,200]= screen.format.mapRGB(255,0,0)
9
+ # draw green pixel at (250,200)
10
+ screen[250,200]= screen.format.mapRGB(0,255,0)
11
+ # draw blue pixel at (200,200)
12
+ screen[300,200]= screen.format.mapRGB(0,0,255)
13
+
14
+ Red=screen.format.mapRGB(255,0,0)
15
+ screen.drawLine(20,20,300,200,Red)
16
+ screen.drawRect(49,59,80,80,Red)
17
+ screen.drawCircle(100,100,50,[87,87,87])
18
+ screen.drawFilledCircle(300,300,30,Red)
19
+
20
+ screen.flip
21
+
22
+ while true
23
+ while event = SDL::Event2.poll
24
+ case event
25
+ when SDL::Event2::KeyDown, SDL::Event2::Quit
26
+ exit
27
+ end
28
+ end
29
+
30
+ sleep 0.2
31
+ end
@@ -0,0 +1,275 @@
1
+ # This sample need ruby 1.8 or 1.6 with shim
2
+ # Thanks to Simon Strandgaard
3
+ require 'sdl'
4
+ if RUBY_VERSION < "1.7" then
5
+ require 'features/ruby18'
6
+ end
7
+
8
+ class Object
9
+ def deep_clone
10
+ Marshal::load(Marshal.dump(self))
11
+ end
12
+ end
13
+
14
+ class Array
15
+ def random
16
+ at(Kernel.rand(size))
17
+ end
18
+ end
19
+
20
+ class Pattern
21
+ def initialize(x, y, *data)
22
+ @x = x
23
+ @y = y
24
+ @data = data
25
+ end
26
+ attr_reader :data, :x, :y
27
+ alias width x
28
+ def rotate
29
+ @data = @data.reverse.transpose
30
+ @x, @y = @y, @x
31
+ end
32
+ PAT1 = Pattern.new(4, 1, [1, 1, 1, 1])
33
+ PAT2 = Pattern.new(3, 2, [1, 1, 1], [0, 1, 0])
34
+ PAT3 = Pattern.new(3, 2, [1, 1, 1], [1, 0, 0])
35
+ PAT4 = Pattern.new(3, 2, [1, 1, 1], [0, 0, 1])
36
+ PAT5 = Pattern.new(2, 2, [1, 1], [1, 1])
37
+ PAT6 = Pattern.new(3, 2, [1, 1, 0], [0, 1, 1])
38
+ PAT7 = Pattern.new(3, 2, [0, 1, 1], [1, 1, 0])
39
+ def Pattern::patterns
40
+ [PAT1, PAT2, PAT3, PAT4, PAT5, PAT6, PAT7]
41
+ end
42
+ end
43
+
44
+ class Level
45
+ def initialize(width=10, height=15)
46
+ @height = height
47
+ @width = width
48
+ @data = Array.new(height) { Array.new(width, 0) }
49
+ backup_background
50
+ end
51
+ attr_reader :width, :height
52
+ def test
53
+ @data[0][0] = 1
54
+ @data[0][@width-1] = 1
55
+ @data[@height-1][0] = 1
56
+ @data[@height-1][@width-1] = 1
57
+ end
58
+ def bg_is_collision(offset_x, offset_y, pattern)
59
+ return true if pattern.x + offset_x > @width
60
+ return true if pattern.y + offset_y > @height
61
+ y = offset_y
62
+ pattern.data.each do |row|
63
+ x = offset_x
64
+ row.each do |cell|
65
+ if (cell != 0) and (@bg[y][x] != 0)
66
+ return true
67
+ end
68
+ x += 1
69
+ end
70
+ y += 1
71
+ end
72
+ return false
73
+ end
74
+ def restore_background
75
+ @data = @bg
76
+ end
77
+ def backup_background
78
+ @bg = @data.deep_clone
79
+ end
80
+ def or_pattern(offset_x, offset_y, pattern)
81
+ backup_background
82
+ y = offset_y
83
+ pattern.data.each do |row|
84
+ x = offset_x
85
+ row.each do |cell|
86
+ @data[y][x] = cell if cell != 0
87
+ x += 1
88
+ end
89
+ y += 1
90
+ end
91
+ end
92
+ def find_filled_rows
93
+ res = []
94
+ @data.each_index do |y|
95
+ ok = true
96
+ @data[y].each do |cell|
97
+ if cell == 0
98
+ ok = false
99
+ break
100
+ end
101
+ end
102
+ res << y if ok
103
+ end
104
+ res
105
+ end
106
+ def remove_rows(*rows)
107
+ rows.uniq!
108
+ rows.each do |y|
109
+ @bg[y] = nil
110
+ end
111
+ @bg.compact!
112
+ extra = Array.new(rows.size) { Array.new(@width, 0) }
113
+ @bg = extra + @bg
114
+ raise "integrity error" if @bg.size != @height
115
+ end
116
+ end
117
+
118
+ class Level
119
+ def load_render_data
120
+ @image = SDL::Surface.loadBMP("icon.bmp")
121
+ @image.setColorKey( SDL::SRCCOLORKEY ,0)
122
+ @image = @image.displayFormat
123
+ @step_x = 32 # todo: image width
124
+ @step_y = 32 # todo: image height
125
+ # todo: raise exception is level does not fit to screen!
126
+ @offset_x = 100
127
+ @offset_y = 20
128
+
129
+ @fill_removal_dir = false
130
+ end
131
+ def render
132
+ y = @offset_y
133
+ @data.each do |row|
134
+ render_line(y, row)
135
+ y += @step_y
136
+ end
137
+ end
138
+ def render_line(y, cells)
139
+ x = @offset_x
140
+ cells.each do |cell|
141
+ i = (cell == 0) ? 63 : 255
142
+ @image.setAlpha(SDL::SRCALPHA,i)
143
+ $screen.put(@image,x,y)
144
+ x += @step_x
145
+ end
146
+ end
147
+ FILL = (20 * 256*256) + (0 * 256) + 10
148
+ def render_removal(rows)
149
+ $screen.fillRect(0,0,640,512,0)
150
+ render
151
+ rows.reverse_each do |row|
152
+ y = (row * @step_y) + @offset_y
153
+
154
+ if @fill_removal_dir
155
+ i = 0
156
+ x = @offset_x
157
+ while i < @width
158
+ $screen.fillRect(x,y,@step_x,@step_y,FILL)
159
+ $screen.flip
160
+ i += 1
161
+ x += @step_x
162
+ end
163
+ @fill_removal_dir = false
164
+ else
165
+ i = 0
166
+ x = @offset_x + ((@width-1)*@step_x)
167
+ while i < @width
168
+ $screen.fillRect(x,y,@step_x,@step_y,FILL)
169
+ $screen.flip
170
+ i += 1
171
+ x -= @step_x
172
+ end
173
+ @fill_removal_dir = true
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ SDL.init( SDL::INIT_VIDEO )
180
+ $screen = SDL::setVideoMode(640,512,24,SDL::SWSURFACE)
181
+ level = Level.new
182
+ level.test
183
+ level.load_render_data
184
+ pat = Pattern::PAT3.clone
185
+ pat_x = 5
186
+ pat_y = 0
187
+ time_step = 0.5
188
+ time = Time.now
189
+ launch_new_pattern = true
190
+ loop do
191
+ if launch_new_pattern
192
+ launch_new_pattern = false
193
+ time_step = 0.5
194
+ time = Time.now
195
+ pat = Pattern::patterns.random.clone
196
+ pat_x = 5
197
+ pat_y = 0
198
+ level.backup_background
199
+ if level.bg_is_collision(pat_x, pat_y, pat)
200
+ puts "Sorry you are game over"
201
+ sleep 3
202
+ raise "game over"
203
+ end
204
+ level.or_pattern(pat_x, pat_y, pat)
205
+ end
206
+
207
+ # timer events
208
+ while Time.now > time + time_step
209
+ pat_y += 1
210
+ if level.bg_is_collision(pat_x, pat_y, pat)
211
+ launch_new_pattern = true
212
+ rows = level.find_filled_rows
213
+ if rows.size > 0
214
+ puts "rows filled"
215
+ p rows
216
+ level.render_removal(rows)
217
+
218
+ level.backup_background
219
+ level.remove_rows(*rows)
220
+ level.restore_background
221
+ end
222
+ else
223
+ level.restore_background
224
+ level.or_pattern(pat_x, pat_y, pat)
225
+ end
226
+ time += time_step
227
+ end
228
+
229
+ old_pat_x = pat_x
230
+ old_pat_y = pat_y
231
+ rotate = false
232
+
233
+ # handle keystrokes
234
+ while event = SDL::Event2.poll
235
+ case event
236
+ when SDL::Event2::Quit then exit
237
+ when SDL::Event2::KeyDown
238
+ case event.sym
239
+ when SDL::Key::ESCAPE then exit
240
+ when SDL::Key::UP then rotate = true
241
+ when SDL::Key::DOWN then time_step = 0.1
242
+ when SDL::Key::LEFT
243
+ pat_x -= 1 if pat_x > 0
244
+ when SDL::Key::RIGHT
245
+ pat_x += 1 if pat_x < (level.width - pat.width)
246
+ end
247
+ end
248
+ end
249
+ SDL::Key.scan
250
+
251
+ # move pattern & do collition tests
252
+ if (pat_x <=> old_pat_x) or (pat_y <=> old_pat_y) or (rotate == true)
253
+
254
+ old_pat = pat.clone
255
+ pat.rotate if rotate
256
+
257
+ # if collision then restore last working-state
258
+ if level.bg_is_collision(pat_x, pat_y, pat)
259
+ pat_x = old_pat_x
260
+ pat_y = old_pat_y
261
+ pat = old_pat
262
+ else
263
+ # collision avoided.. therefore don't launch new pattern
264
+ launch_new_pattern = false
265
+ level.restore_background
266
+ level.or_pattern(pat_x, pat_y, pat)
267
+ end
268
+ end
269
+
270
+ # repaint screen
271
+ $screen.fillRect(0,0,640,512,0)
272
+ level.render
273
+ GC.start # release memory.. otherwise it would grow steady
274
+ $screen.flip
275
+ end