ruby2d 0.10.0 → 0.11.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.
- checksums.yaml +4 -4
- data/ext/ruby2d/extconf.rb +31 -23
- data/ext/ruby2d/font.c +35 -0
- data/ext/ruby2d/gl.c +8 -57
- data/ext/ruby2d/gl2.c +8 -83
- data/ext/ruby2d/gl3.c +57 -115
- data/ext/ruby2d/gles.c +11 -85
- data/ext/ruby2d/image.c +16 -96
- data/ext/ruby2d/ruby2d.c +178 -305
- data/ext/ruby2d/ruby2d.h +16 -153
- data/ext/ruby2d/sound.c +1 -1
- data/ext/ruby2d/text.c +10 -117
- data/ext/ruby2d/window.c +4 -4
- data/lib/ruby2d/circle.rb +3 -1
- data/lib/ruby2d/cli/build.rb +2 -0
- data/lib/ruby2d/font.rb +20 -1
- data/lib/ruby2d/image.rb +22 -17
- data/lib/ruby2d/line.rb +3 -1
- data/lib/ruby2d/quad.rb +3 -1
- data/lib/ruby2d/rectangle.rb +1 -1
- data/lib/ruby2d/renderable.rb +0 -12
- data/lib/ruby2d/sound.rb +25 -0
- data/lib/ruby2d/sprite.rb +37 -87
- data/lib/ruby2d/square.rb +1 -1
- data/lib/ruby2d/text.rb +42 -20
- data/lib/ruby2d/texture.rb +28 -0
- data/lib/ruby2d/tileset.rb +40 -22
- data/lib/ruby2d/triangle.rb +3 -1
- data/lib/ruby2d/version.rb +1 -1
- data/lib/ruby2d/vertices.rb +84 -0
- data/lib/ruby2d/window.rb +13 -3
- data/lib/ruby2d.rb +2 -0
- metadata +6 -5
- data/ext/ruby2d/sprite.c +0 -147
- data/ext/ruby2d/tileset.c +0 -30
data/lib/ruby2d/image.rb
CHANGED
@@ -7,26 +7,34 @@ module Ruby2D
|
|
7
7
|
attr_reader :path
|
8
8
|
attr_accessor :x, :y, :width, :height, :rotate, :data
|
9
9
|
|
10
|
-
def
|
10
|
+
def self.load_image(path)
|
11
11
|
unless File.exist? path
|
12
12
|
raise Error, "Cannot find image file `#{path}`"
|
13
13
|
end
|
14
|
+
|
15
|
+
ext_load_image(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(path, opts = {})
|
14
19
|
@path = path
|
20
|
+
|
21
|
+
@texture = Texture.new(*Image.load_image(@path))
|
22
|
+
@width = opts[:width] || @texture.width
|
23
|
+
@height = opts[:height] || @texture.height
|
24
|
+
|
15
25
|
@x = opts[:x] || 0
|
16
26
|
@y = opts[:y] || 0
|
17
27
|
@z = opts[:z] || 0
|
18
|
-
@width = opts[:width] || nil
|
19
|
-
@height = opts[:height] || nil
|
20
28
|
@rotate = opts[:rotate] || 0
|
21
29
|
self.color = opts[:color] || 'white'
|
22
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
23
|
-
|
24
|
-
raise Error, "Image `#{@path}` cannot be created"
|
25
|
-
end
|
30
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
31
|
+
|
26
32
|
unless opts[:show] == false then add end
|
27
33
|
end
|
28
34
|
|
29
35
|
def draw(opts = {})
|
36
|
+
Window.render_ready_check
|
37
|
+
|
30
38
|
opts[:width] = opts[:width] || @width
|
31
39
|
opts[:height] = opts[:height] || @height
|
32
40
|
opts[:rotate] = opts[:rotate] || @rotate
|
@@ -34,20 +42,17 @@ module Ruby2D
|
|
34
42
|
opts[:color] = [1.0, 1.0, 1.0, 1.0]
|
35
43
|
end
|
36
44
|
|
37
|
-
|
38
|
-
self, opts[:x], opts[:y], opts[:width], opts[:height], opts[:rotate],
|
39
|
-
opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
|
40
|
-
])
|
45
|
+
render(x: opts[:x], y: opts[:y], width: opts[:width], height: opts[:height], color: Color.new(opts[:color]), rotate: opts[:rotate])
|
41
46
|
end
|
42
47
|
|
43
48
|
private
|
44
49
|
|
45
|
-
def render
|
46
|
-
|
47
|
-
self, @x, @y, @width, @height, @rotate,
|
48
|
-
@color.r, @color.g, @color.b, @color.a
|
49
|
-
])
|
50
|
-
end
|
50
|
+
def render(x: @x, y: @y, width: @width, height: @height, color: @color, rotate: @rotate)
|
51
|
+
vertices = Vertices.new(x, y, width, height, rotate)
|
51
52
|
|
53
|
+
@texture.draw(
|
54
|
+
vertices.coordinates, vertices.texture_coordinates, color
|
55
|
+
)
|
56
|
+
end
|
52
57
|
end
|
53
58
|
end
|
data/lib/ruby2d/line.rb
CHANGED
@@ -14,7 +14,7 @@ module Ruby2D
|
|
14
14
|
@z = opts[:z] || 0
|
15
15
|
@width = opts[:width] || 2
|
16
16
|
self.color = opts[:color] || 'white'
|
17
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
17
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
18
18
|
add
|
19
19
|
end
|
20
20
|
|
@@ -39,6 +39,8 @@ module Ruby2D
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.draw(opts = {})
|
42
|
+
Window.render_ready_check
|
43
|
+
|
42
44
|
ext_draw([
|
43
45
|
opts[:x1], opts[:y1], opts[:x2], opts[:y2], opts[:width],
|
44
46
|
opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3],
|
data/lib/ruby2d/quad.rb
CHANGED
@@ -25,7 +25,7 @@ module Ruby2D
|
|
25
25
|
@y4 = opts[:y4] || 100
|
26
26
|
@z = opts[:z] || 0
|
27
27
|
self.color = opts[:color] || 'white'
|
28
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
28
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
29
29
|
add
|
30
30
|
end
|
31
31
|
|
@@ -49,6 +49,8 @@ module Ruby2D
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def self.draw(opts = {})
|
52
|
+
Window.render_ready_check
|
53
|
+
|
52
54
|
ext_draw([
|
53
55
|
opts[:x1], opts[:y1], opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3],
|
54
56
|
opts[:x2], opts[:y2], opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3],
|
data/lib/ruby2d/rectangle.rb
CHANGED
@@ -10,7 +10,7 @@ module Ruby2D
|
|
10
10
|
@width = opts[:width] || 200
|
11
11
|
@height = opts[:height] || 100
|
12
12
|
self.color = opts[:color] || 'white'
|
13
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
13
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
14
14
|
update_coords(@x, @y, @width, @height)
|
15
15
|
add
|
16
16
|
end
|
data/lib/ruby2d/renderable.rb
CHANGED
@@ -31,18 +31,6 @@ module Ruby2D
|
|
31
31
|
alias_method :colour, :color
|
32
32
|
alias_method :colour=, :color=
|
33
33
|
|
34
|
-
# Allow shortcuts for setting color values
|
35
|
-
def r; self.color.r end
|
36
|
-
def g; self.color.g end
|
37
|
-
def b; self.color.b end
|
38
|
-
def a; self.color.a end
|
39
|
-
def r=(c); self.color.r = c end
|
40
|
-
def g=(c); self.color.g = c end
|
41
|
-
def b=(c); self.color.b = c end
|
42
|
-
def a=(c); self.color.a = c end
|
43
|
-
def opacity; self.color.opacity end
|
44
|
-
def opacity=(val); self.color.opacity = val end
|
45
|
-
|
46
34
|
# Add a contains method stub
|
47
35
|
def contains?(x, y)
|
48
36
|
x >= @x && x <= (@x + @width) && y >= @y && y <= (@y + @height)
|
data/lib/ruby2d/sound.rb
CHANGED
@@ -26,5 +26,30 @@ module Ruby2D
|
|
26
26
|
ext_length
|
27
27
|
end
|
28
28
|
|
29
|
+
# Get the volume of the sound
|
30
|
+
def volume
|
31
|
+
ext_get_volume
|
32
|
+
end
|
33
|
+
|
34
|
+
# Set the volume of the sound
|
35
|
+
def volume=(v)
|
36
|
+
# Clamp value to between 0-100
|
37
|
+
if v < 0 then v = 0 end
|
38
|
+
if v > 100 then v = 100 end
|
39
|
+
ext_set_volume(v)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the volume of the sound mixer
|
43
|
+
def self.mix_volume
|
44
|
+
ext_get_mix_volume
|
45
|
+
end
|
46
|
+
|
47
|
+
# Set the volume of the sound mixer
|
48
|
+
def self.mix_volume=(v)
|
49
|
+
# Clamp value to between 0-100
|
50
|
+
if v < 0 then v = 0 end
|
51
|
+
if v > 100 then v = 100 end
|
52
|
+
ext_set_mix_volume(v)
|
53
|
+
end
|
29
54
|
end
|
30
55
|
end
|
data/lib/ruby2d/sprite.rb
CHANGED
@@ -5,32 +5,27 @@ module Ruby2D
|
|
5
5
|
include Renderable
|
6
6
|
|
7
7
|
attr_reader :path
|
8
|
-
attr_accessor :rotate, :loop, :clip_x, :clip_y, :clip_width, :clip_height, :data
|
8
|
+
attr_accessor :rotate, :loop, :clip_x, :clip_y, :clip_width, :clip_height, :data, :x, :y, :width, :height
|
9
9
|
|
10
10
|
def initialize(path, opts = {})
|
11
|
-
unless File.exist? path
|
12
|
-
raise Error, "Cannot find sprite image file `#{path}`"
|
13
|
-
end
|
14
|
-
|
15
11
|
# Sprite image file path
|
16
12
|
@path = path
|
17
13
|
|
14
|
+
# Initialize the sprite texture
|
15
|
+
@texture = Texture.new(*Image.load_image(@path))
|
16
|
+
@img_width = @texture.width
|
17
|
+
@img_height = @texture.height
|
18
|
+
|
18
19
|
# Coordinates, size, and rotation of the sprite
|
19
20
|
@x = opts[:x] || 0
|
20
21
|
@y = opts[:y] || 0
|
21
22
|
@z = opts[:z] || 0
|
22
|
-
@width = opts[:width] || nil
|
23
|
-
@height = opts[:height] || nil
|
24
23
|
@rotate = opts[:rotate] || 0
|
25
24
|
self.color = opts[:color] || 'white'
|
26
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
25
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
27
26
|
|
28
|
-
# Flipping status
|
27
|
+
# Flipping status
|
29
28
|
@flip = nil
|
30
|
-
@flip_x = @x
|
31
|
-
@flip_y = @y
|
32
|
-
@flip_width = @width
|
33
|
-
@flip_height = @height
|
34
29
|
|
35
30
|
# Animation attributes
|
36
31
|
@start_time = 0.0
|
@@ -42,20 +37,16 @@ module Ruby2D
|
|
42
37
|
@last_frame = 0
|
43
38
|
@done_proc = nil
|
44
39
|
|
45
|
-
# The sprite image size set by the native extension `ext_init`
|
46
|
-
@img_width = nil; @img_height = nil
|
47
|
-
|
48
|
-
# Initialize the sprite
|
49
|
-
unless ext_init(@path)
|
50
|
-
raise Error, "Sprite image `#{@path}` cannot be created"
|
51
|
-
end
|
52
|
-
|
53
40
|
# The clipping rectangle
|
54
41
|
@clip_x = opts[:clip_x] || 0
|
55
42
|
@clip_y = opts[:clip_y] || 0
|
56
43
|
@clip_width = opts[:clip_width] || @img_width
|
57
44
|
@clip_height = opts[:clip_height] || @img_height
|
58
45
|
|
46
|
+
# Dimensions
|
47
|
+
@width = opts[:width] || nil
|
48
|
+
@height = opts[:height] || nil
|
49
|
+
|
59
50
|
# Set the default animation
|
60
51
|
@animations[:default] = 0..(@img_width / @clip_width) - 1
|
61
52
|
|
@@ -75,38 +66,6 @@ module Ruby2D
|
|
75
66
|
unless opts[:show] == false then add end
|
76
67
|
end
|
77
68
|
|
78
|
-
# Set the x coordinate
|
79
|
-
def x=(x)
|
80
|
-
@x = @flip_x = x
|
81
|
-
if @flip == :horizontal || @flip == :both
|
82
|
-
@flip_x = x + @width
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Set the y coordinate
|
87
|
-
def y=(y)
|
88
|
-
@y = @flip_y = y
|
89
|
-
if @flip == :vertical || @flip == :both
|
90
|
-
@flip_y = y + @height
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# Set the width
|
95
|
-
def width=(width)
|
96
|
-
@width = @flip_width = width
|
97
|
-
if @flip == :horizontal || @flip == :both
|
98
|
-
@flip_width = -width
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Set the height
|
103
|
-
def height=(height)
|
104
|
-
@height = @flip_height = height
|
105
|
-
if @flip == :vertical || @flip == :both
|
106
|
-
@flip_height = -height
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
69
|
# Play an animation
|
111
70
|
def play(opts = {}, &done_proc)
|
112
71
|
|
@@ -165,26 +124,6 @@ module Ruby2D
|
|
165
124
|
end
|
166
125
|
|
167
126
|
@flip = flip
|
168
|
-
|
169
|
-
# Reset flip values
|
170
|
-
@flip_x = @x
|
171
|
-
@flip_y = @y
|
172
|
-
@flip_width = @width
|
173
|
-
@flip_height = @height
|
174
|
-
|
175
|
-
case flip
|
176
|
-
when :horizontal
|
177
|
-
@flip_x = @x + @width
|
178
|
-
@flip_width = -@width
|
179
|
-
when :vertical
|
180
|
-
@flip_y = @y + @height
|
181
|
-
@flip_height = -@height
|
182
|
-
when :both # horizontal and vertical
|
183
|
-
@flip_x = @x + @width
|
184
|
-
@flip_width = -@width
|
185
|
-
@flip_y = @y + @height
|
186
|
-
@flip_height = -@height
|
187
|
-
end
|
188
127
|
end
|
189
128
|
|
190
129
|
# Reset frame to defaults
|
@@ -248,8 +187,10 @@ module Ruby2D
|
|
248
187
|
end
|
249
188
|
|
250
189
|
def draw(opts = {})
|
251
|
-
|
252
|
-
|
190
|
+
Window.render_ready_check
|
191
|
+
|
192
|
+
opts[:width] = opts[:width] || (@width || @clip_width)
|
193
|
+
opts[:height] = opts[:height] || (@height || @clip_height)
|
253
194
|
opts[:rotate] = opts[:rotate] || @rotate
|
254
195
|
opts[:clip_x] = opts[:clip_x] || @clip_x
|
255
196
|
opts[:clip_y] = opts[:clip_y] || @clip_y
|
@@ -259,24 +200,33 @@ module Ruby2D
|
|
259
200
|
opts[:color] = [1.0, 1.0, 1.0, 1.0]
|
260
201
|
end
|
261
202
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
203
|
+
render(x: opts[:x], y: opts[:y], width: opts[:width], height: opts[:height], color: Color.new(color), rotate: opts[:rotate], crop: {
|
204
|
+
x: opts[:clip_x],
|
205
|
+
y: opts[:clip_y],
|
206
|
+
width: opts[:clip_width],
|
207
|
+
height: opts[:clip_height],
|
208
|
+
image_width: @img_width,
|
209
|
+
image_height: @img_height,
|
210
|
+
})
|
267
211
|
end
|
268
212
|
|
269
213
|
private
|
270
214
|
|
271
|
-
def render
|
215
|
+
def render(x: @x, y: @y, width: (@width || @clip_width), height: (@height || @clip_height) , color: @color, rotate: @rotate, flip: @flip, crop: {
|
216
|
+
x: @clip_x,
|
217
|
+
y: @clip_y,
|
218
|
+
width: @clip_width,
|
219
|
+
height: @clip_height,
|
220
|
+
image_width: @img_width,
|
221
|
+
image_height: @img_height,
|
222
|
+
})
|
272
223
|
update
|
273
|
-
self.class.ext_draw([
|
274
|
-
self, @flip_x, @flip_y, @flip_width, @flip_height, @rotate,
|
275
|
-
@clip_x, @clip_y, @clip_width, @clip_height,
|
276
|
-
@color.r, @color.g, @color.b, @color.a
|
277
|
-
])
|
278
|
-
end
|
279
224
|
|
225
|
+
vertices = Vertices.new(x, y, width, height, rotate, crop: crop, flip: flip)
|
280
226
|
|
227
|
+
@texture.draw(
|
228
|
+
vertices.coordinates, vertices.texture_coordinates, color
|
229
|
+
)
|
230
|
+
end
|
281
231
|
end
|
282
232
|
end
|
data/lib/ruby2d/square.rb
CHANGED
@@ -11,7 +11,7 @@ module Ruby2D
|
|
11
11
|
@z = opts[:z] || 0
|
12
12
|
@width = @height = @size = opts[:size] || 100
|
13
13
|
self.color = opts[:color] || 'white'
|
14
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
14
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
15
15
|
update_coords(@x, @y, @size, @size)
|
16
16
|
add
|
17
17
|
end
|
data/lib/ruby2d/text.rb
CHANGED
@@ -4,8 +4,8 @@ module Ruby2D
|
|
4
4
|
class Text
|
5
5
|
include Renderable
|
6
6
|
|
7
|
-
attr_reader :text, :
|
8
|
-
attr_accessor :x, :y, :
|
7
|
+
attr_reader :text, :size
|
8
|
+
attr_accessor :x, :y, :rotate, :data
|
9
9
|
|
10
10
|
def initialize(text, opts = {})
|
11
11
|
@x = opts[:x] || 0
|
@@ -14,43 +14,65 @@ module Ruby2D
|
|
14
14
|
@text = text.to_s
|
15
15
|
@size = opts[:size] || 20
|
16
16
|
@rotate = opts[:rotate] || 0
|
17
|
+
@style = opts[:style]
|
17
18
|
self.color = opts[:color] || 'white'
|
18
|
-
self.opacity = opts[:opacity] if opts[:opacity]
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
unless ext_init
|
24
|
-
raise Error, "Text `#{@text}` cannot be created"
|
25
|
-
end
|
19
|
+
self.color.opacity = opts[:opacity] if opts[:opacity]
|
20
|
+
@font_path = opts[:font] || Font.default
|
21
|
+
create_font
|
22
|
+
create_texture
|
23
|
+
|
26
24
|
unless opts[:show] == false then add end
|
27
25
|
end
|
28
26
|
|
27
|
+
# Returns the path of the font as a string
|
28
|
+
def font
|
29
|
+
@font_path
|
30
|
+
end
|
31
|
+
|
29
32
|
def text=(msg)
|
30
33
|
@text = msg.to_s
|
31
|
-
|
34
|
+
create_texture
|
35
|
+
end
|
36
|
+
|
37
|
+
def size=(size)
|
38
|
+
@size = size
|
39
|
+
create_font
|
40
|
+
create_texture
|
32
41
|
end
|
33
42
|
|
34
43
|
def draw(opts = {})
|
44
|
+
Window.render_ready_check
|
45
|
+
|
35
46
|
opts[:rotate] = opts[:rotate] || @rotate
|
36
47
|
unless opts[:color]
|
37
48
|
opts[:color] = [1.0, 1.0, 1.0, 1.0]
|
38
49
|
end
|
39
50
|
|
40
|
-
|
41
|
-
self, opts[:x], opts[:y], opts[:rotate],
|
42
|
-
opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
|
43
|
-
])
|
51
|
+
render(x: opts[:x], y: opts[:y], color: Color.new(opts[:color]), rotate: opts[:rotate])
|
44
52
|
end
|
45
53
|
|
46
54
|
private
|
47
55
|
|
48
|
-
def render
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
56
|
+
def render(x: @x, y: @y, color: @color, rotate: @rotate)
|
57
|
+
vertices = Vertices.new(x, y, @width, @height, rotate)
|
58
|
+
|
59
|
+
@texture.draw(
|
60
|
+
vertices.coordinates, vertices.texture_coordinates, color
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_font
|
65
|
+
@font = Font.load(@font_path, @size, @style)
|
53
66
|
end
|
54
67
|
|
68
|
+
def create_texture
|
69
|
+
if defined?(@texture)
|
70
|
+
@texture.delete
|
71
|
+
end
|
72
|
+
|
73
|
+
@texture = Texture.new(*Text.ext_load_text(@font.ttf_font, @text))
|
74
|
+
@width = @texture.width
|
75
|
+
@height = @texture.height
|
76
|
+
end
|
55
77
|
end
|
56
78
|
end
|