minigl 2.3.8 → 2.4.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a080b868fab24c01aaa591dcb2c5b087cc2b1bd4a86b1a649691a5e53aaa27e4
4
- data.tar.gz: 117867b84b262cbc6d30adb68e0756d9d3e62246ae9fb57cd03377cc564339ed
3
+ metadata.gz: c0de5c7f62aa915f3f4b27bb395d9521f93f21e855192da3e0ae7e9de90b91b6
4
+ data.tar.gz: 1f771f1c1281032ed119d3f4717bbd181c838b124b666df6c70b1e130b298ef3
5
5
  SHA512:
6
- metadata.gz: 2c1ee1a615f081b4c6b36b547c7a187553cdf91aa5f7026c35b9d6e2087d9c9b461f2b60f37f56ce20739080be5277ee99f6b4f01bc50578c6887fc18c2cbbe8
7
- data.tar.gz: c000b6516264435786de8bc90858d644cbb1938128d984fd4c75938593514b07585651a5b8363e65ebbda415c151b028c934284f65e1b14cae7b3435a5bb92b5
6
+ metadata.gz: 745596ac394298301ef9cb3d9490aa447931a160de16505634715c888ac31d267b6b059120b15cb48d6ef7f792f889dde07bb0b5c0e41af44204c72232cc6dd0
7
+ data.tar.gz: 8306f0e0f22122ccd0e7df3ccf318539132b96028aee6f724ff355a9fc2fb63245f1aed8650e3bfdc9910b3868595c7a05719b04578d04034874b3ba32e8e601
data/README.md CHANGED
@@ -16,9 +16,14 @@ to victordavidsantos@gmail.com.
16
16
 
17
17
  ## Made with MiniGL
18
18
 
