rubygame 2.5.3 → 2.6.0
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.
- 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/doc/windows_install.rdoc
CHANGED
@@ -1,123 +1,51 @@
|
|
1
|
-
|
1
|
+
Note: You can view the latest version of this guide online at the
|
2
|
+
Rubygame wiki: http://rubygame.org/wiki/Windows_Installation_Guide
|
2
3
|
|
3
|
-
|
4
|
-
http://rubygame.wiki.sourceforge.net/win32_compile)
|
4
|
+
== Gather Dependencies
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
what worked and what didn't; just send a message to the {rubygame-users mailing
|
10
|
-
list}[https://sourceforge.net/mail/?group_id=172781]!
|
6
|
+
* {Ruby}[http://www.ruby-lang.org/en/downloads/], the language itself.
|
7
|
+
The easiest option here is the one-click installer. This will
|
8
|
+
install Ruby and a number of useful libraries without any hassle.
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
list}[http://sourceforge.net/mail/?group_id=172781].
|
10
|
+
* {SDL}[http://www.libsdl.org/download-1.2.php].
|
11
|
+
Download the Win32 binary package, e.g. "SDL-1.2.14-win32.zip".
|
15
12
|
|
16
|
-
|
13
|
+
The rest are optional dependencies, but highly recommended. If you
|
14
|
+
don't have them, you won't be able to use certain features of
|
15
|
+
Rubygame.
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
- Grab MinGW-NNN.exe (e.g. MinGW-5.12.exe) from the {downloads page}[http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=82721]
|
21
|
-
and install it. (Note: you might need to expand the "MinGW" section to see
|
22
|
-
the MinGW-NNN.exe files.)
|
23
|
-
- Optional, but recommended: install MSYS-NNNN.exe (e.g. MSYS-1.0.10.exe)
|
24
|
-
from the same page as above. (You might have to expand the MSYS section.)
|
25
|
-
- Add the full path to the compiler executible to your system PATH if it
|
26
|
-
isn't there already. You should be able to type <code>gcc -v</code> at a
|
27
|
-
command line and see a version number.
|
17
|
+
* {SDL_image}[http://www.libsdl.org/projects/SDL_image/].
|
18
|
+
Grab the Win32 binary package, e.g. "SDL_image-1.2.8-win32.zip".
|
28
19
|
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
* {SDL_mixer}[http://www.libsdl.org/projects/SDL_mixer/].
|
21
|
+
Just like before, grab the Win32 binary package, e.g.
|
22
|
+
"SDL_mixer-1.2.9-win32.zip".
|
32
23
|
|
33
|
-
|
34
|
-
|
35
|
-
SDL-devel-1.2.??-VC6.zip file. (The VC6 package is just fine, even though
|
36
|
-
we're using with MinGW to compile.)
|
24
|
+
* {SDL_ttf}[http://www.libsdl.org/projects/SDL_ttf/].
|
25
|
+
Again, get the Win32 binary package, e.g. "SDL_ttf-2.0.9-win32.zip".
|
37
26
|
|
38
|
-
|
39
|
-
|
27
|
+
* {SDL_gfx}[http://www.ferzkopp.net/joomla/content/view/19/14/]
|
28
|
+
({compiled version}[http://download.rubygame.org/files/extras/]).
|
29
|
+
Many thanks to a generous Rubygame user (bmatthew1) for providing a
|
30
|
+
compiled Windows DLL for SDL_gfx!
|
40
31
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
grab the Win32 binary package with 'devel' in the name.
|
45
|
-
- {SDL_ttf}[http://www.libsdl.org/projects/SDL_ttf/]. Again, get the
|
46
|
-
Win32 binary package with 'devel' in the name
|
47
|
-
- {SDL_gfx}[http://www.ferzkopp.net/joomla/content/view/19/14/]. This is
|
48
|
-
the trickiest dependency, because there is currently no official package for
|
49
|
-
a precompiled version of SDL_gfx. If you are able to compile this yourself,
|
50
|
-
great! Otherwise, some nice features of Rubygame have to be disabled;
|
51
|
-
make sure you add the --no-gfx flag when you get to the "Set up environment
|
52
|
-
variables" section, below.
|
32
|
+
Once you have downloaded everything, unzip them and copy the *.dll
|
33
|
+
files into the <code>C:\windows\system32\</code> directory. This will
|
34
|
+
allow the libraries to be detected and loaded by Rubygame.
|
53
35
|
|
54
|
-
|
55
|
-
location on your hard drive. You'll thank yourself later if you use a short
|
56
|
-
path with no spaces in it. For this example, we'll unzip everything under
|
57
|
-
<code>C:\\src\\</code>.
|
36
|
+
== Install Rubygame
|
58
37
|
|
59
|
-
|
60
|
-
<code>C:\\windows\\system32\\</code>.
|
61
|
-
This will allow the libraries to be detected properly later on.
|
38
|
+
The simplest way to install Rubygame is: <code>gem install rubygame</code>
|
62
39
|
|
63
|
-
|
40
|
+
Or you can {download the source from
|
41
|
+
Github}[http://github.com/jacius/rubygame/] and follow the
|
42
|
+
installation instructions in README.
|
64
43
|
|
65
|
-
|
66
|
-
{download page}[http://rubyforge.org/frs/?group_id=5089].
|
67
|
-
If you're feeling adventurous, you could try the in-development code from
|
68
|
-
the {Git repository}[http://github.com/jacius/rubygame].
|
69
|
-
You can decompress the .tar.bz2 file with either MSYS' <code>tar</code>
|
70
|
-
(<code>tar xvjf rubygame-2.0.0.tar.bz2</code>) or a program like
|
71
|
-
{7zip}[http://www.7-zip.org].
|
44
|
+
== Conclusion
|
72
45
|
|
73
|
-
|
74
|
-
<code>
|
46
|
+
If all goes well, you have successfully installed Rubygame. Try to
|
47
|
+
execute <code>require 'rubygame'</code> in an irb session and run the
|
48
|
+
provided samples to ensure that everything is acceptable.
|
75
49
|
|
76
|
-
|
77
|
-
|
78
|
-
Environment variables are used to configure the build process for your
|
79
|
-
system; it helps the compiler to locate the headers and libraries it needs to
|
80
|
-
compile Rubygame.
|
81
|
-
|
82
|
-
Create a text file in your Rubygame directory called "envsetup.bat".
|
83
|
-
In it, use code based on the following to set your variables.
|
84
|
-
Be sure to replace '\src\' (lines 3-7) with the path to where you unpacked
|
85
|
-
the libraries.
|
86
|
-
|
87
|
-
set CC=gcc
|
88
|
-
set CFLAGS=-DHAVE_ISINF -D_MSC_VER=1200
|
89
|
-
set CFLAGS=%CFLAGS% -I \src\SDL-1.2.11\include
|
90
|
-
set CFLAGS=%CFLAGS% -I \src\SDL_gfx-2.0.15
|
91
|
-
set CFLAGS=%CFLAGS% -I \src\SDL_image-1.2.5\include
|
92
|
-
set CFLAGS=%CFLAGS% -I \src\SDL_mixer-1.2.7\include
|
93
|
-
set CFLAGS=%CFLAGS% -I \src\SDL_ttf-2.0.8\include
|
94
|
-
|
95
|
-
set LDSHARED=gcc -shared
|
96
|
-
set LINK_FLAGS=-L \windows\system32 -lSDL
|
97
|
-
set LIBRUBYARG_SHARED=-L \ruby\bin -lmsvcrt-ruby18
|
98
|
-
|
99
|
-
The -L parameter for LIBRUBYARG_SHARED may be different if you installed
|
100
|
-
Ruby to a path other than C:/ruby.
|
101
|
-
|
102
|
-
== Step 4: Compile and install Rubygame
|
103
|
-
|
104
|
-
Open a command prompt and navigate to the root of your Rubygame source
|
105
|
-
directory. Type:
|
106
|
-
|
107
|
-
envsetup.bat
|
108
|
-
rake install
|
109
|
-
|
110
|
-
IMPORTANT: If you are missing an optional library (such as SDL_gfx), you must
|
111
|
-
disable optional features by passing a "no-???" command to rake before the word
|
112
|
-
"install". For example, to disable features that depend on SDL_gfx, you would
|
113
|
-
type this instead of the above:
|
114
|
-
|
115
|
-
envsetup.bat
|
116
|
-
rake no-sdl-gfx install
|
117
|
-
|
118
|
-
If all goes well, you have built and installed Rubygame.
|
119
|
-
Try to execute <code>require 'rubygame'</code> in an irb session and run
|
120
|
-
the provided samples to ensure that everything is acceptable.
|
121
|
-
|
122
|
-
(Thanks to Ash Wilson (smashwilson) for contributing the original version of
|
123
|
-
these instructions.)
|
50
|
+
If you have any trouble installing Rubygame, please post in the
|
51
|
+
{forums}[http://rubygame.org/forums/].
|
data/lib/rubygame.rb
CHANGED
@@ -19,38 +19,76 @@
|
|
19
19
|
#
|
20
20
|
#++
|
21
21
|
|
22
|
-
# This file is loaded when you "require 'rubygame'".
|
23
|
-
# It loads up the compiled C extensions and the rest of
|
24
|
-
# the Rubygame library modules.
|
25
22
|
|
23
|
+
this_dir = File.expand_path( File.dirname(__FILE__) )
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
|
26
|
+
# Require Rubygame files. If these fail, don't rescue.
|
27
|
+
# Note: screen.rb is intentionally loaded late.
|
28
|
+
%w{ main
|
29
|
+
shared
|
30
|
+
audio
|
31
|
+
clock
|
32
|
+
constants
|
33
|
+
color
|
34
|
+
event
|
35
|
+
events
|
36
|
+
event_handler
|
37
|
+
gl
|
38
|
+
joystick
|
39
|
+
named_resource
|
40
|
+
queue
|
41
|
+
rect
|
42
|
+
surface
|
43
|
+
sprite
|
44
|
+
}.each do |f|
|
45
|
+
require File.join( this_dir, "rubygame", f )
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
# SDL_gfx is optional, rescue if it fails.
|
50
|
+
begin
|
51
|
+
require File.join( this_dir, "rubygame", "gfx" )
|
52
|
+
rescue LoadError => e
|
53
|
+
puts( "Warning: Could not load SDL_gfx! " +
|
54
|
+
"Continuing anyway, but some Surface methods will be missing.\n" +
|
55
|
+
"Error message was: #{e.message.inspect}" )
|
56
|
+
end
|
30
57
|
|
31
58
|
|
32
|
-
|
59
|
+
# SDL_image is optional, rescue if it fails.
|
60
|
+
begin
|
61
|
+
require File.join( this_dir, "rubygame", "image" )
|
62
|
+
rescue LoadError => e
|
63
|
+
puts( "Warning: Could not load SDL_image! " +
|
64
|
+
"Continuing anyway, but image loading will be missing.\n" +
|
65
|
+
"Error message was: #{e.message.inspect}" )
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# SDL_mixer is optional, rescue if it fails.
|
70
|
+
begin
|
71
|
+
require File.join( this_dir, "rubygame", "mixer" )
|
72
|
+
rescue LoadError => e
|
73
|
+
puts( "Warning: Could not load SDL_mixer! " +
|
74
|
+
"Continuing anyway, but audio features will be missing.\n" +
|
75
|
+
"Error message was: #{e.message.inspect}" )
|
76
|
+
end
|
33
77
|
|
34
|
-
require "rubygame_core"
|
35
78
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
79
|
+
# SDL_ttf is optional, rescue if it fails.
|
80
|
+
begin
|
81
|
+
require File.join( this_dir, "rubygame", "ttf" )
|
82
|
+
rescue LoadError => e
|
83
|
+
puts( "Warning: Could not load SDL_ttf! " +
|
84
|
+
"Continuing anyway, but the TTF class will be missing.\n" +
|
85
|
+
"Error message was: #{e.message.inspect}" )
|
42
86
|
end
|
43
87
|
|
44
|
-
require "rubygame/shared"
|
45
88
|
|
46
|
-
|
47
|
-
require "rubygame
|
89
|
+
# Loaded late so Screen can undefine some inherited Surface methods.
|
90
|
+
require File.join( this_dir, "rubygame", "screen" )
|
48
91
|
|
49
|
-
require "rubygame/event"
|
50
|
-
require "rubygame/events"
|
51
|
-
require "rubygame/queue"
|
52
|
-
require "rubygame/event_handler"
|
53
92
|
|
54
|
-
|
55
|
-
|
56
|
-
require "rubygame/clock"
|
93
|
+
Rubygame.init
|
94
|
+
at_exit { Rubygame.quit }
|
@@ -0,0 +1,147 @@
|
|
1
|
+
#--
|
2
|
+
# Rubygame -- Ruby code and bindings to SDL to facilitate game creation
|
3
|
+
# Copyright (C) 2004-2009 John Croisant
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
|
+
#++
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
module Rubygame
|
23
|
+
|
24
|
+
# call-seq:
|
25
|
+
# open_audio( options={:buffer=>1024, :channels=>2, :frequency=>22050} )
|
26
|
+
#
|
27
|
+
# Initializes the audio device using the given settings.
|
28
|
+
#
|
29
|
+
# NOTE: Audio will be automatically opened when Rubygame::Sound or
|
30
|
+
# Rubygame::Music are first used. You only need to open audio
|
31
|
+
# manually if you want settings different from the default, or if
|
32
|
+
# you are using the older, deprecated Music and Sample classes from
|
33
|
+
# the Rubygame::Mixer module.
|
34
|
+
#
|
35
|
+
# If audio is already open, this method has no effect, and returns false.
|
36
|
+
# If you want to change audio settings, you must #close_audio() and
|
37
|
+
# then open it again.
|
38
|
+
#
|
39
|
+
# options:: A Hash of any of the following options. (Hash, optional)
|
40
|
+
#
|
41
|
+
# :frequency:: output sample rate in audio samples per second
|
42
|
+
# (Hz). Affects the quality of the sound output, at
|
43
|
+
# the expense of CPU usage. If omitted, the default
|
44
|
+
# (22050) is used. The default is recommended for
|
45
|
+
# most games.
|
46
|
+
#
|
47
|
+
# :channels:: output sound channels. Use 2 for stereo, 1 for mono.
|
48
|
+
# If omitted, the default (2) is used.
|
49
|
+
#
|
50
|
+
# :buffer:: size of the sound buffer, in bytes. Must be a
|
51
|
+
# power of 2 (e.g. 512, 1024, 2048). If omitted,
|
52
|
+
# the default (1024) is used. If your game is
|
53
|
+
# fast-paced, you may want to use a smaller value
|
54
|
+
# to reduce audio delay, the time between when you
|
55
|
+
# play a sound and when it is heard.
|
56
|
+
#
|
57
|
+
# Returns:: true if the audio was newly opened by this action, or
|
58
|
+
# false if it was already open before this action.
|
59
|
+
#
|
60
|
+
# May raise:: SDLError, if initialization fails.
|
61
|
+
# ArgumentError, if an invalid value is given for any option.
|
62
|
+
#
|
63
|
+
def self.open_audio( options={} )
|
64
|
+
return false if audio_open?
|
65
|
+
|
66
|
+
unless options.kind_of? Hash
|
67
|
+
raise TypeError, "invalid options Hash: #{options.inspect}"
|
68
|
+
end
|
69
|
+
|
70
|
+
buff = (options[:buffer] or 1024)
|
71
|
+
chan = (options[:channels] or 2)
|
72
|
+
freq = (options[:frequency] or SDL::Mixer::DEFAULT_FREQUENCY)
|
73
|
+
|
74
|
+
# In general, format should always be the default.
|
75
|
+
frmt = SDL::Mixer::DEFAULT_FORMAT
|
76
|
+
|
77
|
+
|
78
|
+
buff = if( buff <= 0 )
|
79
|
+
raise ArgumentError, "buffer size must be positive (got #{buff})"
|
80
|
+
elsif( buff & (buff - 1) != 0 )
|
81
|
+
raise( ArgumentError, "buffer size must be a power of 2 "+
|
82
|
+
"(e.g. 512, 1024) (got #{buff})" )
|
83
|
+
else
|
84
|
+
buff.to_i
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
chan = if( chan != 1 && chan != 2 )
|
89
|
+
raise( ArgumentError,
|
90
|
+
"channels must be 1 (mono) or 2 (stereo) (got #{chan})" )
|
91
|
+
else
|
92
|
+
chan.to_i
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
freq = if( freq <= 0 )
|
97
|
+
raise ArgumentError, "frequency must be positive (got #{freq})"
|
98
|
+
else
|
99
|
+
freq.to_i
|
100
|
+
end
|
101
|
+
|
102
|
+
result = SDL::Mixer.OpenAudio(freq, frmt, chan, buff)
|
103
|
+
|
104
|
+
if( result < 0 )
|
105
|
+
raise Rubygame::SDLError, "Could not open audio: #{SDL.GetError()}"
|
106
|
+
end
|
107
|
+
|
108
|
+
return true
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
# Deinitializes and closes the audio device. If audio was not open,
|
114
|
+
# this method does nothing, and returns false. See also #open_audio().
|
115
|
+
#
|
116
|
+
# NOTE: The audio will be automatically closed when the program
|
117
|
+
# exits. You only need to close audio manually if you want to
|
118
|
+
# call #open_audio with different settings.
|
119
|
+
#
|
120
|
+
# Returns:: true if the audio was open before this action.
|
121
|
+
#
|
122
|
+
def self.close_audio
|
123
|
+
if audio_open?
|
124
|
+
SDL::Mixer.CloseAudio()
|
125
|
+
return true
|
126
|
+
else
|
127
|
+
return false
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
def self.audio_open? # :nodoc:
|
133
|
+
SDL::Mixer.QuerySpec(nil,nil,nil) > 0
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
# Returns the name of the audio driver that SDL is using.
|
138
|
+
# This method opens the audio device if it is not open already.
|
139
|
+
#
|
140
|
+
# May raise an SDLError if the audio device could not be opened.
|
141
|
+
#
|
142
|
+
def self.audio_driver
|
143
|
+
open_audio
|
144
|
+
return SDL.AudioDriverName
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
data/lib/rubygame/clock.rb
CHANGED
@@ -20,7 +20,8 @@
|
|
20
20
|
#++
|
21
21
|
|
22
22
|
|
23
|
-
|
23
|
+
|
24
|
+
require( File.join( File.dirname(__FILE__), "events", "clock_events" ) )
|
24
25
|
|
25
26
|
|
26
27
|
module Rubygame
|
@@ -41,6 +42,168 @@ module Rubygame
|
|
41
42
|
#
|
42
43
|
class Clock
|
43
44
|
|
45
|
+
class << self
|
46
|
+
|
47
|
+
# time:: The target delay time, in milliseconds.
|
48
|
+
# (Non-negative integer. Required.)
|
49
|
+
# gran:: The assumed granularity (in ms) of the system clock.
|
50
|
+
# (Non-negative integer. Optional. Default: 12.)
|
51
|
+
# nice:: If true, try to let other ruby threads run during the delay.
|
52
|
+
# (true or false. Optional. Default: false.)
|
53
|
+
#
|
54
|
+
# Returns:: The actual delay time, in milliseconds.
|
55
|
+
#
|
56
|
+
# Pause the program for +time+ milliseconds. This function is more
|
57
|
+
# accurate than Clock.wait, but uses slightly more CPU time. Both
|
58
|
+
# this function and Clock.wait can be used to slow down the
|
59
|
+
# framerate so that the application doesn't use too much CPU time.
|
60
|
+
# See also Clock#tick for a good and easy way to limit the
|
61
|
+
# framerate.
|
62
|
+
#
|
63
|
+
# This function uses "busy waiting" during the last part
|
64
|
+
# of the delay, for increased accuracy. The value of +gran+ affects
|
65
|
+
# how many milliseconds of the delay are spent in busy waiting, and thus
|
66
|
+
# how much CPU it uses. A smaller +gran+ value uses less CPU, but if
|
67
|
+
# it's smaller than the true system granularity, this function may
|
68
|
+
# delay a few milliseconds too long. The default value (12ms) is very
|
69
|
+
# safe, but a value of approximately 5ms would give a better balance
|
70
|
+
# between accuracy and CPU usage on most modern computers.
|
71
|
+
# A granularity of 0ms makes this method act the same as Clock.wait
|
72
|
+
# (i.e. no busy waiting at all, very low CPU usage).
|
73
|
+
#
|
74
|
+
# If +nice+ is true, this function will try to allow other ruby
|
75
|
+
# threads to run during this function. Otherwise, other ruby threads
|
76
|
+
# will probably also be paused. Setting +nice+ to true is only
|
77
|
+
# useful if your application is multithreaded. It's safe (but
|
78
|
+
# pointless) to use this feature for single threaded applications.
|
79
|
+
#
|
80
|
+
# The Rubygame timer system will be initialized when you call this
|
81
|
+
# function, if it has not been already. See Clock.runtime.
|
82
|
+
#
|
83
|
+
def delay( time, gran=12, nice=false )
|
84
|
+
_init_sdl_timer
|
85
|
+
time = 0 if time < 0
|
86
|
+
gran = 0 if gran < 0
|
87
|
+
_accurate_delay( time, gran, nice )
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
# time:: The target wait time, in milliseconds.
|
92
|
+
# (Non-negative Integer. Required.)
|
93
|
+
# nice:: If true, try to let other ruby threads run during the delay.
|
94
|
+
# (true or false. Optional.)
|
95
|
+
#
|
96
|
+
# Returns:: The actual wait time, in milliseconds.
|
97
|
+
#
|
98
|
+
# Pause the program for approximately +time+ milliseconds. Both this
|
99
|
+
# function and Clock.delay can be used to slow down the framerate so
|
100
|
+
# that the application doesn't use too much CPU time. See also
|
101
|
+
# Clock#tick for a good and easy way to limit the framerate.
|
102
|
+
#
|
103
|
+
# The accuracy of this function depends on processor scheduling,
|
104
|
+
# which varies with operating system and hardware. The actual delay
|
105
|
+
# time may be up to 10ms longer than +time+. If you need more
|
106
|
+
# accuracy use Clock.delay, which is more accurate but uses slightly
|
107
|
+
# more CPU time.
|
108
|
+
#
|
109
|
+
# If +nice+ is true, this function will try to allow other ruby
|
110
|
+
# threads to run during this function. Otherwise, other ruby threads
|
111
|
+
# will probably also be paused. Setting +nice+ to true is only
|
112
|
+
# useful if your application is multithreaded. It's safe (but
|
113
|
+
# pointless) to use this feature for single threaded applications.
|
114
|
+
#
|
115
|
+
# The Rubygame timer system will be initialized when you call this
|
116
|
+
# function, if it has not been already. See Clock.runtime.
|
117
|
+
#
|
118
|
+
def wait( time, nice=false )
|
119
|
+
_init_sdl_timer
|
120
|
+
time = 0 if time < 0
|
121
|
+
_threaded_delay( time, nice )
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
# Return the number of milliseconds since the Rubygame timer
|
126
|
+
# system was initialized.
|
127
|
+
#
|
128
|
+
# The Rubygame timer system will be initialized when you call
|
129
|
+
# this function, if it has not been already.
|
130
|
+
#
|
131
|
+
def runtime
|
132
|
+
SDL.GetTicks().to_i
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
|
140
|
+
# Initialize the SDL timer system, if it hasn't been already.
|
141
|
+
def _init_sdl_timer
|
142
|
+
if( SDL.WasInit( SDL::INIT_TIMER ) == 0 )
|
143
|
+
if( SDL.InitSubSystem( SDL::INIT_TIMER ) != 0)
|
144
|
+
raise( Rubygame::SDLError,
|
145
|
+
"Could not initialize timer system: #{SDL.GetError()}" )
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
# Delays for the given amount of time, but possibly split into
|
152
|
+
# small parts. Control is given to ruby between each part, so
|
153
|
+
# that other threads can run.
|
154
|
+
#
|
155
|
+
# delay: How many milliseconds to delay.
|
156
|
+
# nice: If true, split the delay into smaller parts and
|
157
|
+
# allow other ruby threads to run between each part.
|
158
|
+
#
|
159
|
+
def _threaded_delay( delay, nice )
|
160
|
+
start = SDL.GetTicks()
|
161
|
+
stop = start + delay
|
162
|
+
|
163
|
+
if nice
|
164
|
+
while( SDL.GetTicks() < stop )
|
165
|
+
SDL.Delay(1)
|
166
|
+
end
|
167
|
+
else
|
168
|
+
SDL.Delay( delay.to_i )
|
169
|
+
end
|
170
|
+
|
171
|
+
return (SDL.GetTicks() - start).to_i
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
# Based on pygame code, with a few modifications:
|
176
|
+
# - takes 'accuracy' argument
|
177
|
+
# - ruby syntax for raising exceptions
|
178
|
+
# - uses rg_threaded_delay
|
179
|
+
#
|
180
|
+
def _accurate_delay( ticks, accuracy, nice )
|
181
|
+
return _threaded_delay( ticks, nice ) if( accuracy <= 0 )
|
182
|
+
|
183
|
+
start = SDL.GetTicks()
|
184
|
+
|
185
|
+
if( ticks >= accuracy )
|
186
|
+
delay = ticks - (ticks % accuracy)
|
187
|
+
delay -= 2 # Aim low so we don't overshoot.
|
188
|
+
|
189
|
+
if( delay >= accuracy and delay > 0 )
|
190
|
+
_threaded_delay( delay, nice )
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
delay = ticks - (SDL.GetTicks() - start)
|
195
|
+
while( delay > 0 )
|
196
|
+
delay = ticks - (SDL.GetTicks() - start)
|
197
|
+
end
|
198
|
+
|
199
|
+
return (SDL.GetTicks() - start).to_i
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
44
207
|
# The runtime when the Clock was initialized.
|
45
208
|
attr_reader :start
|
46
209
|
|