rubygame 2.5.3 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +6 -4
- data/NEWS +79 -0
- data/README +55 -72
- data/ROADMAP +20 -13
- data/doc/custom_sdl_load_paths.rdoc +79 -0
- data/doc/getting_started.rdoc +65 -36
- data/doc/keyboard_symbols.rdoc +243 -0
- data/doc/macosx_install.rdoc +49 -35
- data/doc/windows_install.rdoc +36 -108
- data/lib/rubygame.rb +62 -24
- data/lib/rubygame/audio.rb +147 -0
- data/lib/rubygame/clock.rb +164 -1
- data/lib/rubygame/color.rb +40 -7
- data/lib/rubygame/color/models/hsl.rb +1 -1
- data/lib/rubygame/color/models/hsv.rb +1 -1
- data/lib/rubygame/color/models/rgb.rb +1 -1
- data/lib/rubygame/color/palettes/css.rb +1 -3
- data/lib/rubygame/color/palettes/x11.rb +1 -2
- data/lib/rubygame/constants.rb +297 -0
- data/lib/rubygame/deprecated_mixer.rb +555 -0
- data/lib/rubygame/event.rb +122 -6
- data/lib/rubygame/event_handler.rb +3 -1
- data/lib/rubygame/event_hook.rb +6 -2
- data/lib/rubygame/event_triggers.rb +1 -1
- data/lib/rubygame/events.rb +416 -1
- data/lib/rubygame/ftor.rb +1 -7
- data/lib/rubygame/gfx.rb +583 -0
- data/lib/rubygame/gl.rb +107 -0
- data/lib/rubygame/image.rb +140 -0
- data/lib/rubygame/joystick.rb +184 -0
- data/lib/rubygame/main.rb +82 -0
- data/lib/rubygame/mediabag.rb +1 -1
- data/lib/rubygame/mixer.rb +30 -0
- data/lib/rubygame/music.rb +493 -0
- data/lib/rubygame/queue.rb +3 -1
- data/lib/rubygame/rect.rb +9 -9
- data/lib/rubygame/screen.rb +357 -0
- data/lib/rubygame/shared.rb +40 -4
- data/lib/rubygame/sound.rb +428 -0
- data/lib/rubygame/surface.rb +626 -0
- data/lib/rubygame/ttf.rb +311 -0
- data/samples/FreeSans.ttf +0 -0
- data/samples/README +6 -5
- data/samples/demo_draw.rb +1 -1
- data/samples/demo_gl.rb +3 -1
- data/samples/demo_gl_tex.rb +4 -2
- data/samples/demo_rubygame.rb +114 -105
- data/samples/demo_sfont.rb +1 -1
- data/samples/demo_ttf.rb +3 -1
- data/samples/demo_utf8.rb +1 -1
- data/samples/image_viewer.rb +118 -0
- data/samples/load_and_blit.rb +1 -1
- data/samples/rubygame.png +0 -0
- metadata +34 -40
- data/Rakefile +0 -537
- data/doc/extended_readme.rdoc +0 -49
- data/ext/body/rubygame_body.so +0 -0
- data/ext/rubygame/rubygame_clock.c +0 -301
- data/ext/rubygame/rubygame_clock.h +0 -32
- data/ext/rubygame/rubygame_event.c +0 -760
- data/ext/rubygame/rubygame_event.h +0 -48
- data/ext/rubygame/rubygame_event2.c +0 -661
- data/ext/rubygame/rubygame_event2.h +0 -29
- data/ext/rubygame/rubygame_gfx.c +0 -942
- data/ext/rubygame/rubygame_gfx.h +0 -101
- data/ext/rubygame/rubygame_gl.c +0 -154
- data/ext/rubygame/rubygame_gl.h +0 -32
- data/ext/rubygame/rubygame_image.c +0 -252
- data/ext/rubygame/rubygame_image.h +0 -41
- data/ext/rubygame/rubygame_joystick.c +0 -336
- data/ext/rubygame/rubygame_joystick.h +0 -41
- data/ext/rubygame/rubygame_main.c +0 -158
- data/ext/rubygame/rubygame_main.h +0 -36
- data/ext/rubygame/rubygame_mixer.c +0 -1024
- data/ext/rubygame/rubygame_mixer.h +0 -36
- data/ext/rubygame/rubygame_music.c +0 -1017
- data/ext/rubygame/rubygame_music.h +0 -29
- data/ext/rubygame/rubygame_screen.c +0 -572
- data/ext/rubygame/rubygame_screen.h +0 -45
- data/ext/rubygame/rubygame_shared.c +0 -269
- data/ext/rubygame/rubygame_shared.h +0 -69
- data/ext/rubygame/rubygame_sound.c +0 -863
- data/ext/rubygame/rubygame_sound.h +0 -29
- data/ext/rubygame/rubygame_surface.c +0 -1153
- data/ext/rubygame/rubygame_surface.h +0 -62
- data/ext/rubygame/rubygame_ttf.c +0 -599
- data/ext/rubygame/rubygame_ttf.h +0 -69
- data/samples/keys.rb +0 -52
data/samples/demo_sfont.rb
CHANGED
data/samples/demo_ttf.rb
CHANGED
@@ -142,7 +142,7 @@ def test_iu_aa(font,screen,y)
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def main
|
145
|
-
screen = Screen.
|
145
|
+
screen = Screen.open([300,300])
|
146
146
|
queue = EventQueue.new()
|
147
147
|
queue.ignore = SDL_EVENTS - [QuitEvent, KeyDownEvent]
|
148
148
|
|
@@ -191,3 +191,5 @@ def main
|
|
191
191
|
end
|
192
192
|
|
193
193
|
main()
|
194
|
+
|
195
|
+
Rubygame.quit
|
data/samples/demo_utf8.rb
CHANGED
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# A basic image viewer demo for Rubygame.
|
4
|
+
#
|
5
|
+
# Usage: Pass an image file to this script to display it. To quit,
|
6
|
+
# press Q or Escape, right click, or close the window.
|
7
|
+
#
|
8
|
+
# Author: John Croisant
|
9
|
+
# Date: 2009-10-18
|
10
|
+
# License: You may use this code however you want. No warranty.
|
11
|
+
#
|
12
|
+
|
13
|
+
|
14
|
+
# Load Rubygame and include Rubygame and Rubygame::Events
|
15
|
+
# in the current namespace, for convenience.
|
16
|
+
#
|
17
|
+
require "rubygame"
|
18
|
+
include Rubygame
|
19
|
+
include Rubygame::Events
|
20
|
+
|
21
|
+
|
22
|
+
# Initialize Rubygame, and clean up when script exits.
|
23
|
+
Rubygame.init
|
24
|
+
at_exit { Rubygame.quit }
|
25
|
+
|
26
|
+
|
27
|
+
# Decide which image file to load.
|
28
|
+
this_dir = File.dirname( __FILE__ )
|
29
|
+
file = File.expand_path( "rubygame.png", this_dir ) # default file
|
30
|
+
if ARGV[0]
|
31
|
+
file = File.expand_path( ARGV[0], this_dir )
|
32
|
+
else
|
33
|
+
puts "You can pass an script to this file to load it."
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Wrap this code in a "begin/rescue" block to recover from errors if
|
38
|
+
# the image cannot be loaded.
|
39
|
+
#
|
40
|
+
begin
|
41
|
+
|
42
|
+
# Load the image
|
43
|
+
image = Surface.load( file )
|
44
|
+
|
45
|
+
# Open a new Rubygame window to fit the image.
|
46
|
+
screen = Screen.open( image.size )
|
47
|
+
screen.title = File.basename(file)
|
48
|
+
|
49
|
+
# Blit ("paste") the image onto the screen.
|
50
|
+
image.blit( screen, [0,0] )
|
51
|
+
|
52
|
+
rescue SDLError, NoMethodError
|
53
|
+
|
54
|
+
# Oops, load failed.
|
55
|
+
puts "#{File.basename($0)}: Could not load image: #{file}"
|
56
|
+
|
57
|
+
# Open a new Rubygame window
|
58
|
+
screen = Screen.open( [200,200] )
|
59
|
+
screen.title = "Load Error"
|
60
|
+
|
61
|
+
# Fill with white
|
62
|
+
screen.fill( :white )
|
63
|
+
|
64
|
+
# Thick red line from top left to bottom right.
|
65
|
+
# Point [0,0] is the top left corner of the screen,
|
66
|
+
# [200,200] is bottom right.
|
67
|
+
#
|
68
|
+
screen.draw_polygon_s( [[ -5, 5], [ 5, -5],
|
69
|
+
[205, 195], [195, 205]], :red )
|
70
|
+
|
71
|
+
# Now from top right to bottom left.
|
72
|
+
screen.draw_polygon_s( [[195, -5], [205, 5],
|
73
|
+
[ 5, 205], [ -5, 195]], :red )
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# Set up an event handler to listen for events:
|
79
|
+
#
|
80
|
+
# - Q or Escape keys press
|
81
|
+
# - Right mouse click inside the window
|
82
|
+
# - Window close button press
|
83
|
+
#
|
84
|
+
# When any of these events occurs, the "exit_script" method is called.
|
85
|
+
#
|
86
|
+
class MyHandler
|
87
|
+
include Rubygame::EventHandler::HasEventHandler
|
88
|
+
end
|
89
|
+
|
90
|
+
handler = MyHandler.new
|
91
|
+
handler.make_magic_hooks( :q => :exit_script,
|
92
|
+
:escape => :exit_script,
|
93
|
+
:mouse_right => :exit_script,
|
94
|
+
QuitRequested => :exit_script )
|
95
|
+
|
96
|
+
def exit_script
|
97
|
+
exit
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
# Repeat this code until the user quits.
|
102
|
+
loop do
|
103
|
+
|
104
|
+
# Fetch the user input events from SDL.
|
105
|
+
events = Rubygame::Events.fetch_sdl_events
|
106
|
+
|
107
|
+
# Pass each input to the event handler to check.
|
108
|
+
events.each do |event|
|
109
|
+
handler.handle( event )
|
110
|
+
end
|
111
|
+
|
112
|
+
# Refresh the screen
|
113
|
+
screen.update
|
114
|
+
|
115
|
+
# Pause for a while before checking for more events.
|
116
|
+
sleep 0.1
|
117
|
+
|
118
|
+
end
|
data/samples/load_and_blit.rb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubygame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Croisant
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-24 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,18 +22,29 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 0.7.0
|
24
24
|
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ruby-sdl-ffi
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.0
|
34
|
+
version:
|
25
35
|
description:
|
26
36
|
email: jacius@gmail.com
|
27
37
|
executables: []
|
28
38
|
|
29
|
-
extensions:
|
30
|
-
|
39
|
+
extensions: []
|
40
|
+
|
31
41
|
extra_rdoc_files:
|
32
42
|
- doc/windows_install.rdoc
|
43
|
+
- doc/custom_sdl_load_paths.rdoc
|
44
|
+
- doc/keyboard_symbols.rdoc
|
33
45
|
- doc/macosx_install.rdoc
|
34
46
|
- doc/managing_framerate.rdoc
|
35
47
|
- doc/getting_started.rdoc
|
36
|
-
- doc/extended_readme.rdoc
|
37
48
|
- README
|
38
49
|
- LICENSE
|
39
50
|
- CREDITS
|
@@ -41,9 +52,13 @@ extra_rdoc_files:
|
|
41
52
|
- NEWS
|
42
53
|
files:
|
43
54
|
- lib/rubygame.rb
|
55
|
+
- lib/rubygame/main.rb
|
44
56
|
- lib/rubygame/ftor.rb
|
57
|
+
- lib/rubygame/sound.rb
|
58
|
+
- lib/rubygame/screen.rb
|
45
59
|
- lib/rubygame/clock.rb
|
46
60
|
- lib/rubygame/constants.rb
|
61
|
+
- lib/rubygame/mixer.rb
|
47
62
|
- lib/rubygame/color/models/rgb.rb
|
48
63
|
- lib/rubygame/color/models/hsl.rb
|
49
64
|
- lib/rubygame/color/models/hsv.rb
|
@@ -53,18 +68,25 @@ files:
|
|
53
68
|
- lib/rubygame/color/palettes/x11.rb
|
54
69
|
- lib/rubygame/event.rb
|
55
70
|
- lib/rubygame/event_actions.rb
|
71
|
+
- lib/rubygame/joystick.rb
|
56
72
|
- lib/rubygame/events.rb
|
57
73
|
- lib/rubygame/rect.rb
|
58
74
|
- lib/rubygame/mediabag.rb
|
59
75
|
- lib/rubygame/color.rb
|
60
76
|
- lib/rubygame/sprite.rb
|
61
77
|
- lib/rubygame/event_triggers.rb
|
78
|
+
- lib/rubygame/music.rb
|
79
|
+
- lib/rubygame/surface.rb
|
62
80
|
- lib/rubygame/named_resource.rb
|
63
81
|
- lib/rubygame/keyconstants.rb
|
64
82
|
- lib/rubygame/hotspot.rb
|
83
|
+
- lib/rubygame/ttf.rb
|
65
84
|
- lib/rubygame/sfont.rb
|
85
|
+
- lib/rubygame/gl.rb
|
66
86
|
- lib/rubygame/queue.rb
|
87
|
+
- lib/rubygame/image.rb
|
67
88
|
- lib/rubygame/shared.rb
|
89
|
+
- lib/rubygame/audio.rb
|
68
90
|
- lib/rubygame/event_hook.rb
|
69
91
|
- lib/rubygame/event_handler.rb
|
70
92
|
- lib/rubygame/events/keyboard_events.rb
|
@@ -72,37 +94,8 @@ files:
|
|
72
94
|
- lib/rubygame/events/misc_events.rb
|
73
95
|
- lib/rubygame/events/mouse_events.rb
|
74
96
|
- lib/rubygame/events/clock_events.rb
|
75
|
-
-
|
76
|
-
-
|
77
|
-
- ext/rubygame/rubygame_ttf.h
|
78
|
-
- ext/rubygame/rubygame_main.c
|
79
|
-
- ext/rubygame/rubygame_joystick.h
|
80
|
-
- ext/rubygame/rubygame_clock.h
|
81
|
-
- ext/rubygame/rubygame_music.h
|
82
|
-
- ext/rubygame/rubygame_gfx.h
|
83
|
-
- ext/rubygame/rubygame_shared.c
|
84
|
-
- ext/rubygame/rubygame_music.c
|
85
|
-
- ext/rubygame/rubygame_gl.h
|
86
|
-
- ext/rubygame/rubygame_screen.c
|
87
|
-
- ext/rubygame/rubygame_event2.c
|
88
|
-
- ext/rubygame/rubygame_sound.c
|
89
|
-
- ext/rubygame/rubygame_shared.h
|
90
|
-
- ext/rubygame/rubygame_image.h
|
91
|
-
- ext/rubygame/rubygame_surface.h
|
92
|
-
- ext/rubygame/rubygame_screen.h
|
93
|
-
- ext/rubygame/rubygame_event2.h
|
94
|
-
- ext/rubygame/rubygame_joystick.c
|
95
|
-
- ext/rubygame/rubygame_sound.h
|
96
|
-
- ext/rubygame/rubygame_clock.c
|
97
|
-
- ext/rubygame/rubygame_surface.c
|
98
|
-
- ext/rubygame/rubygame_main.h
|
99
|
-
- ext/rubygame/rubygame_gfx.c
|
100
|
-
- ext/rubygame/rubygame_event.c
|
101
|
-
- ext/rubygame/rubygame_ttf.c
|
102
|
-
- ext/rubygame/rubygame_gl.c
|
103
|
-
- ext/rubygame/rubygame_mixer.h
|
104
|
-
- ext/rubygame/rubygame_image.c
|
105
|
-
- ext/body/rubygame_body.so
|
97
|
+
- lib/rubygame/gfx.rb
|
98
|
+
- lib/rubygame/deprecated_mixer.rb
|
106
99
|
- samples/demo_utf8.rb
|
107
100
|
- samples/README
|
108
101
|
- samples/song.ogg
|
@@ -111,26 +104,28 @@ files:
|
|
111
104
|
- samples/whiff.wav
|
112
105
|
- samples/framerate.rb
|
113
106
|
- samples/demo_rubygame.rb
|
107
|
+
- samples/rubygame.png
|
114
108
|
- samples/demo_gl.rb
|
115
109
|
- samples/chimp.bmp
|
116
110
|
- samples/term16.png
|
117
111
|
- samples/demo_draw.rb
|
118
112
|
- samples/chimp.rb
|
119
113
|
- samples/demo_ttf.rb
|
120
|
-
- samples/keys.rb
|
121
114
|
- samples/panda.png
|
122
115
|
- samples/punch.wav
|
123
116
|
- samples/FreeSans.ttf
|
124
117
|
- samples/demo_sfont.rb
|
118
|
+
- samples/image_viewer.rb
|
125
119
|
- samples/demo_gl_tex.rb
|
126
120
|
- samples/ruby.png
|
127
121
|
- samples/load_and_blit.rb
|
128
122
|
- samples/fist.bmp
|
129
123
|
- doc/windows_install.rdoc
|
124
|
+
- doc/custom_sdl_load_paths.rdoc
|
125
|
+
- doc/keyboard_symbols.rdoc
|
130
126
|
- doc/macosx_install.rdoc
|
131
127
|
- doc/managing_framerate.rdoc
|
132
128
|
- doc/getting_started.rdoc
|
133
|
-
- doc/extended_readme.rdoc
|
134
129
|
- README
|
135
130
|
- LICENSE
|
136
131
|
- CREDITS
|
@@ -146,7 +141,6 @@ rdoc_options: []
|
|
146
141
|
require_paths:
|
147
142
|
- lib
|
148
143
|
- lib/rubygame/
|
149
|
-
- ext/rubygame/
|
150
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
151
145
|
requirements:
|
152
146
|
- - ">="
|
@@ -166,7 +160,7 @@ requirements:
|
|
166
160
|
- SDL_mixer >= 1.2.7 (optional)
|
167
161
|
- SDL_ttf >= 2.0.6 (optional)
|
168
162
|
rubyforge_project: rubygame
|
169
|
-
rubygems_version: 1.3.
|
163
|
+
rubygems_version: 1.3.5
|
170
164
|
signing_key:
|
171
165
|
specification_version: 3
|
172
166
|
summary: Clean and powerful library for game programming
|
data/Rakefile
DELETED
@@ -1,537 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This is the Rakefile for Rubygame. It's used for
|
3
|
-
# compiling, packaging, installing generating the
|
4
|
-
# documentation, and running specs.
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
# The version number for Rubygame.
|
9
|
-
RUBYGAME_VERSION = [2,5,3]
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
# The following terms (the MIT license) apply to this Rakefile:
|
14
|
-
#
|
15
|
-
# Copyright (c) 2008 John Croisant
|
16
|
-
#
|
17
|
-
# Permission is hereby granted, free of charge, to any person
|
18
|
-
# obtaining a copy of this software and associated documentation files
|
19
|
-
# (the "Software"), to deal in the Software without restriction,
|
20
|
-
# including without limitation the rights to use, copy, modify, merge,
|
21
|
-
# publish, distribute, sublicense, and/or sell copies of the Software,
|
22
|
-
# and to permit persons to whom the Software is furnished to do so,
|
23
|
-
# subject to the following conditions:
|
24
|
-
#
|
25
|
-
# The above copyright notice and this permission notice shall be
|
26
|
-
# included in all copies or substantial portions of the Software.
|
27
|
-
#
|
28
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
29
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
30
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
31
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
32
|
-
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
33
|
-
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
34
|
-
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
35
|
-
# SOFTWARE.
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
require 'rubygems'
|
40
|
-
|
41
|
-
require 'rake'
|
42
|
-
require 'rake/gempackagetask'
|
43
|
-
require 'rake/rdoctask'
|
44
|
-
|
45
|
-
require "rbconfig"
|
46
|
-
include Config
|
47
|
-
|
48
|
-
require 'English'
|
49
|
-
|
50
|
-
class ShellCommandError < RuntimeError
|
51
|
-
end
|
52
|
-
|
53
|
-
# Execute the shell command and raise ShellCommandError if
|
54
|
-
# the command failed.
|
55
|
-
#
|
56
|
-
# If verbose is true, outputs the command string to the console.
|
57
|
-
# If it's false, it outputs the pretty string to the console instead.
|
58
|
-
#
|
59
|
-
def try_shell( command, pretty="", verbose=false )
|
60
|
-
if verbose
|
61
|
-
puts command
|
62
|
-
else
|
63
|
-
puts pretty unless pretty.empty?
|
64
|
-
end
|
65
|
-
|
66
|
-
result = `#{command}`
|
67
|
-
|
68
|
-
unless $CHILD_STATUS.exitstatus == 0
|
69
|
-
raise ShellCommandError, "Command failed. Aborting."
|
70
|
-
end
|
71
|
-
|
72
|
-
return result
|
73
|
-
end
|
74
|
-
|
75
|
-
def try_sdl_config( flag )
|
76
|
-
begin
|
77
|
-
if $options[:"sdl-config"]
|
78
|
-
return try_shell("sdl-config #{flag}").chomp
|
79
|
-
else
|
80
|
-
return String.new
|
81
|
-
end
|
82
|
-
rescue ShellCommandError
|
83
|
-
warn "WARNING: 'sdl-config' failed."
|
84
|
-
warn "Continuing anyway, but compile may fail."
|
85
|
-
return String.new
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Get a variable from ENV or CONFIG, with ENV having precedence.
|
90
|
-
# Returns "" if the variable didn't exist at all.
|
91
|
-
def from_env_or_config(string)
|
92
|
-
([ENV[string], CONFIG[string]] - ["", nil])[0] or ""
|
93
|
-
end
|
94
|
-
|
95
|
-
OBJEXT = from_env_or_config("OBJEXT")
|
96
|
-
DLEXT = from_env_or_config("DLEXT")
|
97
|
-
|
98
|
-
gem_spec = Gem::Specification.new do |s|
|
99
|
-
s.name = "rubygame"
|
100
|
-
s.version = RUBYGAME_VERSION.join(".")
|
101
|
-
s.author = "John Croisant"
|
102
|
-
s.email = "jacius@gmail.com"
|
103
|
-
s.homepage = "http://rubygame.org/"
|
104
|
-
s.summary = "Clean and powerful library for game programming"
|
105
|
-
s.has_rdoc = true
|
106
|
-
s.rubyforge_project = "rubygame"
|
107
|
-
|
108
|
-
s.files = FileList.new do |fl|
|
109
|
-
fl.include("{lib,ext,samples,doc}/**/*")
|
110
|
-
fl.exclude(/svn/)
|
111
|
-
#fl.exclude(/\.#{OBJEXT}/)
|
112
|
-
end
|
113
|
-
|
114
|
-
s.require_paths = ["lib", "lib/rubygame/", "ext/rubygame/"]
|
115
|
-
s.extensions = ["Rakefile"]
|
116
|
-
|
117
|
-
s.extra_rdoc_files = FileList.new do |fl|
|
118
|
-
fl.include "doc/*.rdoc"
|
119
|
-
fl.include "README", "LICENSE", "CREDITS", "ROADMAP", "NEWS"
|
120
|
-
end
|
121
|
-
|
122
|
-
s.required_ruby_version = ">= 1.8"
|
123
|
-
s.add_dependency( "rake", ">=0.7.0" )
|
124
|
-
s.requirements = ["SDL >= 1.2.7",
|
125
|
-
"SDL_gfx >= 2.0.10 (optional)",
|
126
|
-
"SDL_image >= 1.2.3 (optional)",
|
127
|
-
"SDL_mixer >= 1.2.7 (optional)",
|
128
|
-
"SDL_ttf >= 2.0.6 (optional)"]
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
task :binary do
|
133
|
-
gem_spec.platform = Gem::Platform::CURRENT
|
134
|
-
end
|
135
|
-
|
136
|
-
Rake::GemPackageTask.new(gem_spec) do |pkg|
|
137
|
-
pkg.need_tar_bz2 = true
|
138
|
-
end
|
139
|
-
|
140
|
-
Rake::RDocTask.new do |rd|
|
141
|
-
rd.main = "README"
|
142
|
-
rd.title = "Rubygame #{RUBYGAME_VERSION.join(".")} Docs"
|
143
|
-
rd.rdoc_files.include("ext/rubygame/*.c",
|
144
|
-
"lib/rubygame/**/*.rb",
|
145
|
-
"doc/*.rdoc",
|
146
|
-
"README",
|
147
|
-
"LICENSE",
|
148
|
-
"CREDITS",
|
149
|
-
"ROADMAP",
|
150
|
-
"NEWS")
|
151
|
-
end
|
152
|
-
|
153
|
-
task :default => [:build]
|
154
|
-
desc "Compile all of the extensions"
|
155
|
-
task :build
|
156
|
-
|
157
|
-
require 'rake/clean'
|
158
|
-
task(:clean) { puts "Cleaning out temporary generated files" }
|
159
|
-
task(:clobber) { puts "Cleaning out final generated files" }
|
160
|
-
|
161
|
-
##############################
|
162
|
-
## BUILD OPTIONS ##
|
163
|
-
##############################
|
164
|
-
|
165
|
-
$options = {
|
166
|
-
:"sdl-gfx" => true,
|
167
|
-
:"sdl-image" => true,
|
168
|
-
:"sdl-ttf" => true,
|
169
|
-
:"sdl-mixer" => true,
|
170
|
-
:opengl => true,
|
171
|
-
:"sdl-config" => true,
|
172
|
-
:universal => false,
|
173
|
-
:debug => false,
|
174
|
-
:verbose => false,
|
175
|
-
:sitearchdir => CONFIG["sitearchdir"],
|
176
|
-
:sitelibdir => CONFIG["sitelibdir"]
|
177
|
-
}
|
178
|
-
|
179
|
-
# Default behavior for win32 is to skip sdl_config,
|
180
|
-
# since it's usually not available. It can still be
|
181
|
-
# enabled through the options, though.
|
182
|
-
if RUBY_PLATFORM =~ /win32/
|
183
|
-
$options[:"sdl-config"] = false
|
184
|
-
end
|
185
|
-
|
186
|
-
# Define tasks to enable and disable bool options.
|
187
|
-
#
|
188
|
-
# rake option
|
189
|
-
# rake no-option
|
190
|
-
#
|
191
|
-
# task_name:: the task name to use
|
192
|
-
# option_name:: the option name (if different from
|
193
|
-
# the task name)
|
194
|
-
# desc:: a longer description, to fill
|
195
|
-
# "Enable ________.", if different
|
196
|
-
# from the task name.
|
197
|
-
#
|
198
|
-
def bool_option( task_name, option_name=nil, desc=nil )
|
199
|
-
option_name = task_name unless option_name
|
200
|
-
option_name = option_name.intern if option_name.kind_of? String
|
201
|
-
|
202
|
-
desc = task_name.to_s unless desc
|
203
|
-
|
204
|
-
notask_name = "no-#{task_name.to_s}".intern
|
205
|
-
|
206
|
-
is_true = $options[option_name]
|
207
|
-
|
208
|
-
desc "Enable #{desc} #{'(default)' if is_true}"
|
209
|
-
task(task_name) { $options[option_name] = true }
|
210
|
-
|
211
|
-
desc "Disable #{desc} #{'(default)' unless is_true}"
|
212
|
-
task(notask_name) { $options[option_name] = false }
|
213
|
-
end
|
214
|
-
|
215
|
-
# Gather a string option from an environment variable:
|
216
|
-
#
|
217
|
-
# rake option="the value of the option"
|
218
|
-
#
|
219
|
-
# task_name:: the task name to use
|
220
|
-
# option_name:: the option name (if different from
|
221
|
-
# the task name)
|
222
|
-
#
|
223
|
-
def string_option( task_name, option_name=nil )
|
224
|
-
option_name = task_name unless option_name
|
225
|
-
option_name = option_name.intern if option_name.kind_of? String
|
226
|
-
|
227
|
-
$options[option_name] = ENV["#{task_name}"] if ENV["#{task_name}"]
|
228
|
-
end
|
229
|
-
|
230
|
-
bool_option :"sdl-gfx", nil, "SDL_gfx support"
|
231
|
-
bool_option :"sdl-image", nil, "SDL_image support"
|
232
|
-
bool_option :"sdl-mixer", nil, "SDL_mixer support"
|
233
|
-
bool_option :"sdl-ttf", nil, "SDL_ttf support"
|
234
|
-
bool_option :"sdl-config", nil, "guess compiler flags for SDL"
|
235
|
-
bool_option :opengl, nil, "OpenGL support"
|
236
|
-
bool_option :debug, nil, "compile with debug symbols"
|
237
|
-
bool_option :verbose, nil, "show compiler commands"
|
238
|
-
bool_option :universal, nil, "universal binary (MacOS X Intel)"
|
239
|
-
|
240
|
-
string_option "RUBYARCHDIR", :sitearchdir
|
241
|
-
string_option :sitearchdir
|
242
|
-
|
243
|
-
string_option "RUBYLIBDIR", :sitelibdir
|
244
|
-
string_option :sitelibdir
|
245
|
-
|
246
|
-
|
247
|
-
CFLAGS = [from_env_or_config("CFLAGS"),
|
248
|
-
try_sdl_config("--cflags"),
|
249
|
-
"-I. -I#{CONFIG['topdir']}",
|
250
|
-
(if CONFIG['rubyhdrdir']
|
251
|
-
"-I#{CONFIG['rubyhdrdir']} " +\
|
252
|
-
"-I#{File.join(CONFIG['rubyhdrdir'], CONFIG['arch'])}"
|
253
|
-
end),
|
254
|
-
"-DRUBYGAME_MAJOR_VERSION=#{RUBYGAME_VERSION[0]}",
|
255
|
-
"-DRUBYGAME_MINOR_VERSION=#{RUBYGAME_VERSION[1]}",
|
256
|
-
"-DRUBYGAME_PATCHLEVEL=#{RUBYGAME_VERSION[2]}"
|
257
|
-
].join(" ")
|
258
|
-
|
259
|
-
LINK_FLAGS = [from_env_or_config("LIBRUBYARG_SHARED"),
|
260
|
-
from_env_or_config("LDFLAGS"),
|
261
|
-
try_sdl_config("--libs")].join(" ")
|
262
|
-
|
263
|
-
DEFAULT_EXTDIR = File.join('ext','rubygame','')
|
264
|
-
|
265
|
-
class ExtensionModule
|
266
|
-
@@libflag = " -l%s " # compiler flag for giving linked libraries
|
267
|
-
attr_accessor :dynlib, :objs, :libs, :cflags, :lflags, :directory
|
268
|
-
def initialize(&block)
|
269
|
-
@directory = DEFAULT_EXTDIR
|
270
|
-
@dynlib = ""
|
271
|
-
@objs = []
|
272
|
-
@libs = []
|
273
|
-
@lflags = ""
|
274
|
-
yield self if block_given?
|
275
|
-
end
|
276
|
-
|
277
|
-
def add_lib( lib )
|
278
|
-
@lflags << @@libflag%lib
|
279
|
-
end
|
280
|
-
|
281
|
-
def add_header( header )
|
282
|
-
#CFLAGS << " -DHAVE_#{header.upcase.gsub('.','_')} "
|
283
|
-
end
|
284
|
-
|
285
|
-
def create_all_tasks()
|
286
|
-
create_obj_task
|
287
|
-
create_dl_task
|
288
|
-
CLEAN.include("#{@directory}/*.#{OBJEXT}")
|
289
|
-
CLOBBER.include("#{@directory}/*.#{DLEXT}")
|
290
|
-
end
|
291
|
-
|
292
|
-
# Create a file task for each dynamic library (.so) we want to generate.
|
293
|
-
#
|
294
|
-
# The file task invokes another task which does the actual compiling, and
|
295
|
-
# has the true prerequisites.
|
296
|
-
#
|
297
|
-
# This is done so that the prerequisites don't have to be compiled when
|
298
|
-
# the final product already exists (such as in the precompiled win32 gem).
|
299
|
-
#
|
300
|
-
def create_dl_task
|
301
|
-
dynlib_full = File.join( @directory, "#{dynlib}.#{DLEXT}" )
|
302
|
-
objs_full = @objs.collect { |obj|
|
303
|
-
File.join( @directory, "#{obj}.#{OBJEXT}" )
|
304
|
-
}
|
305
|
-
|
306
|
-
desc "Compile the #{@dynlib} extension"
|
307
|
-
file dynlib_full => objs_full do |task|
|
308
|
-
|
309
|
-
link_command = "#{from_env_or_config('LDSHARED')} #{LINK_FLAGS} #{@lflags} -o #{dynlib_full} #{task.prerequisites.join(' ')}"
|
310
|
-
|
311
|
-
|
312
|
-
# If link command includes i386 arch, and we're not allowing universal
|
313
|
-
if( /-arch i386/ === link_command and not $options[:universal] )
|
314
|
-
# Strip "-arch ppc" to prevent building a universal binary.
|
315
|
-
link_command.gsub!("-arch ppc","")
|
316
|
-
end
|
317
|
-
|
318
|
-
try_shell( link_command,
|
319
|
-
"Linking compiled files to create #{File.basename(@directory)}/#{File.basename(dynlib_full)}",
|
320
|
-
$options[:verbose] )
|
321
|
-
end
|
322
|
-
|
323
|
-
task :build => [dynlib_full] # Add this as a prereq of the build
|
324
|
-
task :install_ext => [dynlib_full] # ...and install_ext tasks
|
325
|
-
end
|
326
|
-
|
327
|
-
def create_obj_task
|
328
|
-
# A rule for object files (".o" on linux).
|
329
|
-
# This won't work for rake < 0.7.2, because the proc returns an Array.
|
330
|
-
# If it raises an exception, we'll try a more compatible way.
|
331
|
-
rule(/#{@directory}.+\.#{OBJEXT}$/ =>
|
332
|
-
[
|
333
|
-
# Generate dependencies for this .o file
|
334
|
-
proc do |objfile|
|
335
|
-
source = objfile.sub(".#{OBJEXT}", ".c") # the .c file
|
336
|
-
[source] + depends_headers( source ) # Array of .c + .h dependencies
|
337
|
-
end
|
338
|
-
])\
|
339
|
-
do |t|
|
340
|
-
|
341
|
-
compile_command = "#{from_env_or_config('CC')} -c #{CFLAGS} #{"-g " if $options[:debug]} #{t.source} -o #{t.name}"
|
342
|
-
|
343
|
-
# If compile command includes i386 arch, and we're not allowing universal
|
344
|
-
if( /-arch i386/ === compile_command and not $options[:universal] )
|
345
|
-
# Strip "-arch ppc" to prevent building a universal binary.
|
346
|
-
compile_command.gsub!("-arch ppc","")
|
347
|
-
end
|
348
|
-
|
349
|
-
try_shell( compile_command,
|
350
|
-
"Compiling #{File.basename(@directory)}/#{File.basename(t.source)}",
|
351
|
-
$options[:verbose] )
|
352
|
-
end
|
353
|
-
rescue
|
354
|
-
# Generate a .o rule for each .c file in the directory.
|
355
|
-
FileList.new("#{@directory}*.c").each do |source|
|
356
|
-
object = source.sub(".c", ".#{OBJEXT}")
|
357
|
-
file object => ([source] + depends_headers( source )) do |t|
|
358
|
-
compile_command = "#{CONFIG['CC']} -c #{CFLAGS} #{"-g " if $options[:debug]} #{source} -o #{t.name}"
|
359
|
-
|
360
|
-
try_shell( compile_command,
|
361
|
-
"Compiling #{File.basename(@directory)}/#{File.basename(t.source)}",
|
362
|
-
$options[:verbose] )
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
# Extracts the names of all the headers that the C file depends on.
|
368
|
-
def depends_headers( filename )
|
369
|
-
return [] # workaround for a bug
|
370
|
-
depends = []
|
371
|
-
File.open(filename, "r") do |file|
|
372
|
-
file.each_line do |line|
|
373
|
-
if /#include\s+"(\w+\.h)"/ =~ line
|
374
|
-
depends << @directory+$1
|
375
|
-
end
|
376
|
-
end
|
377
|
-
end
|
378
|
-
return depends
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
rubygame_core = ExtensionModule.new do |core|
|
383
|
-
core.dynlib = 'rubygame_core'
|
384
|
-
core.objs = ['rubygame_main',
|
385
|
-
'rubygame_shared',
|
386
|
-
'rubygame_event',
|
387
|
-
'rubygame_event2',
|
388
|
-
'rubygame_gl',
|
389
|
-
'rubygame_joystick',
|
390
|
-
'rubygame_screen',
|
391
|
-
'rubygame_surface',
|
392
|
-
'rubygame_clock',
|
393
|
-
]
|
394
|
-
core.create_all_tasks()
|
395
|
-
end
|
396
|
-
|
397
|
-
# TODO: We should check if the libraries exist?
|
398
|
-
|
399
|
-
rubygame_gfx = ExtensionModule.new do |gfx|
|
400
|
-
gfx.dynlib = 'rubygame_gfx'
|
401
|
-
gfx.objs = ['rubygame_shared', 'rubygame_gfx']
|
402
|
-
gfx.add_lib( 'SDL_gfx' )
|
403
|
-
gfx.add_header( 'SDL_gfxPrimitives.h')
|
404
|
-
gfx.add_header( 'SDL_rotozoom.h' )
|
405
|
-
gfx.create_all_tasks() if $options[:"sdl-gfx"]
|
406
|
-
end
|
407
|
-
|
408
|
-
rubygame_image = ExtensionModule.new do |image|
|
409
|
-
image.dynlib = 'rubygame_image'
|
410
|
-
image.objs = ['rubygame_shared', 'rubygame_image']
|
411
|
-
image.add_lib('SDL_image')
|
412
|
-
image.add_header('SDL_image.h')
|
413
|
-
image.create_all_tasks() if $options[:"sdl-image"]
|
414
|
-
end
|
415
|
-
|
416
|
-
rubygame_mixer = ExtensionModule.new do |mixer|
|
417
|
-
mixer.dynlib = 'rubygame_mixer'
|
418
|
-
mixer.objs = ['rubygame_shared', 'rubygame_mixer', 'rubygame_sound', 'rubygame_music']
|
419
|
-
mixer.add_lib('SDL_mixer')
|
420
|
-
mixer.add_header('SDL_mixer.h')
|
421
|
-
mixer.create_all_tasks() if $options[:"sdl-mixer"]
|
422
|
-
end
|
423
|
-
|
424
|
-
rubygame_ttf = ExtensionModule.new do |ttf|
|
425
|
-
ttf.dynlib = 'rubygame_ttf'
|
426
|
-
ttf.add_lib('SDL_ttf')
|
427
|
-
ttf.objs = ['rubygame_shared', 'rubygame_ttf']
|
428
|
-
ttf.add_header('SDL_ttf.h')
|
429
|
-
ttf.create_all_tasks() if $options[:"sdl-ttf"]
|
430
|
-
end
|
431
|
-
|
432
|
-
if $options[:opengl]
|
433
|
-
CFLAGS << " -DHAVE_OPENGL "
|
434
|
-
end
|
435
|
-
|
436
|
-
desc "(Called when installing via Rubygems)"
|
437
|
-
task :extension => [:fix_filenames, :build]
|
438
|
-
|
439
|
-
task :fix_filenames do
|
440
|
-
unless DLEXT == 'so'
|
441
|
-
Rake::Task[:install_ext].prerequisites.each do |prereq|
|
442
|
-
prereq = prereq.ext('so')
|
443
|
-
if File.exist? prereq
|
444
|
-
mv prereq, prereq.ext(DLEXT)
|
445
|
-
end
|
446
|
-
end
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
desc "Install just the extensions"
|
451
|
-
task :install_ext do |task|
|
452
|
-
puts "Installing extensions to #{$options[:sitearchdir]}"
|
453
|
-
mkdir_p $options[:sitearchdir]
|
454
|
-
cp task.prerequisites.to_a, $options[:sitearchdir]
|
455
|
-
end
|
456
|
-
|
457
|
-
desc "Install just the library"
|
458
|
-
task :install_lib do |task|
|
459
|
-
puts "Installing library to #{$options[:sitelibdir]}"
|
460
|
-
|
461
|
-
files = FileList.new do |fl|
|
462
|
-
fl.include("lib/**/*.rb")
|
463
|
-
fl.exclude(/svn/)
|
464
|
-
end
|
465
|
-
|
466
|
-
files.each do |f|
|
467
|
-
dir = File.join($options[:sitelibdir], File.dirname(f).sub('lib',''), "")
|
468
|
-
mkdir_p dir
|
469
|
-
cp f, dir
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
|
-
desc "Install both the extensions and the library"
|
474
|
-
task :install => [:install_ext, :install_lib]
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
#########
|
479
|
-
# SPECS #
|
480
|
-
#########
|
481
|
-
|
482
|
-
begin
|
483
|
-
require 'spec/rake/spectask'
|
484
|
-
|
485
|
-
|
486
|
-
desc "Run all specs"
|
487
|
-
Spec::Rake::SpecTask.new do |t|
|
488
|
-
t.spec_files = FileList['spec/*_spec.rb']
|
489
|
-
end
|
490
|
-
|
491
|
-
|
492
|
-
namespace :spec do
|
493
|
-
desc "Run all specs"
|
494
|
-
Spec::Rake::SpecTask.new(:all) do |t|
|
495
|
-
t.spec_files = FileList['spec/*_spec.rb']
|
496
|
-
end
|
497
|
-
|
498
|
-
desc "Run spec/[name]_spec.rb (e.g. 'color')"
|
499
|
-
task :name do
|
500
|
-
puts( "This is just a stand-in spec.",
|
501
|
-
"Run rake spec:[name] where [name] is e.g. 'color', 'music'." )
|
502
|
-
end
|
503
|
-
end
|
504
|
-
|
505
|
-
|
506
|
-
rule(/spec:.+/) do |t|
|
507
|
-
name = t.name.gsub("spec:","")
|
508
|
-
|
509
|
-
path = File.join( File.dirname(__FILE__),'spec','%s_spec.rb'%name )
|
510
|
-
|
511
|
-
if File.exist? path
|
512
|
-
Spec::Rake::SpecTask.new(name) do |t|
|
513
|
-
t.spec_files = [path]
|
514
|
-
end
|
515
|
-
|
516
|
-
puts "\nRunning spec/%s_spec.rb"%name
|
517
|
-
|
518
|
-
Rake::Task[name].invoke
|
519
|
-
else
|
520
|
-
puts "File does not exist: %s"%path
|
521
|
-
end
|
522
|
-
|
523
|
-
end
|
524
|
-
|
525
|
-
rescue LoadError
|
526
|
-
|
527
|
-
error = "ERROR: RSpec is not installed?"
|
528
|
-
|
529
|
-
task :spec do
|
530
|
-
puts error
|
531
|
-
end
|
532
|
-
|
533
|
-
rule( /spec:.*/ ) do
|
534
|
-
puts error
|
535
|
-
end
|
536
|
-
|
537
|
-
end
|