gosu 0.7.29-universal-darwin → 0.7.30-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
- data/Gosu/Audio.hpp +4 -12
- data/Gosu/Bitmap.hpp +32 -22
- data/Gosu/Color.hpp +10 -8
- data/Gosu/GraphicsBase.hpp +5 -9
- data/Gosu/Platform.hpp +15 -15
- data/Gosu/Version.hpp +2 -2
- data/README.txt +25 -26
- data/examples/RMagickIntegration.rb +77 -103
- data/examples/media/Landscape.svg +10 -0
- data/lib/gosu.for_1_8.bundle +0 -0
- data/lib/gosu.for_1_9.bundle +0 -0
- data/lib/gosu/patches.rb +5 -5
- data/lib/gosu/swig_patches.rb +22 -0
- metadata +6 -6
- data/examples/media/Sky.jpg +0 -0
data/Gosu/Audio.hpp
CHANGED
@@ -20,7 +20,9 @@
|
|
20
20
|
namespace Gosu
|
21
21
|
{
|
22
22
|
// Deprecated.
|
23
|
-
|
23
|
+
#ifndef SWIG
|
24
|
+
GOSU_DEPRECATED class Audio;
|
25
|
+
#endif
|
24
26
|
|
25
27
|
//! An instance of a Sample playing. Can be used to stop sounds dynamically,
|
26
28
|
//! or to check if they are finished.
|
@@ -94,8 +96,6 @@ namespace Gosu
|
|
94
96
|
SampleInstance playPan(double pan, double volume = 1, double speed = 1,
|
95
97
|
bool looping = false) const;
|
96
98
|
|
97
|
-
|
98
|
-
// Deprecated.
|
99
99
|
#ifndef SWIG
|
100
100
|
GOSU_DEPRECATED Sample(Audio& audio, const std::wstring& filename);
|
101
101
|
GOSU_DEPRECATED Sample(Audio& audio, Reader reader);
|
@@ -150,16 +150,8 @@ namespace Gosu
|
|
150
150
|
//! Called every tick by Window for management purposes.
|
151
151
|
static void update();
|
152
152
|
|
153
|
-
// Deprecated.
|
154
153
|
#ifndef SWIG
|
155
|
-
|
156
|
-
//! songs (like OGG) and modules (like MOD or XM).
|
157
|
-
enum Type
|
158
|
-
{
|
159
|
-
stStream,
|
160
|
-
stModule
|
161
|
-
};
|
162
|
-
|
154
|
+
enum Type { stStream, stModule };
|
163
155
|
GOSU_DEPRECATED Song(Audio&, const std::wstring& filename);
|
164
156
|
GOSU_DEPRECATED Song(Audio&, Type type, Reader reader);
|
165
157
|
#endif
|
data/Gosu/Bitmap.hpp
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
#include <Gosu/Color.hpp>
|
8
8
|
#include <Gosu/Fwd.hpp>
|
9
9
|
#include <Gosu/GraphicsBase.hpp>
|
10
|
+
#include <Gosu/Platform.hpp>
|
10
11
|
#include <boost/scoped_ptr.hpp>
|
11
12
|
#include <string>
|
12
13
|
#include <vector>
|
@@ -23,18 +24,16 @@ namespace Gosu
|
|
23
24
|
std::vector<Color> pixels;
|
24
25
|
|
25
26
|
public:
|
26
|
-
Bitmap()
|
27
|
+
Bitmap() : w(0), h(0) {}
|
28
|
+
Bitmap(unsigned w, unsigned h, Color c = Color::NONE) : w(w), h(h), pixels(w * h, c) {}
|
27
29
|
|
28
|
-
unsigned width()
|
30
|
+
unsigned width() const { return w; }
|
29
31
|
unsigned height() const { return h; }
|
30
32
|
|
31
33
|
void swap(Bitmap& other);
|
32
34
|
|
33
35
|
void resize(unsigned width, unsigned height, Color c = Color::NONE);
|
34
|
-
|
35
|
-
void fill(Color c);
|
36
|
-
void replace(Color oldColor, Color newColor);
|
37
|
-
|
36
|
+
|
38
37
|
//! Returns the color at the specified position. x and y must be on the
|
39
38
|
//! bitmap.
|
40
39
|
Color getPixel(unsigned x, unsigned y) const { return pixels[y * w + x]; }
|
@@ -56,32 +55,43 @@ namespace Gosu
|
|
56
55
|
|
57
56
|
//! Direct access to the array of color values. May be useful for optimized
|
58
57
|
//! OpenGL operations.
|
59
|
-
const
|
60
|
-
|
61
|
-
};
|
58
|
+
const Color* data() const { return &pixels[0]; }
|
59
|
+
Color* data() { return &pixels[0]; }
|
62
60
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
61
|
+
// Work with data() instead if you need fast operations.
|
62
|
+
GOSU_DEPRECATED void fill(Color c);
|
63
|
+
GOSU_DEPRECATED void replace(Color oldColor, Color newColor);
|
64
|
+
};
|
65
|
+
|
66
|
+
//! Loads any supported image into a Bitmap.
|
67
|
+
Bitmap loadImageFile(const std::wstring& filename);
|
68
|
+
//! Loads any supported image into a Bitmap.
|
69
|
+
Bitmap loadImageFile(Reader input);
|
71
70
|
|
71
|
+
//! Saves a Bitmap to a file.
|
72
|
+
void saveImageFile(const Bitmap& bitmap, const std::wstring& filename);
|
73
|
+
//! Saves a Bitmap to an arbitrary resource.
|
74
|
+
void saveImageFile(const Bitmap& bitmap, Gosu::Writer writer,
|
75
|
+
const std::wstring& formatHint = L"png");
|
76
|
+
|
72
77
|
//! Set the alpha value of all pixels which are equal to the color key
|
73
78
|
//! to zero. Color values are adjusted so that no borders show up when
|
74
79
|
//! the image is stretched or rotated.
|
75
80
|
void applyColorKey(Bitmap& bitmap, Color key);
|
76
81
|
|
82
|
+
//! The reverse of applyColorKey. Resets all fully transparent pixels by
|
83
|
+
//! a background color, makes all other pixels fully opaque.
|
84
|
+
void unapplyColorKey(Bitmap& bitmap, Color background);
|
85
|
+
|
77
86
|
void applyBorderFlags(Bitmap& dest, const Bitmap& source,
|
78
87
|
unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
|
79
88
|
unsigned borderFlags);
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
89
|
+
|
90
|
+
// Use loadImageFile/saveImageFile instead.
|
91
|
+
GOSU_DEPRECATED Reader loadFromBMP(Bitmap& bmp, Reader reader);
|
92
|
+
GOSU_DEPRECATED Writer saveToBMP(const Bitmap& bmp, Writer writer);
|
93
|
+
GOSU_DEPRECATED Reader loadFromPNG(Bitmap& bmp, Reader reader);
|
94
|
+
GOSU_DEPRECATED Writer saveToPNG(const Bitmap& bmp, Writer writer);
|
85
95
|
}
|
86
96
|
|
87
97
|
#endif
|
data/Gosu/Color.hpp
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
namespace Gosu
|
11
11
|
{
|
12
|
-
//! Represents an
|
12
|
+
//! Represents an RGBA color value with 8 bits for each channel. Can be
|
13
13
|
//! implicitly constructed from literals of the form 0xaarrggbb. Has fast
|
14
14
|
//! value semantics.
|
15
15
|
//! The four-byte layout in memory is RGBA. On Big-Endian machines the
|
@@ -138,6 +138,12 @@ namespace Gosu
|
|
138
138
|
return alpha() << 24 | blue() << 16 | green() << 8 | red();
|
139
139
|
}
|
140
140
|
|
141
|
+
//! Returns the internal representation of the color (RGBA in memory).
|
142
|
+
boost::uint32_t gl() const
|
143
|
+
{
|
144
|
+
return rep;
|
145
|
+
}
|
146
|
+
|
141
147
|
static const Color NONE;
|
142
148
|
static const Color BLACK;
|
143
149
|
static const Color GRAY;
|
@@ -152,24 +158,20 @@ namespace Gosu
|
|
152
158
|
static const Color CYAN;
|
153
159
|
};
|
154
160
|
|
155
|
-
// Causes weird errors when included in the SWIG wrapping process.
|
156
|
-
// If, with a future version of SWIG, this can be included and
|
157
|
-
// require 'gosu'; include Gosu
|
158
|
-
// works from within Ruby, the #ifndef guard can be removed.
|
159
161
|
#ifndef SWIG
|
160
162
|
inline bool operator<(Color a, Color b)
|
161
163
|
{
|
162
|
-
return a.
|
164
|
+
return a.gl() < b.gl();
|
163
165
|
}
|
164
166
|
|
165
167
|
inline bool operator==(Color a, Color b)
|
166
168
|
{
|
167
|
-
return a.
|
169
|
+
return a.gl() == b.gl();
|
168
170
|
}
|
169
171
|
|
170
172
|
inline bool operator!=(Color a, Color b)
|
171
173
|
{
|
172
|
-
return a.
|
174
|
+
return a.gl() != b.gl();
|
173
175
|
}
|
174
176
|
#endif
|
175
177
|
|
data/Gosu/GraphicsBase.hpp
CHANGED
@@ -14,15 +14,6 @@ namespace Gosu
|
|
14
14
|
//! lower ZPos value, that is, they are performed last.
|
15
15
|
typedef double ZPos;
|
16
16
|
|
17
|
-
//! The lowest possible Z position. By using this, you tell Gosu that
|
18
|
-
//! your drawing operation does not need Z ordering and can be performed
|
19
|
-
//! immediately.
|
20
|
-
//! Deprecated because this turned out not be very useful in optimizing.
|
21
|
-
#ifndef SWIG
|
22
|
-
GOSU_DEPRECATED
|
23
|
-
#endif
|
24
|
-
const double zImmediate = -std::numeric_limits<double>::infinity();
|
25
|
-
|
26
17
|
//! Determines the way colors are combined when one is drawn onto
|
27
18
|
//! another.
|
28
19
|
enum AlphaMode
|
@@ -64,6 +55,11 @@ namespace Gosu
|
|
64
55
|
bfTileableBottom = 8,
|
65
56
|
bfTileable = bfTileableLeft | bfTileableTop | bfTileableRight | bfTileableBottom
|
66
57
|
};
|
58
|
+
|
59
|
+
#ifndef SWIG
|
60
|
+
// A not so useful optimization.
|
61
|
+
GOSU_DEPRECATED const double zImmediate = -std::numeric_limits<double>::infinity();
|
62
|
+
#endif
|
67
63
|
}
|
68
64
|
|
69
65
|
#endif
|
data/Gosu/Platform.hpp
CHANGED
@@ -5,17 +5,17 @@
|
|
5
5
|
#define GOSU_PLATFORM_HPP
|
6
6
|
|
7
7
|
#ifdef __BIG_ENDIAN__
|
8
|
-
#define GOSU_IS_BIG_ENDIAN
|
9
|
-
#define IDENTITY_FUN bigToNative
|
10
|
-
#define IDENTITY_FUN2 nativeToBig
|
11
|
-
#define CONV_FUN littleToNative
|
12
|
-
#define CONV_FUN2 nativeToLittle
|
8
|
+
# define GOSU_IS_BIG_ENDIAN
|
9
|
+
# define IDENTITY_FUN bigToNative
|
10
|
+
# define IDENTITY_FUN2 nativeToBig
|
11
|
+
# define CONV_FUN littleToNative
|
12
|
+
# define CONV_FUN2 nativeToLittle
|
13
13
|
#else
|
14
|
-
#define GOSU_IS_LITTLE_ENDIAN
|
15
|
-
#define IDENTITY_FUN littleToNative
|
16
|
-
#define IDENTITY_FUN2 nativeToLittle
|
17
|
-
#define CONV_FUN bigToNative
|
18
|
-
#define CONV_FUN2 nativeToBig
|
14
|
+
# define GOSU_IS_LITTLE_ENDIAN
|
15
|
+
# define IDENTITY_FUN littleToNative
|
16
|
+
# define IDENTITY_FUN2 nativeToLittle
|
17
|
+
# define CONV_FUN bigToNative
|
18
|
+
# define CONV_FUN2 nativeToBig
|
19
19
|
#endif
|
20
20
|
|
21
21
|
#include <algorithm>
|
@@ -42,9 +42,9 @@ namespace Gosu
|
|
42
42
|
#undef CONV_FUN2
|
43
43
|
|
44
44
|
#if defined(_MSC_VER)
|
45
|
-
#define GOSU_NORETURN __declspec(noreturn)
|
45
|
+
# define GOSU_NORETURN __declspec(noreturn)
|
46
46
|
#elif defined(__GNUC__)
|
47
|
-
#define GOSU_NORETURN __attribute__ ((noreturn))
|
47
|
+
# define GOSU_NORETURN __attribute__ ((noreturn))
|
48
48
|
#endif
|
49
49
|
|
50
50
|
#if defined(WIN32)
|
@@ -62,10 +62,10 @@ namespace Gosu
|
|
62
62
|
# endif
|
63
63
|
#endif
|
64
64
|
|
65
|
-
#if (
|
66
|
-
# define GOSU_DEPRECATED __attribute__((__deprecated__))
|
67
|
-
#elif defined(GOSU_IS_WIN)
|
65
|
+
#if defined(GOSU_IS_WIN)
|
68
66
|
# define GOSU_DEPRECATED __declspec(deprecated)
|
67
|
+
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
68
|
+
# define GOSU_DEPRECATED __attribute__((__deprecated__))
|
69
69
|
#else
|
70
70
|
# define GOSU_DEPRECATED
|
71
71
|
#endif
|
data/Gosu/Version.hpp
CHANGED
data/README.txt
CHANGED
@@ -1,26 +1,25 @@
|
|
1
|
-
Moin and welcome to Gosu!
|
2
|
-
|
3
|
-
Gosu's main website is http://www.libgosu.org
|
4
|
-
links to all relevant information.
|
5
|
-
|
6
|
-
The actual source code, wiki, issue tracker etc. are
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
*
|
25
|
-
*
|
26
|
-
* or e-mail me. Have fun, write games! julian@raschke.de
|
1
|
+
Moin and welcome to Gosu!
|
2
|
+
|
3
|
+
Gosu's main website is http://www.libgosu.org/, which always has the latest
|
4
|
+
links to all relevant information.
|
5
|
+
|
6
|
+
The actual source code, wiki, issue tracker etc. are all hosted on GitHub:
|
7
|
+
|
8
|
+
http://github.com/jlnr/gosu/
|
9
|
+
|
10
|
+
The best entry point into Gosu's documentation is the wiki home page:
|
11
|
+
|
12
|
+
http://github.com/jlnr/gosu/wiki
|
13
|
+
|
14
|
+
Try doing the tutorial there if you don't know how to start out. Or look at
|
15
|
+
one of the games in the Gosu Users board.
|
16
|
+
|
17
|
+
Remember that Gosu is licensed under the MIT license and feel invited to fork,
|
18
|
+
port and transmogrify all parts of it. The only license that may affect you by
|
19
|
+
indirection is libogg's (BSD-style). If you release a Gosu game in any common
|
20
|
+
binary form, you will need to mention use of libogg and libvorbis somewhere.
|
21
|
+
|
22
|
+
Complaints, questions, feedback?
|
23
|
+
* Visit the boards, http://www.libgosu.org/
|
24
|
+
* try your luck in the chat, irc://irc.freenode.org/gosu
|
25
|
+
* or e-mail me. Have fun, write games! julian@raschke.de
|
@@ -21,29 +21,78 @@ NULL_PIXEL = Magick::Pixel.from_color('none')
|
|
21
21
|
# Design:
|
22
22
|
# * Dynamic map creation at startup, holding it as RMagick Image in @image
|
23
23
|
# * Testing for solidity by testing @image's pixel values
|
24
|
-
# * Drawing
|
25
|
-
# a part of the large @image
|
24
|
+
# * Drawing from a Gosu::Image instance
|
26
25
|
# * Blasting holes into the map is implemented by drawing and erasing portions
|
27
|
-
# of @image, then
|
28
|
-
# they will be recreated in Map#draw
|
29
|
-
# Note: The splitting is done because recreating such a large Gosu::Image for
|
30
|
-
# every map change would be a very noticeable delay!
|
26
|
+
# of @image, then recreating the corresponding area in the Gosu::Image
|
31
27
|
|
32
28
|
class Map
|
33
29
|
WIDTH, HEIGHT = 800, 600
|
34
|
-
TILE_SIZE = 100
|
35
|
-
TILES_X = WIDTH / TILE_SIZE
|
36
|
-
TILES_Y = HEIGHT / TILE_SIZE
|
37
30
|
|
38
|
-
def initialize
|
31
|
+
def initialize window
|
39
32
|
# We'll need the window later for re-creating Gosu images.
|
40
33
|
@window = window
|
41
34
|
|
42
35
|
# Let's start with something simple and load the sky via RMagick.
|
43
|
-
# Loading
|
44
|
-
|
36
|
+
# Loading SVG files isn't possible with Gosu, so say wow!
|
37
|
+
# (Seems to take a while though)
|
38
|
+
sky = Magick::Image.read("media/Landscape.svg").first
|
45
39
|
@sky = Gosu::Image.new(window, sky, true)
|
40
|
+
|
41
|
+
# Create the map an stores the RMagick image in @image
|
42
|
+
create_rmagick_map
|
46
43
|
|
44
|
+
# Copy the RMagick Image to a Gosu Image (still unchanged)
|
45
|
+
@gosu_image = Gosu::Image.new(window, @image, true)
|
46
|
+
end
|
47
|
+
|
48
|
+
def solid? x, y
|
49
|
+
# Map is open at the top.
|
50
|
+
return false if y < 0
|
51
|
+
# Map is closed on all other sides.
|
52
|
+
return true if x < 0 or x >= 800 or y >= 600
|
53
|
+
# Inside of the map, determine solidity from the map image.
|
54
|
+
@image.pixel_color(x, y) != NULL_PIXEL
|
55
|
+
end
|
56
|
+
|
57
|
+
def draw
|
58
|
+
# Sky background.
|
59
|
+
@sky.draw(0, 0, 0)
|
60
|
+
# The landscape.
|
61
|
+
@gosu_image.draw 0, 0, 0
|
62
|
+
end
|
63
|
+
|
64
|
+
# Radius of a crater.
|
65
|
+
RADIUS = 25
|
66
|
+
# Radius of a crater, Shadow included.
|
67
|
+
SH_RADIUS = 45
|
68
|
+
|
69
|
+
# Create the crater image (basically a circle shape that is used to erase
|
70
|
+
# parts of the map) and the crater shadow image.
|
71
|
+
CRATER_IMAGE = begin
|
72
|
+
crater = Magick::Image.new(2 * RADIUS, 2 * RADIUS) { self.background_color = 'none' }
|
73
|
+
gc = Magick::Draw.new
|
74
|
+
gc.fill('black').circle(RADIUS, RADIUS, RADIUS, 0)
|
75
|
+
gc.draw crater
|
76
|
+
crater
|
77
|
+
end
|
78
|
+
CRATER_SHADOW = CRATER_IMAGE.shadow(0, 0, (SH_RADIUS - RADIUS) / 2, 1)
|
79
|
+
|
80
|
+
def blast x, y
|
81
|
+
# Draw the shadow (twice for more intensity), then erase a circle from the map.
|
82
|
+
@image.composite!(CRATER_SHADOW, x - SH_RADIUS, y - SH_RADIUS, Magick::AtopCompositeOp)
|
83
|
+
@image.composite!(CRATER_SHADOW, x - SH_RADIUS, y - SH_RADIUS, Magick::AtopCompositeOp)
|
84
|
+
@image.composite!(CRATER_IMAGE, x - RADIUS, y - RADIUS, Magick::DstOutCompositeOp)
|
85
|
+
|
86
|
+
# Isolate the affected portion of the RMagick image.
|
87
|
+
dirty_portion = @image.crop(x - SH_RADIUS, y - SH_RADIUS, SH_RADIUS * 2, SH_RADIUS * 2)
|
88
|
+
# Overwrite this part of the Gosu image. If the crater begins outside of the map, still
|
89
|
+
# just update the inner part.
|
90
|
+
@gosu_image.insert dirty_portion, [x - SH_RADIUS, 0].max, [y - SH_RADIUS, 0].max
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def create_rmagick_map
|
47
96
|
# This is the one large RMagick image that represents the map.
|
48
97
|
@image = Magick::Image.new(WIDTH, HEIGHT) { self.background_color = 'none' }
|
49
98
|
|
@@ -55,8 +104,8 @@ class Map
|
|
55
104
|
gc.stroke('#603000').stroke_width(1.5)
|
56
105
|
# Draw a smooth bezier island onto the map!
|
57
106
|
polypoints = [0, HEIGHT]
|
58
|
-
0.upto(
|
59
|
-
polypoints += [x *
|
107
|
+
0.upto(8) do |x|
|
108
|
+
polypoints += [x * 100, HEIGHT * 0.2 + rand(HEIGHT * 0.8)]
|
60
109
|
end
|
61
110
|
polypoints += [WIDTH, HEIGHT]
|
62
111
|
gc.bezier(*polypoints)
|
@@ -75,80 +124,6 @@ class Map
|
|
75
124
|
star_y += 20 until solid?(WIDTH / 2, star_y)
|
76
125
|
@image.composite!(star, (WIDTH - star.columns) / 2, star_y - star.rows * 0.85,
|
77
126
|
Magick::DstOverCompositeOp)
|
78
|
-
|
79
|
-
# Creates an X*Y array for the Gosu images.
|
80
|
-
# (Initialized to nil automatically).
|
81
|
-
@gosu_images = Array.new(TILES_X) { Array.new(TILES_Y) }
|
82
|
-
end
|
83
|
-
|
84
|
-
def solid?(x, y)
|
85
|
-
# Map is open at the top.
|
86
|
-
return false if y < 0
|
87
|
-
# Map is closed on all other sides.
|
88
|
-
return true if x < 0 or x >= 800 or y >= 600
|
89
|
-
# Inside of the map, determine solidity from the map image.
|
90
|
-
@image.pixel_color(x, y) != NULL_PIXEL
|
91
|
-
end
|
92
|
-
|
93
|
-
def draw
|
94
|
-
# Sky background.
|
95
|
-
@sky.draw(0, 0, 0)
|
96
|
-
# All the tiles.
|
97
|
-
TILES_Y.times do |y|
|
98
|
-
TILES_X.times do |x|
|
99
|
-
# Recreate images that haven't been created yet, or need to be recreated
|
100
|
-
# due to map changes.
|
101
|
-
if @gosu_images[x][y].nil? then
|
102
|
-
part = @image.crop(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE)
|
103
|
-
@gosu_images[x][y] = Gosu::Image.new(@window, part, true)
|
104
|
-
end
|
105
|
-
# At last - draw it!
|
106
|
-
@gosu_images[x][y].draw(x * TILE_SIZE, y * TILE_SIZE, 0)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# Radius of a crater.
|
112
|
-
RADIUS = 25
|
113
|
-
# Radius of a crater, SHadow included.
|
114
|
-
SH_RADIUS = 45
|
115
|
-
|
116
|
-
def blast(x, y)
|
117
|
-
# This code assumes at most 2x2 tiles are affected by a blast, so
|
118
|
-
# don't change the RADIUS to 200 or something ;)
|
119
|
-
# Calculate the x/y indices of the two to four affected tiles.
|
120
|
-
# (left/right and top/bottom might be the same).
|
121
|
-
|
122
|
-
left = (x - SH_RADIUS) / TILE_SIZE
|
123
|
-
right = (x + SH_RADIUS) / TILE_SIZE
|
124
|
-
top = (y - SH_RADIUS) / TILE_SIZE
|
125
|
-
bottom = (y + SH_RADIUS) / TILE_SIZE
|
126
|
-
|
127
|
-
# Set affected images to nil.
|
128
|
-
# A 'double-free' doesn't hurt if e.g. left == right! However, we have to watch out
|
129
|
-
# for out-of-bounds errors.
|
130
|
-
|
131
|
-
@gosu_images[left][top] = nil unless left < 0 or top < 0
|
132
|
-
@gosu_images[right][top] = nil unless right >= TILES_X or top < 0
|
133
|
-
@gosu_images[left][bottom] = nil unless left < 0 or bottom >= TILES_Y
|
134
|
-
@gosu_images[right][bottom] = nil unless right >= TILES_X or bottom >= TILES_Y
|
135
|
-
|
136
|
-
# Create the crater image (basically a circle shape that is used to erase
|
137
|
-
# parts of the map) and the crater shadow image, if they don't exist
|
138
|
-
# already.
|
139
|
-
|
140
|
-
if @crater_image.nil? then
|
141
|
-
@crater_image = Magick::Image.new(2 * RADIUS, 2 * RADIUS) { self.background_color = 'none' }
|
142
|
-
gc = Magick::Draw.new
|
143
|
-
gc.fill('black').circle(RADIUS, RADIUS, RADIUS, 0)
|
144
|
-
gc.draw(@crater_image)
|
145
|
-
@crater_shadow = @crater_image.shadow(0, 0, (SH_RADIUS - RADIUS) / 2, 1)
|
146
|
-
end
|
147
|
-
|
148
|
-
# Draw the shadow (twice for more intensity), then erase a circle from the map.
|
149
|
-
@image.composite!(@crater_shadow, x - SH_RADIUS, y - SH_RADIUS, Magick::AtopCompositeOp)
|
150
|
-
@image.composite!(@crater_shadow, x - SH_RADIUS, y - SH_RADIUS, Magick::AtopCompositeOp)
|
151
|
-
@image.composite!(@crater_image, x - RADIUS, y - RADIUS, Magick::DstOutCompositeOp)
|
152
127
|
end
|
153
128
|
end
|
154
129
|
|
@@ -266,7 +241,7 @@ class Player
|
|
266
241
|
@window.objects << Missile.new(@window, x + 10 * @dir, y - 10, @angle * @dir)
|
267
242
|
end
|
268
243
|
|
269
|
-
def hit_by?
|
244
|
+
def hit_by? missile
|
270
245
|
if Gosu::distance(missile.x, missile.y, x, y) < 30 then
|
271
246
|
# Was hit :(
|
272
247
|
@dead = true
|
@@ -281,11 +256,11 @@ end
|
|
281
256
|
|
282
257
|
class Missile
|
283
258
|
attr_reader :x, :y, :vx, :vy
|
259
|
+
|
260
|
+
# All missile instances use the same sound.
|
261
|
+
EXPLOSION = Gosu::Sample.new("media/Explosion.wav")
|
284
262
|
|
285
263
|
def initialize(window, x, y, angle)
|
286
|
-
# All missile instances use the same sound.
|
287
|
-
@@explosion_sound ||= Gosu::Sample.new(window, "media/Explosion.wav")
|
288
|
-
|
289
264
|
# Horizontal/vertical velocity.
|
290
265
|
@vx, @vy = Gosu::offset_x(angle, 20).to_i, Gosu::offset_y(angle, 20).to_i
|
291
266
|
|
@@ -303,7 +278,7 @@ class Missile
|
|
303
278
|
5.times { @window.objects << Particle.new(@window, x - 25 + rand(51), y - 25 + rand(51)) }
|
304
279
|
@window.map.blast(x, y)
|
305
280
|
# Weeee, stereo sound!
|
306
|
-
|
281
|
+
EXPLOSION.play_pan((2 * @x - Map::WIDTH) / Map::WIDTH)
|
307
282
|
return false
|
308
283
|
else
|
309
284
|
return true
|
@@ -360,7 +335,7 @@ class GameWindow < Gosu::Window
|
|
360
335
|
|
361
336
|
def initialize()
|
362
337
|
super(800, 600, false)
|
363
|
-
self.caption = "
|
338
|
+
self.caption = "Gosu & RMagick Integration Demo"
|
364
339
|
|
365
340
|
# Texts to display in the appropriate situations.
|
366
341
|
@player_instructions = []
|
@@ -369,10 +344,10 @@ class GameWindow < Gosu::Window
|
|
369
344
|
@player_instructions << Gosu::Image.from_text(self,
|
370
345
|
"It is the #{ plr == 0 ? 'green' : 'red' } toy soldier's turn.\n" +
|
371
346
|
"(Arrow keys to walk and aim, Return to jump, Space to shoot)",
|
372
|
-
Gosu::default_font_name,
|
347
|
+
Gosu::default_font_name, 30, 0, width, :center)
|
373
348
|
@player_won_messages << Gosu::Image.from_text(self,
|
374
349
|
"The #{ plr == 0 ? 'green' : 'red' } toy soldier has won!",
|
375
|
-
Gosu::default_font_name,
|
350
|
+
Gosu::default_font_name, 30, 5, width, :center)
|
376
351
|
end
|
377
352
|
|
378
353
|
# Create everything!
|
@@ -403,7 +378,7 @@ class GameWindow < Gosu::Window
|
|
403
378
|
cur_text.draw(x + 1, y, 0, 1, 1, 0xff000000)
|
404
379
|
cur_text.draw(x, y - 1, 0, 1, 1, 0xff000000)
|
405
380
|
cur_text.draw(x, y + 1, 0, 1, 1, 0xff000000)
|
406
|
-
cur_text.draw(x,
|
381
|
+
cur_text.draw(x, y, 0, 1, 1, 0xffffffff)
|
407
382
|
end
|
408
383
|
end
|
409
384
|
|
@@ -418,18 +393,17 @@ class GameWindow < Gosu::Window
|
|
418
393
|
# If it's a player's turn, forward controls.
|
419
394
|
if not @waiting and not @players[@current_player].dead then
|
420
395
|
player = @players[@current_player]
|
421
|
-
player.aim_up
|
422
|
-
player.aim_down
|
396
|
+
player.aim_up if button_down? Gosu::KbUp
|
397
|
+
player.aim_down if button_down? Gosu::KbDown
|
423
398
|
player.try_walk(-1) if button_down? Gosu::KbLeft
|
424
|
-
player.try_walk(1) if button_down? Gosu::KbRight
|
425
|
-
player.try_jump
|
399
|
+
player.try_walk(+1) if button_down? Gosu::KbRight
|
400
|
+
player.try_jump if button_down? Gosu::KbReturn
|
426
401
|
end
|
427
402
|
end
|
428
403
|
|
429
404
|
def button_down(id)
|
430
405
|
if id == Gosu::KbSpace and not @waiting and not @players[@current_player].dead then
|
431
|
-
# Shoot! This is handled in button_down because holding space shouldn't
|
432
|
-
# auto-fire - the shots would come from different players.
|
406
|
+
# Shoot! This is handled in button_down because holding space shouldn't auto-fire.
|
433
407
|
@players[@current_player].shoot
|
434
408
|
@current_player = 1 - @current_player
|
435
409
|
@waiting = true
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" clip-rule="evenodd" stroke-miterlimit="10" viewBox="0 0 850.39 637.80">
|
3
|
+
<desc>SVG generated by Lineform</desc>
|
4
|
+
<defs/>
|
5
|
+
<g>
|
6
|
+
<rect width="940.00" height="734.00" x="-25.50" y="-55.50" fill="#5FB7FF" stroke="#000000" stroke-width="2.20"/>
|
7
|
+
<path d="M 223.50 49.00 C 171.16 49.00 118.84 59.51 78.91 80.50 C -0.96 122.48 -0.96 190.52 78.91 232.50 C 134.24 261.59 213.37 270.50 283.34 259.28 C 350.32 290.78 452.18 289.47 516.06 255.19 C 582.65 219.45 582.65 161.55 516.06 125.81 C 482.95 108.04 439.59 99.12 396.19 99.03 C 388.26 92.46 378.99 86.23 368.09 80.50 C 328.16 59.51 275.84 49.00 223.50 49.00 Z M 223.50 49.00 " fill="#FFFFFF" stroke="#BFBFBF" stroke-width="6.00"/>
|
8
|
+
<path d="M 735.48 183.00 C 699.52 183.00 663.55 187.05 636.11 195.16 C 607.54 203.59 593.99 214.76 595.17 225.81 C 561.74 227.76 529.60 233.37 503.83 242.72 C 438.71 266.35 438.71 304.65 503.83 328.28 C 568.96 351.91 674.56 351.91 739.69 328.28 C 787.65 310.88 800.17 285.50 777.48 263.91 C 798.41 261.97 818.28 258.74 834.86 253.84 C 889.73 237.64 889.73 211.36 834.86 195.16 C 807.42 187.05 771.44 183.00 735.48 183.00 Z M 735.48 183.00 " fill="#FFFFFF" stroke="#BFBFBF" stroke-width="6.00"/>
|
9
|
+
</g>
|
10
|
+
</svg>
|
data/lib/gosu.for_1_8.bundle
CHANGED
Binary file
|
data/lib/gosu.for_1_9.bundle
CHANGED
Binary file
|
data/lib/gosu/patches.rb
CHANGED
@@ -14,26 +14,26 @@ class ::Numeric
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
# Backwards compatibility: import
|
17
|
+
# Backwards compatibility: import constants into Gosu::Button.
|
18
18
|
module Gosu::Button
|
19
19
|
Gosu.constants.each { |c| const_set(c, Gosu.const_get(c)) }
|
20
20
|
end
|
21
21
|
|
22
22
|
# Backwards compatibility: Window arguments to Sample and Song
|
23
23
|
class Gosu::Sample
|
24
|
-
alias
|
24
|
+
alias initialize_ initialize
|
25
25
|
|
26
26
|
def initialize(*args)
|
27
27
|
args.shift if args.first.is_a? Gosu::Window
|
28
|
-
|
28
|
+
initialize_(*args)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
class Gosu::Song
|
32
|
-
alias
|
32
|
+
alias initialize_ initialize
|
33
33
|
|
34
34
|
def initialize(*args)
|
35
35
|
args.shift if args.first.is_a? Gosu::Window
|
36
|
-
|
36
|
+
initialize_(*args)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
data/lib/gosu/swig_patches.rb
CHANGED
@@ -1,6 +1,28 @@
|
|
1
1
|
# SWIG workarounds
|
2
2
|
# These are offloaded into a separate file because rb_eval_string() is weird on Ruby 1.8.
|
3
3
|
|
4
|
+
# Exceptions in Window callbacks often get lost, this is especially annoying in draw/update.
|
5
|
+
# It is not clear whether this is a SWIG issue or if some stack frame is not exception
|
6
|
+
# compatible, but I just call update_ and draw_ in the Ruby wrapper so I can add this
|
7
|
+
# custom debugging help:
|
8
|
+
class Gosu::Window
|
9
|
+
def update_
|
10
|
+
update
|
11
|
+
rescue Exception => e
|
12
|
+
puts e.inspect
|
13
|
+
puts e.backtrace
|
14
|
+
raise e
|
15
|
+
end
|
16
|
+
|
17
|
+
def draw_
|
18
|
+
draw
|
19
|
+
rescue Exception => e
|
20
|
+
puts e.inspect
|
21
|
+
puts e.backtrace
|
22
|
+
raise e
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
4
26
|
# SWIG doesn't understand the C++ overloading.
|
5
27
|
class Gosu::Image
|
6
28
|
def self.from_text(*args)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gosu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 30
|
10
|
+
version: 0.7.30
|
11
11
|
platform: universal-darwin
|
12
12
|
authors:
|
13
13
|
- Julian Raschke
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-04-30 00:00:00 +08:00
|
20
20
|
default_executable:
|
21
21
|
dependencies: []
|
22
22
|
|
@@ -78,8 +78,8 @@ files:
|
|
78
78
|
- examples/media/Cursor.png
|
79
79
|
- examples/media/Earth.png
|
80
80
|
- examples/media/Explosion.wav
|
81
|
+
- examples/media/Landscape.svg
|
81
82
|
- examples/media/LargeStar.png
|
82
|
-
- examples/media/Sky.jpg
|
83
83
|
- examples/media/Smoke.png
|
84
84
|
- examples/media/Soldier.png
|
85
85
|
- examples/media/Space.png
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
requirements: []
|
120
120
|
|
121
121
|
rubyforge_project:
|
122
|
-
rubygems_version: 1.6.
|
122
|
+
rubygems_version: 1.6.2
|
123
123
|
signing_key:
|
124
124
|
specification_version: 3
|
125
125
|
summary: 2D game development library.
|
data/examples/media/Sky.jpg
DELETED
Binary file
|