19
- Below are two full games built with MiniGL, both available for free download and also open source.
19
+ Below are some games built with MiniGL, all available for free download and also open source.
20
20
  * [Super Bombinhas](https://github.com/victords/super-bombinhas)
21
21
  * [ConnecMan](https://github.com/victords/connecman)
22
+ * [SokoAdventure](https://github.com/victords/sokoadventure)
23
+ * [Spheres](https://github.com/victords/spheres)
24
+ * [Willy the droid](https://github.com/gavr-games/willy_the_droid)
25
+
26
+ Download Super Bombinhas, ConnecMan, SokoAdventure and Spheres in my [itch.io page](https://victords.itch.io).
22
27
 
23
28
  If you create a project using MiniGL, feel free to open a PR to include it in this list.
24
29
 
@@ -37,10 +42,10 @@ After installing the Gosu dependencies, you can just `gem install minigl`.
37
42
  * The [wiki](https://github.com/victords/minigl/wiki) is a work in progress with tutorials and examples.
38
43
  * Test package and examples aren't complete!
39
44
 
40
- ## Version 2.3.8
45
+ ## Version 2.4.1
41
46
 
42
- * Exposed `Effect`'s `lifetime`, `elapsed_time` and `time_left` properties.
43
- * Added the `char_spacing` parameter to the `ImageFont` class and exposed some existing properties.
47
+ * Expose `Sprite`'s `img` attribute.
48
+ * Fix `Effect#draw`'s `z_index` parameter.
44
49
 
45
50
  ## Contributing
46
51
 
data/lib/minigl/forms.rb CHANGED
@@ -317,12 +317,12 @@ module MiniGL
317
317
  super x, y, font, text, text_color, disabled_text_color
318
318
  @over_text_color = over_text_color
319
319
  @down_text_color = down_text_color
320
- if center_x; @text_x = x + @w / 2 if @w
321
- else; @text_x = x + margin_x * @scale_x; end
322
- if center_y; @text_y = y + @h / 2 if @h
323
- else; @text_y = y + margin_y * @scale_y; end
324
320
  @center_x = center_x
325
321
  @center_y = center_y
322
+ @margin_x = margin_x
323
+ @margin_y = margin_y
324
+ set_position(x, y)
325
+
326
326
  @action = action
327
327
  @params = params
328
328
 
@@ -393,10 +393,10 @@ module MiniGL
393
393
  # [x] The new x-coordinate for the button.
394
394
  # [y] The new y-coordinate for the button.
395
395
  def set_position(x, y)
396
- if @center_x; @text_x = x + @w / 2
397
- else; @text_x += x - @x; end
398
- if @center_y; @text_y = y + @h / 2
399
- else; @text_y += y - @y; end
396
+ @text_x = @center_x ? x + @w / 2 : x
397
+ @text_y = @center_y ? y + @h / 2 : y
398
+ @text_x += @margin_x
399
+ @text_y += @margin_y
400
400
  @x = x; @y = y
401
401
  end
402
402
 
@@ -445,7 +445,7 @@ module MiniGL
445
445
  private
446
446
 
447
447
  def perform_action
448
- @action.call @params if @action
448
+ @action.call(@params) if @action
449
449
  end
450
450
  end
451
451
 
@@ -514,8 +514,6 @@ module MiniGL
514
514
  else; height * @scale_y; end
515
515
  _, x, y = FormUtils.check_anchor(anchor, @anchor_offset_x, @anchor_offset_y, @w, @h)
516
516
  set_position(x, y)
517
- @text_x = x + @w / 2 if center_x
518
- @text_y = y + @h / 2 if center_y
519
517
  @checked = checked
520
518
  end
521
519
 
@@ -3,6 +3,9 @@ require_relative 'movement'
3
3
  module MiniGL
4
4
  # This class represents an (optionally animated) image inside the game screen.
5
5
  class Sprite
6
+ # The list of images of this sprite (i.e. the spritesheet).
7
+ attr_reader :img
8
+
6
9
  # The index of the current sprite in the spritesheet being drawn.
7
10
  attr_reader :img_index
8
11
 
@@ -384,7 +387,7 @@ module MiniGL
384
387
  @dead = true if @elapsed_time == @lifetime
385
388
  end
386
389
 
387
- def draw(map = nil, scale_x = 1, scale_y = 1, alpha = 0xff, color = 0xffffff, angle = nil, z_index = 0)
390
+ def draw(map = nil, scale_x = 1, scale_y = 1, alpha = 0xff, color = 0xffffff, angle = nil, flip = nil, z_index = 0, round = false)
388
391
  super unless @dead
389
392
  end
390
393
 
data/lib/minigl/global.rb CHANGED
@@ -245,6 +245,16 @@ module MiniGL
245
245
  def toggle_fullscreen
246
246
  self.fullscreen = !fullscreen?
247
247
  end
248
+
249
+ def button_down(id)
250
+ super
251
+ Mouse.register_button_down(id)
252
+ end
253
+
254
+ def button_up(id)
255
+ super
256
+ Mouse.register_button_up(id)
257
+ end
248
258
  end
249
259
 
250
260
  # Exposes methods for controlling keyboard and gamepad events.
@@ -387,6 +397,7 @@ module MiniGL
387
397
  def initialize
388
398
  @down = {}
389
399
  @prev_down = {}
400
+ @next_down = {}
390
401
  @dbl_click = {}
391
402
  @dbl_click_timer = {}
392
403
  end
@@ -394,7 +405,8 @@ module MiniGL
394
405
  # Updates the mouse position and the state of all buttons.
395
406
  def update
396
407
  @prev_down = @down.clone
397
- @down.clear
408
+ @down = @next_down.clone
409
+ @next_down.delete_if { |_, v| v.zero? }
398
410
  @dbl_click.clear
399
411
 
400
412
  if @click
@@ -403,19 +415,19 @@ module MiniGL
403
415
  end
404
416
 
405
417
  @dbl_click_timer.each do |k, v|
406
- if v < G.double_click_delay; @dbl_click_timer[k] += 1
407
- else; @dbl_click_timer.delete k; end
418
+ if v < G.double_click_delay
419
+ @dbl_click_timer[k] += 1
420
+ else
421
+ @dbl_click_timer.delete(k)
422
+ end
408
423
  end
409
424
 
410
- k1 = [Gosu::MsLeft, Gosu::MsMiddle, Gosu::MsRight]
411
- k2 = [:left, :middle, :right]
412
- (0..2).each do |i|
413
- if G.window.button_down? k1[i]
414
- @down[k2[i]] = true
415
- @dbl_click[k2[i]] = true if @dbl_click_timer[k2[i]]
416
- @dbl_click_timer.delete k2[i]
417
- elsif @prev_down[k2[i]]
418
- @dbl_click_timer[k2[i]] = 0
425
+ %i[left middle right].each do |key|
426
+ if @down[key]
427
+ @dbl_click[key] = true if @dbl_click_timer[key]
428
+ @dbl_click_timer.delete(key)
429
+ elsif @prev_down[key]
430
+ @dbl_click_timer[key] = 0
419
431
  end
420
432
  end
421
433
 
@@ -486,6 +498,31 @@ module MiniGL
486
498
 
487
499
  @click = { z_index: z_index, action: action }
488
500
  end
501
+
502
+ # :nodoc:
503
+ def register_button_down(id)
504
+ key = key_from_id(id)
505
+ @next_down[key] = 1 if key
506
+ end
507
+
508
+ # :nodoc:
509
+ def register_button_up(id)
510
+ key = key_from_id(id)
511
+ @next_down[key] = 0 if key && @next_down[key]
512
+ end
513
+
514
+ private
515
+
516
+ def key_from_id(id)
517
+ case id
518
+ when Gosu::MS_LEFT
519
+ :left
520
+ when Gosu::MS_RIGHT
521
+ :right
522
+ when Gosu::MS_MIDDLE
523
+ :middle
524
+ end
525
+ end
489
526
  end
490
527
  end
491
528
 
@@ -0,0 +1,79 @@
1
+ module MiniGL
2
+ # This class provides methods to easily retrieve string translations from
3
+ # text files.
4
+ class Localization
5
+ class << self
6
+ # The list of available languages. These are symbols corresponding to the
7
+ # names of the files in data/text, without the '.txt' extension.
8
+ attr_reader :languages
9
+
10
+ # The current language. It's a symbol corresponding to the name of the
11
+ # file in data/text for that language, without the '.txt' extension.
12
+ attr_reader :language
13
+
14
+ # Initializes the localization system. If you're using a custom
15
+ # +Res.prefix+, call this _after_ setting it.
16
+ #
17
+ # The localization system will look for files with extension '.txt' in
18
+ # the <code>[Res.prefix]/data/text</code> folder. In each file,
19
+ # each string should be specified in one line, with the following format:
20
+ #
21
+ # <code>identifier content content content...</code>
22
+ #
23
+ # Use tab characters between the identifier and the text, not white
24
+ # spaces. This makes it easier to make all the texts aligned and is
25
+ # required for the localization system to work. The identifiers will be
26
+ # used as symbols when retrieving strings.
27
+ #
28
+ # The text contents support placeholders, i.e., markers that can be
29
+ # replaced by arguments you pass to +Localization.text+. To specify a
30
+ # placeholder, simply use the '$' character. For example, if your string
31
+ # is:
32
+ #
33
+ # <code>my_string Values: $ and $</code>
34
+ #
35
+ # the call <code>Localization.text(:my_string, 'test', 10)</code> will
36
+ # result in "Values: test and 10."
37
+ #
38
+ # To include a literal '$'
39
+ # in the text, use '\\$' (without the quotes). Similarly, use '\\\\' to
40
+ # represent a literal backslash, and just '\\' to represent a line break
41
+ # (i.e. a "\\n" in the resulting string).
42
+ def initialize
43
+ @languages = []
44
+ @texts = {}
45
+ files = Dir["#{Res.prefix}text/*.txt"].sort
46
+ files.each do |f|
47
+ lang = f.split('/')[-1].chomp('.txt').to_sym
48
+ @languages << lang
49
+ @texts[lang] = {}
50
+ File.open(f).each do |l|
51
+ parts = l.split("\t")
52
+ @texts[lang][parts[0].to_sym] = parts[-1].chomp
53
+ end
54
+ end
55
+
56
+ @language = @languages[0]
57
+ end
58
+
59
+ # Sets the current language. +value+ must be a symbol corresponding to
60
+ # the name of a file in data/text, without the '.txt' extension.
61
+ def language=(value)
62
+ raise "Can't set to invalid language #{value}" unless @languages.include?(value)
63
+
64
+ @language = value
65
+ end
66
+
67
+ # Retrieves the string identified by +id+ in the current language.
68
+ #
69
+ # See +Localization.initialize+ for details on how to use +args+.
70
+ def text(id, *args)
71
+ value = @texts[@language][id] || '<MISSING STRING>'
72
+ args.each do |arg|
73
+ value = value.sub(/(^|[^\\])\$/, "\\1#{arg}")
74
+ end
75
+ value.gsub('\\$', '$').gsub(/\\(.|$)/) { |m| m[1] == '\\' ? '\\' : "\n#{m[1]}" }
76
+ end
77
+ end
78
+ end
79
+ end
data/lib/minigl.rb CHANGED
@@ -2,3 +2,4 @@ require_relative 'minigl/game_object'
2
2
  require_relative 'minigl/map'
3
3
  require_relative 'minigl/text'
4
4
  require_relative 'minigl/forms'
5
+ require_relative 'minigl/localization'
@@ -0,0 +1,6 @@
1
+ str1 Common string.
2
+ str2 String with \$ dollar sign.
3
+ str3 $ should be replaced.
4
+ str4 Should replace both $ and $.
5
+ str5 String with \\ backslash.
6
+ str6 String with\line breaks.\
@@ -0,0 +1,6 @@
1
+ str1 String comum.
2
+ str2 String com \$ cifrão.
3
+ str3 $ deve ser substituído.
4
+ str4 Deve substituir $ e $.
5
+ str5 String com \\ barra invertida.
6
+ str6 String com\quebras de linha.\
data/test/game.rb CHANGED
@@ -19,7 +19,7 @@ class MyGame < GameWindow
19
19
  @font2 = Res.font :font1, 50
20
20
  @writer1 = TextHelper.new @font1, 5
21
21
  @writer2 = TextHelper.new @font2, 5
22
- @btn = Button.new(10, 560, @font1, 'Test', :btn, 0x008000, 0x808080, 0xffffff, 0xff9980, true, true, 0, 4, 0, 0, 'friends', nil, 2, 2) { |x| puts "hello #{x}" }
22
+ @btn = Button.new(10, 560, @font1, 'Test', :btn, 0x008000, 0x808080, 0xffffff, 0xff9980, true, false, -10, 4, 0, 0, 'friends', nil, 2, 2) { |x| puts "hello #{x}" }
23
23
  @btn.enabled = false
24
24
  @chk =
25
25
  ToggleButton.new(x: 0, y: 30, font: @font1, text: 'Click me', img: :check, center_x: false, margin_x: 36, params: 'friends', anchor: :south) { |c, x|
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+ require_relative '../lib/minigl'
3
+ include MiniGL
4
+
5
+ class LocalizationTest < Test::Unit::TestCase
6
+ def setup
7
+ Res.prefix = File.expand_path(File.dirname(__FILE__)) + '/data'
8
+ Localization.initialize
9
+ end
10
+
11
+ def test_languages
12
+ assert_equal([:english, :portuguese], Localization.languages)
13
+ end
14
+
15
+ def test_language
16
+ assert_equal(:english, Localization.language)
17
+ Localization.language = :portuguese
18
+ assert_equal(:portuguese, Localization.language)
19
+ assert_raise { Localization.language = :invalid }
20
+ assert_equal(:portuguese, Localization.language)
21
+ end
22
+
23
+ def test_strings
24
+ assert_equal('Common string.', Localization.text(:str1))
25
+ assert_equal('String with $ dollar sign.', Localization.text(:str2))
26
+ assert_equal('something should be replaced.', Localization.text(:str3, 'something'))
27
+ assert_equal('Should replace both 5 and true.', Localization.text(:str4, 5, true))
28
+ assert_equal('String with \\ backslash.', Localization.text(:str5))
29
+ assert_equal("String with\nline breaks.\n", Localization.text(:str6))
30
+ assert_equal('<MISSING STRING>', Localization.text(:str7))
31
+
32
+ Localization.language = :portuguese
33
+ assert_equal('String comum.', Localization.text(:str1))
34
+ assert_equal('String com $ cifrão.', Localization.text(:str2))
35
+ assert_equal('algo deve ser substituído.', Localization.text(:str3, 'algo'))
36
+ assert_equal('Deve substituir 5 e true.', Localization.text(:str4, 5, true))
37
+ assert_equal('String com \\ barra invertida.', Localization.text(:str5))
38
+ assert_equal("String com\nquebras de linha.\n", Localization.text(:str6))
39
+ assert_equal('<MISSING STRING>', Localization.text(:str7))
40
+ end
41
+ end
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.3.8
4
+ version: 2.4.1
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-03-09 00:00:00.000000000 Z
11
+ date: 2022-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -43,6 +43,7 @@ files:
43
43
  - lib/minigl/forms.rb
44
44
  - lib/minigl/game_object.rb
45
45
  - lib/minigl/global.rb
46
+ - lib/minigl/localization.rb
46
47
  - lib/minigl/map.rb
47
48
  - lib/minigl/movement.rb
48
49
  - lib/minigl/text.rb
@@ -70,10 +71,13 @@ files:
70
71
  - test/data/img/tile2.svg
71
72
  - test/data/img/tile2b.png
72
73
  - test/data/sound/1.wav
74
+ - test/data/text/english.txt
75
+ - test/data/text/portuguese.txt
73
76
  - test/data/tileset/tileset1.png
74
77
  - test/game.rb
75
78
  - test/game_object_tests.rb
76
79
  - test/iso_game.rb
80
+ - test/localization_tests.rb
77
81
  - test/map_tests.rb
78
82
  - test/mov_game.rb
79
83
  - test/movement_tests.rb
@@ -107,6 +111,7 @@ test_files:
107
111
  - test/game.rb
108
112
  - test/game_object_tests.rb
109
113
  - test/iso_game.rb
114
+ - test/localization_tests.rb
110
115
  - test/map_tests.rb
111
116
  - test/mov_game.rb
112
117
  - test/movement_tests.rb
@@ -136,5 +141,7 @@ test_files:
136
141
  - test/data/img/tile2.svg
137
142
  - test/data/img/tile2b.png
138
143
  - test/data/sound/1.wav
144
+ - test/data/text/english.txt
145
+ - test/data/text/portuguese.txt
139
146
  - test/data/tileset/tileset1.png
140
147
  - test/data/img/sub/image.png