minigl 2.4.1 → 2.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0de5c7f62aa915f3f4b27bb395d9521f93f21e855192da3e0ae7e9de90b91b6
4
- data.tar.gz: 1f771f1c1281032ed119d3f4717bbd181c838b124b666df6c70b1e130b298ef3
3
+ metadata.gz: 46eaeb260b03c9bcfbac716d7568b01c081d66760d71dc540ca9046050f7d89d
4
+ data.tar.gz: 3de3cd79bd21324af047f1705d641374e92c986ec0f02badf0a5fd9206f228e8
5
5
  SHA512:
6
- metadata.gz: 745596ac394298301ef9cb3d9490aa447931a160de16505634715c888ac31d267b6b059120b15cb48d6ef7f792f889dde07bb0b5c0e41af44204c72232cc6dd0
7
- data.tar.gz: 8306f0e0f22122ccd0e7df3ccf318539132b96028aee6f724ff355a9fc2fb63245f1aed8650e3bfdc9910b3868595c7a05719b04578d04034874b3ba32e8e601
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.1
45
+ ## Version 2.4.3
46
46
 
47
- * Expose `Sprite`'s `img` attribute.
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 donating bitcoins to this wallet: bc1qsp7mypdqvkt88xtnarmaytt0etxfccxr5pt5tk
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
- Mouse.add_click(@z_index || 0, method(:perform_action))
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(:focus))
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
@@ -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
@@ -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
- if c.passable; x_lim = x_aim
308
- elsif rt; x_lim = c.x
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
- if c.passable
317
- y_lim_def = y_lim if dn && @y + @h <= y_lim && y_lim < y_lim_def
318
- elsif (rt && @x + @w > x_lim) || (lf && @x < x_lim)
319
- # Can't limit by x, will limit by y
320
- y_lim_def = y_lim if (dn && y_lim < y_lim_def) || (up && y_lim > y_lim_def)
321
- elsif (dn && @y + @h > y_lim) || (up && @y < y_lim)
322
- # Can't limit by y, will limit by x
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
- x_time = 1.0 * (x_lim - @x - (@speed.x < 0 ? 0 : @w)) / @speed.x
326
- y_time = 1.0 * (y_lim - @y - (@speed.y < 0 ? 0 : @h)) / @speed.y
327
- if x_time > y_time
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, 60, 60, :square3, Vector.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, scale_y: 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.1
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: 2022-06-23 00:00:00.000000000 Z
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