minigl 2.4.1 → 2.4.3
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/README.md +3 -4
- data/lib/minigl/forms.rb +18 -4
- data/lib/minigl/game_object.rb +14 -6
- data/lib/minigl/movement.rb +85 -38
- data/test/collision.rb +49 -0
- data/test/game.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46eaeb260b03c9bcfbac716d7568b01c081d66760d71dc540ca9046050f7d89d
|
4
|
+
data.tar.gz: 3de3cd79bd21324af047f1705d641374e92c986ec0f02badf0a5fd9206f228e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33675d555bd833c359f548bff9c16ef95da819ecc084ecbc657c60016d5e3d18255cd19da03252b212e53bb8600a5a0c4c9f4ab4893261377a7f4f20a03d991b
|
7
|
+
data.tar.gz: 3f9ed35d874c81bca4544a42c7f6106c0f3b26ba69bf5bfcba59f201297588be32aa6a2f697f2ea4ffde846e8f46fd2d42c5bc68142ec925cf9f8cd6bc5542cf
|
data/README.md
CHANGED
@@ -42,12 +42,11 @@ After installing the Gosu dependencies, you can just `gem install minigl`.
|
|
42
42
|
* The [wiki](https://github.com/victords/minigl/wiki) is a work in progress with tutorials and examples.
|
43
43
|
* Test package and examples aren't complete!
|
44
44
|
|
45
|
-
## Version 2.4.
|
45
|
+
## Version 2.4.3
|
46
46
|
|
47
|
-
*
|
48
|
-
* Fix `Effect#draw`'s `z_index` parameter.
|
47
|
+
* Fixed a collision checking bug in `Movement#move`.
|
49
48
|
|
50
49
|
## Contributing
|
51
50
|
|
52
51
|
Contributions are very welcome. Feel free to fork and send pull requests.
|
53
|
-
Also, you can support my work by
|
52
|
+
Also, you can support my work by purchasing any of my games on [itch.io](https://victords.itch.io) or [Super Bombinhas on Steam](https://store.steampowered.com/app/1553840).
|
data/lib/minigl/forms.rb
CHANGED
@@ -365,7 +365,7 @@ module MiniGL
|
|
365
365
|
elsif mouse_rel
|
366
366
|
@img_index = 1
|
367
367
|
@state = :over
|
368
|
-
|
368
|
+
enqueue_action
|
369
369
|
else
|
370
370
|
@img_index = 2
|
371
371
|
end
|
@@ -444,6 +444,10 @@ module MiniGL
|
|
444
444
|
|
445
445
|
private
|
446
446
|
|
447
|
+
def enqueue_action
|
448
|
+
Mouse.add_click(@z_index || 0, method(:perform_action))
|
449
|
+
end
|
450
|
+
|
447
451
|
def perform_action
|
448
452
|
@action.call(@params) if @action
|
449
453
|
end
|
@@ -524,7 +528,7 @@ module MiniGL
|
|
524
528
|
|
525
529
|
super
|
526
530
|
@img_index *= 2
|
527
|
-
@img_index += 1 if @checked
|
531
|
+
@img_index += 1 if @checked && !@toggling || !@checked && @toggling
|
528
532
|
end
|
529
533
|
|
530
534
|
# Sets the state of the button to the value given.
|
@@ -544,8 +548,14 @@ module MiniGL
|
|
544
548
|
|
545
549
|
private
|
546
550
|
|
551
|
+
def enqueue_action
|
552
|
+
super
|
553
|
+
@toggling = true
|
554
|
+
end
|
555
|
+
|
547
556
|
def perform_action
|
548
557
|
@checked = !@checked
|
558
|
+
@toggling = false
|
549
559
|
@action.call(@checked, @params) if @action
|
550
560
|
end
|
551
561
|
end
|
@@ -720,7 +730,7 @@ module MiniGL
|
|
720
730
|
end
|
721
731
|
set_cursor_visible
|
722
732
|
elsif Mouse.button_pressed? :left
|
723
|
-
Mouse.add_click(@z_index || 0, method(:
|
733
|
+
Mouse.add_click(@z_index || 0, method(:focus_and_set_anchor))
|
724
734
|
elsif Mouse.button_down? :left
|
725
735
|
if @anchor1 and not @double_clicked
|
726
736
|
set_node_by_mouse
|
@@ -912,7 +922,6 @@ module MiniGL
|
|
912
922
|
def focus
|
913
923
|
@focused = true
|
914
924
|
set_node_by_mouse
|
915
|
-
@anchor1 = @cur_node
|
916
925
|
@anchor2 = nil
|
917
926
|
@double_clicked = false
|
918
927
|
set_cursor_visible
|
@@ -996,6 +1005,11 @@ module MiniGL
|
|
996
1005
|
|
997
1006
|
private
|
998
1007
|
|
1008
|
+
def focus_and_set_anchor
|
1009
|
+
focus
|
1010
|
+
@anchor1 = @cur_node
|
1011
|
+
end
|
1012
|
+
|
999
1013
|
def set_cursor_visible
|
1000
1014
|
@cursor_visible = true
|
1001
1015
|
@cursor_timer = 0
|
data/lib/minigl/game_object.rb
CHANGED
@@ -271,18 +271,20 @@ module MiniGL
|
|
271
271
|
end
|
272
272
|
|
273
273
|
color = (alpha << 24) | color
|
274
|
+
img_gap_scale_x = scale_image_gap? ? scale_x : 1
|
275
|
+
img_gap_scale_y = scale_image_gap? ? scale_y : 1
|
274
276
|
if angle
|
275
277
|
center_x = @x + @w * 0.5
|
276
278
|
center_y = @y + @h * 0.5
|
277
|
-
o_x = center_x - @x - @img_gap.x
|
278
|
-
o_y = center_y - @y - @img_gap.y
|
279
|
-
@img[@img_index].draw_rot @x + (flip == :horiz ? -1 : 1) * (@img_gap.x + o_x) - (map ? map.cam.x : 0),
|
280
|
-
@y + (flip == :vert ? -1 : 1) * (@img_gap.y + o_y) - (map ? map.cam.y : 0),
|
279
|
+
o_x = center_x - @x - @img_gap.x * img_gap_scale_x
|
280
|
+
o_y = center_y - @y - @img_gap.y * img_gap_scale_y
|
281
|
+
@img[@img_index].draw_rot @x + (flip == :horiz ? -1 : 1) * (@img_gap.x * img_gap_scale_x + o_x) - (map ? map.cam.x : 0),
|
282
|
+
@y + (flip == :vert ? -1 : 1) * (@img_gap.y * img_gap_scale_y + o_y) - (map ? map.cam.y : 0),
|
281
283
|
z_index, angle, o_x.to_f / (@img[0].width * scale_x), o_y.to_f / (@img[0].height * scale_y),
|
282
284
|
(flip == :horiz ? -scale_x : scale_x), (flip == :vert ? -scale_y : scale_y), color
|
283
285
|
else
|
284
|
-
x = @x + (flip == :horiz ? -1 : 1) * @img_gap.x - (map ? map.cam.x : 0) + (flip == :horiz ? @w : 0)
|
285
|
-
y = @y + (flip == :vert ? -1 : 1) * @img_gap.y - (map ? map.cam.y : 0) + (flip == :vert ? @h : 0)
|
286
|
+
x = @x + (flip == :horiz ? -1 : 1) * @img_gap.x * img_gap_scale_x - (map ? map.cam.x : 0) + (flip == :horiz ? @w : 0)
|
287
|
+
y = @y + (flip == :vert ? -1 : 1) * @img_gap.y * img_gap_scale_y - (map ? map.cam.y : 0) + (flip == :vert ? @h : 0)
|
286
288
|
@img[@img_index].draw (round ? x.round : x), (round ? y.round : y),
|
287
289
|
z_index, (flip == :horiz ? -scale_x : scale_x),
|
288
290
|
(flip == :vert ? -scale_y : scale_y), color
|
@@ -297,6 +299,12 @@ module MiniGL
|
|
297
299
|
return Rectangle.new(0, 0, G.window.width, G.window.height).intersect? r if map.nil?
|
298
300
|
map.cam.intersect? r
|
299
301
|
end
|
302
|
+
|
303
|
+
# override this if you don't want the image_gap to be scaled when drawing
|
304
|
+
# the object scaled.
|
305
|
+
def scale_image_gap?
|
306
|
+
true
|
307
|
+
end
|
300
308
|
end
|
301
309
|
|
302
310
|
# Represents a visual effect, i.e., a graphic - usually animated - that shows
|
data/lib/minigl/movement.rb
CHANGED
@@ -40,6 +40,10 @@ module MiniGL
|
|
40
40
|
def bounds
|
41
41
|
Rectangle.new @x, @y, @w, @h
|
42
42
|
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
"Block(#{@x}, #{@y}, #{@w}, #{@h}#{@passable ? ", passable" : ''})"
|
46
|
+
end
|
43
47
|
end
|
44
48
|
|
45
49
|
# Represents a ramp, i.e., an inclined structure which allows walking over
|
@@ -301,48 +305,28 @@ module MiniGL
|
|
301
305
|
end
|
302
306
|
else
|
303
307
|
# Diagonal
|
304
|
-
x_aim = @x + @speed.x + (rt ? @w : 0); x_lim_def = x_aim
|
305
|
-
y_aim = @y + @speed.y + (dn ? @h : 0); y_lim_def = y_aim
|
308
|
+
x_aim = @x + @speed.x + (rt ? @w : 0); x_lim_def = [x_aim, nil]
|
309
|
+
y_aim = @y + @speed.y + (dn ? @h : 0); y_lim_def = [y_aim, nil]
|
306
310
|
coll_list.each do |c|
|
307
|
-
|
308
|
-
|
309
|
-
else; x_lim = c.x + c.w
|
310
|
-
end
|
311
|
-
if dn; y_lim = c.y
|
312
|
-
elsif c.passable; y_lim = y_aim
|
313
|
-
else; y_lim = c.y + c.h
|
314
|
-
end
|
311
|
+
find_limits(c, x_aim, y_aim, x_lim_def, y_lim_def, up, rt, dn, lf)
|
312
|
+
end
|
315
313
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
x_lim_def = x_lim if (rt && x_lim < x_lim_def) || (lf && x_lim > x_lim_def)
|
314
|
+
if x_lim_def[0] != x_aim && y_lim_def[0] != y_aim
|
315
|
+
x_time = (x_lim_def[0] - @x - (lf ? 0 : @w)).to_f / @speed.x
|
316
|
+
y_time = (y_lim_def[0] - @y - (up ? 0 : @h)).to_f / @speed.y
|
317
|
+
if x_time < y_time
|
318
|
+
stop_at_x(x_lim_def[0], lf)
|
319
|
+
move_bounds = Rectangle.new(@x, up ? @y + @speed.y : @y, @w, @h + @speed.y.abs)
|
320
|
+
stop_at_y(y_lim_def[0], up) if move_bounds.intersect?(y_lim_def[1].bounds)
|
324
321
|
else
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
# Will limit by x
|
329
|
-
x_lim_def = x_lim if (rt && x_lim < x_lim_def) || (lf && x_lim > x_lim_def)
|
330
|
-
elsif (dn && y_lim < y_lim_def) || (up && y_lim > y_lim_def)
|
331
|
-
y_lim_def = y_lim
|
332
|
-
end
|
333
|
-
end
|
334
|
-
end
|
335
|
-
if x_lim_def != x_aim
|
336
|
-
@speed.x = 0
|
337
|
-
if lf; @x = x_lim_def
|
338
|
-
else; @x = x_lim_def - @w
|
339
|
-
end
|
340
|
-
end
|
341
|
-
if y_lim_def != y_aim
|
342
|
-
@speed.y = 0
|
343
|
-
if up; @y = y_lim_def
|
344
|
-
else; @y = y_lim_def - @h
|
322
|
+
stop_at_y(y_lim_def[0], up)
|
323
|
+
move_bounds = Rectangle.new(lf ? @x + @speed.x : @x, @y, @w + @speed.x.abs, @h)
|
324
|
+
stop_at_x(x_lim_def[0], lf) if move_bounds.intersect?(x_lim_def[1].bounds)
|
345
325
|
end
|
326
|
+
elsif x_lim_def[0] != x_aim
|
327
|
+
stop_at_x(x_lim_def[0], lf)
|
328
|
+
elsif y_lim_def[0] != y_aim
|
329
|
+
stop_at_y(y_lim_def[0], up)
|
346
330
|
end
|
347
331
|
end
|
348
332
|
end
|
@@ -606,5 +590,68 @@ module MiniGL
|
|
606
590
|
end
|
607
591
|
limit
|
608
592
|
end
|
593
|
+
|
594
|
+
def find_limits(obj, x_aim, y_aim, x_lim_def, y_lim_def, up, rt, dn, lf)
|
595
|
+
x_lim =
|
596
|
+
if obj.passable
|
597
|
+
x_aim
|
598
|
+
elsif rt
|
599
|
+
obj.x
|
600
|
+
else
|
601
|
+
obj.x + obj.w
|
602
|
+
end
|
603
|
+
|
604
|
+
y_lim =
|
605
|
+
if dn
|
606
|
+
obj.y
|
607
|
+
elsif obj.passable
|
608
|
+
y_aim
|
609
|
+
else
|
610
|
+
obj.y + obj.h
|
611
|
+
end
|
612
|
+
|
613
|
+
x_v = x_lim_def[0]; y_v = y_lim_def[0]
|
614
|
+
if obj.passable
|
615
|
+
if dn && @y + @h <= y_lim && y_lim < y_v
|
616
|
+
y_lim_def[0] = y_lim
|
617
|
+
y_lim_def[1] = obj
|
618
|
+
end
|
619
|
+
elsif (rt && @x + @w > x_lim) || (lf && @x < x_lim)
|
620
|
+
# Can't limit by x, will limit by y
|
621
|
+
if (dn && y_lim < y_v) || (up && y_lim > y_v)
|
622
|
+
y_lim_def[0] = y_lim
|
623
|
+
y_lim_def[1] = obj
|
624
|
+
end
|
625
|
+
elsif (dn && @y + @h > y_lim) || (up && @y < y_lim)
|
626
|
+
# Can't limit by y, will limit by x
|
627
|
+
if (rt && x_lim < x_v) || (lf && x_lim > x_v)
|
628
|
+
x_lim_def[0] = x_lim
|
629
|
+
x_lim_def[1] = obj
|
630
|
+
end
|
631
|
+
else
|
632
|
+
x_time = (x_lim - @x - (lf ? 0 : @w)).to_f / @speed.x
|
633
|
+
y_time = (y_lim - @y - (up ? 0 : @h)).to_f / @speed.y
|
634
|
+
if x_time > y_time
|
635
|
+
# Will limit by x
|
636
|
+
if (rt && x_lim < x_v) || (lf && x_lim > x_v)
|
637
|
+
x_lim_def[0] = x_lim
|
638
|
+
x_lim_def[1] = obj
|
639
|
+
end
|
640
|
+
elsif (dn && y_lim < y_v) || (up && y_lim > y_v)
|
641
|
+
y_lim_def[0] = y_lim
|
642
|
+
y_lim_def[1] = obj
|
643
|
+
end
|
644
|
+
end
|
645
|
+
end
|
646
|
+
|
647
|
+
def stop_at_x(x, moving_left)
|
648
|
+
@speed.x = 0
|
649
|
+
@x = moving_left ? x : x - @w
|
650
|
+
end
|
651
|
+
|
652
|
+
def stop_at_y(y, moving_up)
|
653
|
+
@speed.y = 0
|
654
|
+
@y = moving_up ? y : y - @h
|
655
|
+
end
|
609
656
|
end
|
610
657
|
end
|
data/test/collision.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative '../lib/minigl'
|
2
|
+
|
3
|
+
include MiniGL
|
4
|
+
|
5
|
+
class CollisionTest < GameWindow
|
6
|
+
def initialize
|
7
|
+
super(300, 300, false)
|
8
|
+
|
9
|
+
@object = GameObject.new(0, 150, 50, 50, :img1)
|
10
|
+
@object.max_speed.x = @object.max_speed.y = 1000
|
11
|
+
@blocks = [
|
12
|
+
Block.new(0, 0, 100, 100),
|
13
|
+
Block.new(100, 0, 100, 100),
|
14
|
+
Block.new(200, 100, 100, 100),
|
15
|
+
Block.new(200, 200, 100, 100),
|
16
|
+
]
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
KB.update
|
21
|
+
|
22
|
+
forces = Vector.new
|
23
|
+
if KB.key_pressed?(Gosu::KB_Z)
|
24
|
+
@object.x = 0
|
25
|
+
@object.y = 150
|
26
|
+
end
|
27
|
+
forces = Vector.new(60, -100) if KB.key_pressed?(Gosu::KB_X)
|
28
|
+
if KB.key_pressed?(Gosu::KB_C)
|
29
|
+
@object.x = 100
|
30
|
+
@object.y = 250
|
31
|
+
end
|
32
|
+
forces = Vector.new(100, -60) if KB.key_pressed?(Gosu::KB_V)
|
33
|
+
if KB.key_pressed?(Gosu::KB_B)
|
34
|
+
@object.x = 100
|
35
|
+
@object.y = 150
|
36
|
+
end
|
37
|
+
|
38
|
+
@object.move(forces, @blocks, [], true)
|
39
|
+
end
|
40
|
+
|
41
|
+
def draw
|
42
|
+
@blocks.each_with_index do |block, i|
|
43
|
+
draw_rect(block.x, block.y, block.w, block.h, i.even? ? 0xffffffff : 0xffcccccc)
|
44
|
+
end
|
45
|
+
draw_rect(@object.x, @object.y, @object.w, @object.h, 0xffffffff)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
CollisionTest.new.show
|
data/test/game.rb
CHANGED
@@ -6,7 +6,7 @@ class MyGame < GameWindow
|
|
6
6
|
super 800, 600, false
|
7
7
|
|
8
8
|
# @img = Res.img :img1
|
9
|
-
@obj1 = GameObject.new 75, 75,
|
9
|
+
@obj1 = GameObject.new 75, 75, 40, 40, :square3, Vector.new(-50, -50)
|
10
10
|
@obj2 = Sprite.new 400, 0, :img1
|
11
11
|
@obj3 = GameObject.new 4, 50, 24, 24, :check, Vector.new(-4, -4), 2, 4
|
12
12
|
@obj3.set_animation 1
|
@@ -137,7 +137,7 @@ class MyGame < GameWindow
|
|
137
137
|
clear 0xabcdef
|
138
138
|
|
139
139
|
# @img.draw_rot 400, 100, 0, @angle, 1, 1
|
140
|
-
@obj1.draw color: 0x33ff33, angle: (@angle == 0 ? nil : @angle), scale_x: 1.5
|
140
|
+
@obj1.draw color: 0x33ff33, angle: (@angle == 0 ? nil : @angle), scale_x: 1.5
|
141
141
|
@obj2.draw angle: (@angle == 0 ? nil : @angle), scale_x: 0.5, scale_y: 1.4
|
142
142
|
@obj3.draw flip: @flip
|
143
143
|
@obj4.draw round: true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minigl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor David Santos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/minigl/map.rb
|
48
48
|
- lib/minigl/movement.rb
|
49
49
|
- lib/minigl/text.rb
|
50
|
+
- test/collision.rb
|
50
51
|
- test/data/font/font1.ttf
|
51
52
|
- test/data/img/barbg.png
|
52
53
|
- test/data/img/barbg.svg
|
@@ -108,6 +109,7 @@ signing_key:
|
|
108
109
|
specification_version: 4
|
109
110
|
summary: MiniGL
|
110
111
|
test_files:
|
112
|
+
- test/collision.rb
|
111
113
|
- test/game.rb
|
112
114
|
- test/game_object_tests.rb
|
113
115
|
- test/iso_game.rb
|