fantasy 0.1.13 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +22 -1
  3. data/.yardopts +4 -0
  4. data/CHANGELOG.md +6 -0
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +55 -0
  7. data/README.md +14 -6
  8. data/docs/Actor.html +2737 -0
  9. data/docs/Background.html +961 -0
  10. data/docs/Camera.html +791 -0
  11. data/docs/Clock.html +753 -0
  12. data/docs/Color.html +776 -0
  13. data/docs/Coordinates.html +730 -0
  14. data/docs/Cursor.html +752 -0
  15. data/docs/Disk.html +236 -0
  16. data/docs/Draggable.html +198 -0
  17. data/docs/Fantasy.html +121 -0
  18. data/docs/Game.html +904 -0
  19. data/docs/Global.html +2791 -0
  20. data/docs/Gravitier.html +179 -0
  21. data/docs/HudImage.html +979 -0
  22. data/docs/HudText.html +1151 -0
  23. data/docs/Image.html +506 -0
  24. data/docs/Jumper.html +189 -0
  25. data/docs/Mouse.html +226 -0
  26. data/docs/MoveByCursor.html +374 -0
  27. data/docs/MoveByDirection.html +179 -0
  28. data/docs/Mover.html +305 -0
  29. data/docs/Music.html +524 -0
  30. data/docs/Shape.html +1057 -0
  31. data/docs/Sound.html +374 -0
  32. data/docs/Tilemap.html +491 -0
  33. data/docs/Tween.html +186 -0
  34. data/docs/UserInputs.html +879 -0
  35. data/docs/Utils.html +345 -0
  36. data/docs/_index.html +346 -0
  37. data/docs/class_list.html +51 -0
  38. data/docs/css/common.css +1 -0
  39. data/docs/css/full_list.css +58 -0
  40. data/docs/css/style.css +497 -0
  41. data/docs/file.CHANGELOG.html +121 -0
  42. data/docs/file.README.html +599 -0
  43. data/docs/file_list.html +61 -0
  44. data/docs/frames.html +17 -0
  45. data/docs/index.html +599 -0
  46. data/docs/js/app.js +314 -0
  47. data/docs/js/full_list.js +216 -0
  48. data/docs/js/jquery.js +4 -0
  49. data/docs/method_list.html +1931 -0
  50. data/docs/top-level-namespace.html +978 -0
  51. data/lib/fantasy/actor.rb +455 -123
  52. data/lib/fantasy/background.rb +109 -13
  53. data/lib/fantasy/base.rb +113 -1
  54. data/lib/fantasy/camera.rb +95 -11
  55. data/lib/fantasy/clock.rb +4 -2
  56. data/lib/fantasy/color.rb +158 -153
  57. data/lib/fantasy/coordinates.rb +5 -9
  58. data/lib/fantasy/cursor.rb +2 -1
  59. data/lib/fantasy/disk.rb +12 -8
  60. data/lib/fantasy/draggable.rb +22 -1
  61. data/lib/fantasy/global.rb +59 -31
  62. data/lib/fantasy/hud_image.rb +5 -3
  63. data/lib/fantasy/hud_text.rb +6 -2
  64. data/lib/fantasy/image.rb +12 -4
  65. data/lib/fantasy/includes/gravitier.rb +2 -0
  66. data/lib/fantasy/includes/jumper.rb +3 -2
  67. data/lib/fantasy/includes/log.rb +12 -0
  68. data/lib/fantasy/includes/move_by_cursors.rb +24 -15
  69. data/lib/fantasy/includes/move_by_direction.rb +2 -0
  70. data/lib/fantasy/includes/mover.rb +3 -0
  71. data/lib/fantasy/includes/user_inputs.rb +6 -0
  72. data/lib/fantasy/loop.rb +41 -44
  73. data/lib/fantasy/mouse.rb +2 -0
  74. data/lib/fantasy/music.rb +4 -2
  75. data/lib/fantasy/shape.rb +11 -2
  76. data/lib/fantasy/sound.rb +3 -1
  77. data/lib/fantasy/tilemap.rb +19 -13
  78. data/lib/fantasy/tween.rb +3 -1
  79. data/lib/fantasy/utils.rb +7 -13
  80. data/lib/fantasy/version.rb +1 -1
  81. data/lib/fantasy.rb +2 -0
  82. metadata +90 -4
  83. data/fantasy.gemspec +0 -40
  84. data/fonts/VT323-Regular.ttf +0 -0
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "ostruct"
2
4
 
3
5
  module Global
4
6
  class << self
7
+ include Log
8
+
5
9
  attr_accessor :actors, :hud_texts, :hud_images, :backgrounds, :tile_maps, :clocks, :shapes
6
10
  attr_accessor :debug
7
11
  attr_accessor :setup_proc, :loop_proc, :button_proc
@@ -17,11 +21,13 @@ module Global
17
21
  attr_reader :frame_time # delta_time
18
22
  attr_reader :pixel_fonts
19
23
  attr_reader :references
20
- attr_reader :camera
21
24
  attr_reader :game_state
22
25
 
23
- def initialize
24
- puts "Global.initialize"
26
+ attr_reader :screen_width, :screen_height
27
+
28
+ # rubocop:disable Metrics/MethodLength
29
+ def initialize(screen_width, screen_height)
30
+ log "Global.initialize"
25
31
  @actors = []
26
32
  @hud_texts = []
27
33
  @hud_images = []
@@ -32,33 +38,34 @@ module Global
32
38
  @last_frame_at = Time.now
33
39
  @debug = false
34
40
 
35
- @pixel_fonts = {}
36
- @pixel_fonts["small"] = Gosu::Font.new(20, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" } )
37
- @pixel_fonts["medium"] = Gosu::Font.new(40, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" } )
38
- @pixel_fonts["big"] = Gosu::Font.new(60, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" } )
39
- @pixel_fonts["huge"] = Gosu::Font.new(100, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" } )
41
+ @pixel_fonts = load_fonts
40
42
 
41
43
  @d_key_pressed = false
42
44
  @references = OpenStruct.new
43
- @camera = Camera.new(position: Coordinates.zero)
44
45
  @game_state = Global.presentation_proc.nil? ? "game" : "presentation"
45
46
  @scene_started_at = Time.now
46
-
47
47
  @background = Color.new(r: 0, g: 0, b: 0)
48
48
 
49
+ @frame_time = 0
50
+
51
+ @screen_width = screen_width
52
+ @screen_height = screen_height
53
+
49
54
  if @presentation_proc.nil?
50
- on_presentation { Global.default_on_presentation }
55
+ on_presentation { Global.default_on_presentation }
51
56
  end
52
57
 
53
58
  if @game_proc.nil?
54
- on_game { Global.default_on_game }
59
+ on_game { Global.default_on_game }
55
60
  end
56
61
 
57
62
  if @end_proc.nil?
58
- on_end { Global.default_on_end }
63
+ on_end { Global.default_on_end }
59
64
  end
60
65
  end
66
+ # rubocop:enable Metrics/MethodLength
61
67
 
68
+ # rubocop:disable Style/GuardClause
62
69
  def update
63
70
  @frame_time = Time.now - @last_frame_at
64
71
  @last_frame_at = Time.now
@@ -72,6 +79,7 @@ module Global
72
79
  @d_key_pressed = false
73
80
  end
74
81
  end
82
+ # rubocop:enable Style/GuardClause
75
83
 
76
84
  def add_reference(name:, object:)
77
85
  @references[name] = object
@@ -90,21 +98,21 @@ module Global
90
98
  end
91
99
 
92
100
  def go_to_presentation
93
- puts "Game stage 'presentation'"
101
+ log "Game stage 'presentation'"
94
102
 
95
103
  clear_state_elements
96
104
  @presentation_proc.call
97
105
  end
98
106
 
99
107
  def go_to_game
100
- puts "Game stage 'game'"
108
+ log "Game stage 'game'"
101
109
 
102
110
  clear_state_elements
103
111
  game_proc.call
104
112
  end
105
113
 
106
114
  def go_to_end
107
- puts "Game stage 'end'"
115
+ log "Game stage 'end'"
108
116
 
109
117
  clear_state_elements
110
118
  end_proc.call
@@ -112,19 +120,45 @@ module Global
112
120
 
113
121
  def clear_state_elements
114
122
  @scene_started_at = Time.now
123
+
124
+ clear_entities
125
+ clear_callbacks
126
+ end
127
+
128
+ def mouse_position
129
+ Coordinates.new(Global.game.mouse_x, Global.game.mouse_y)
130
+ end
131
+
132
+ def setup
133
+ Sound.preload_sounds
134
+ Image.preload_images
135
+ Music.preload_musics
136
+ end
137
+
138
+ def seconds_in_scene
139
+ Time.now - @scene_started_at
140
+ end
141
+
142
+ private
143
+
144
+ def clear_entities
115
145
  @actors.clear
116
146
  @hud_texts.clear
117
147
  @hud_images.clear
118
148
  @backgrounds.clear
119
149
  @tile_maps.clear
120
150
  @shapes.clear
121
- @camera.position = Coordinates.zero
122
151
 
123
152
  @clocks.reject(&:persistent?).each do |clock|
124
153
  clock.stop unless clock.thread == Thread.current # no stop current Thread
125
154
  end
126
155
 
127
- # clear callbacks
156
+ @background = Color.new(r: 0, g: 0, b: 0)
157
+
158
+ Camera.reset
159
+ end
160
+
161
+ def clear_callbacks
128
162
  @button_proc = nil
129
163
  @space_bar_proc = nil
130
164
  @cursor_up_proc = nil
@@ -133,22 +167,16 @@ module Global
133
167
  @cursor_right_proc = nil
134
168
  @mouse_button_left_proc = nil
135
169
  @mouse_button_right_proc = nil
136
-
137
- @background = Color.new(r: 0, g: 0, b: 0)
138
- end
139
-
140
- def mouse_position
141
- Coordinates.new(Global.game.mouse_x, Global.game.mouse_y)
142
170
  end
143
171
 
144
- def setup
145
- Sound.preload_sounds
146
- Image.preload_images
147
- Music.preload_musics
148
- end
172
+ def load_fonts
173
+ result = {}
174
+ result["small"] = Gosu::Font.new(20, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" })
175
+ result["medium"] = Gosu::Font.new(40, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" })
176
+ result["big"] = Gosu::Font.new(60, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" })
177
+ result["huge"] = Gosu::Font.new(100, { name: "#{__dir__}/../../fonts/VT323-Regular.ttf" })
149
178
 
150
- def seconds_in_scene
151
- Time.now - @scene_started_at
179
+ result
152
180
  end
153
181
  end
154
182
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class HudImage
2
4
  include Draggable
3
5
 
4
6
  attr_accessor :name, :scale, :color, :visible, :position, :layer
5
7
 
6
- def initialize(position:, image_name: )
8
+ def initialize(position:, image_name:)
7
9
  @image = Image.new(image_name)
8
10
  @name = image_name
9
11
  @position = position
@@ -17,11 +19,11 @@ class HudImage
17
19
  end
18
20
 
19
21
  def width
20
- @image.width() * @scale
22
+ @image.width * @scale
21
23
  end
22
24
 
23
25
  def height
24
- @image.height() * @scale
26
+ @image.height * @scale
25
27
  end
26
28
 
27
29
  def move
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class HudText
2
4
  attr_accessor :text, :size, :color, :background_color, :visible, :layer, :in_world, :position, :alignment
3
5
 
@@ -17,6 +19,7 @@ class HudText
17
19
 
18
20
  def move; end
19
21
 
22
+ # rubocop:disable Metrics/AbcSize
20
23
  def draw
21
24
  if visible
22
25
  unless @background_color.nil?
@@ -27,12 +30,14 @@ class HudText
27
30
 
28
31
  draw_debug if Global.debug
29
32
  end
33
+ # rubocop:enable Metrics/AbcSize
30
34
 
31
35
  def font
32
36
  found_font = Global.pixel_fonts[@size]
33
37
  if found_font.nil?
34
38
  raise "HudText.size value not valid '#{@size}'. Valid values: 'small, medium, big, huge'"
35
39
  end
40
+
36
41
  found_font
37
42
  end
38
43
 
@@ -44,7 +49,6 @@ class HudText
44
49
  font.markup_width(text, 1)
45
50
  end
46
51
 
47
-
48
52
  private
49
53
 
50
54
  def position_rel
@@ -79,7 +83,7 @@ class HudText
79
83
 
80
84
  def screen_position
81
85
  if @in_world
82
- @position - Global.camera.position
86
+ @position - Camera.main.position
83
87
  else
84
88
  @position
85
89
  end
data/lib/fantasy/image.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Image
2
4
  def initialize(image_name)
3
5
  @image = Image.load(image_name)
@@ -16,6 +18,8 @@ class Image
16
18
  end
17
19
 
18
20
  class << self
21
+ include Log
22
+
19
23
  @@images = {}
20
24
 
21
25
  def load(image_name)
@@ -35,19 +39,23 @@ class Image
35
39
  def locate_image(image_name)
36
40
  return @@images[image_name] if @@images[image_name]
37
41
 
38
- puts "Initialize image: '#{image_name}'"
42
+ log "Initialize image: '#{image_name}'"
39
43
 
40
- file_name = Dir.entries(base_path).find { |e| e =~ /^#{image_name}($|\.)/ }
44
+ file_name = Dir.entries(base_path).find { |e| e =~ /^#{image_name}($|\.)/ }
41
45
 
42
46
  raise "Image file not found with name '#{image_name}' in #{base_path}" if file_name.nil?
43
47
 
44
48
  @@images[image_name] = Gosu::Image.new("#{base_path}/#{file_name}", { retro: true })
45
49
 
46
- return @@images[image_name]
50
+ @@images[image_name]
47
51
  end
48
52
 
49
53
  def base_path
50
- "#{Dir.pwd}/images"
54
+ if ENV["environment"] == "test"
55
+ "#{Dir.pwd}/test/fixtures/images"
56
+ else
57
+ "#{Dir.pwd}/images"
58
+ end
51
59
  end
52
60
  end
53
61
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gravitier
2
4
  def add_force_by_gravity
3
5
  add_force(Coordinates.down * @gravity)
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jumper
2
4
  def jump
3
- add_force(Coordinates.up * @jump_force)
5
+ impulse(direction: Coordinates.up, force: @jump_force)
4
6
  @jumping = true
5
7
  @on_floor = false
6
- @final_vertical_position = @position.y - @jump_force
7
8
 
8
9
  on_jumping_do
9
10
  end
@@ -0,0 +1,12 @@
1
+ module Log
2
+ def log(message)
3
+ if ENV["debug"] == "active"
4
+ full_message = "[#{Time.now.strftime("%T")}]"
5
+ full_message += " [#{object_id}]"
6
+ full_message += " [#{@name}]" if defined?(@name)
7
+ full_message += " : #{message}"
8
+
9
+ puts full_message
10
+ end
11
+ end
12
+ end
@@ -1,4 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MoveByCursor
4
+ # rubocop:disable Metrics/PerceivedComplexity
5
+ def move_with_cursors(down: nil, up: nil, left: nil, right: nil, jump: false)
6
+ if down.nil? && up.nil? && left.nil? && right.nil?
7
+ down = true
8
+ up = true
9
+ left = true
10
+ right = true
11
+ end
12
+
13
+ @move_with_cursors_down = down || false
14
+ @move_with_cursors_up = up || false
15
+ @move_with_cursors_left = left || false
16
+ @move_with_cursors_right = right || false
17
+ @move_with_cursors_jump = jump || false
18
+ end
19
+ # rubocop:enable Metrics/PerceivedComplexity
20
+
21
+ # rubocop:disable
22
+
23
+ # @!visibility private
2
24
  def move_by_cursors
3
25
  if Gosu.button_down?(Cursor.down) && @move_with_cursors_down
4
26
  move_by(Coordinates.down)
@@ -20,22 +42,9 @@ module MoveByCursor
20
42
  jump
21
43
  end
22
44
  end
45
+ # rubocop:enable
23
46
 
24
- def move_with_cursors(down: nil, up: nil, left: nil, right: nil, jump: false)
25
- puts "#{@name}: move_with_cursors(down: #{down}, up: #{up}, left: #{left}, right: #{right}), jump: #{jump}"
26
-
27
- if down.nil? and up.nil? and left.nil? and right.nil?
28
- down = true
29
- up = true
30
- left = true
31
- right = true
32
- end
33
- @move_with_cursors_down = down || false
34
- @move_with_cursors_up = up || false
35
- @move_with_cursors_left = left || false
36
- @move_with_cursors_right = right || false
37
- @move_with_cursors_jump = jump || false
38
- end
47
+ private
39
48
 
40
49
  def move_by(direction)
41
50
  @position += direction * @speed * Global.frame_time
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MoveByDirection
2
4
  def move_by_direction
3
5
  @position += @direction * @speed * Global.frame_time
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mover
2
4
  def impulse(direction:, force:)
3
5
  add_force(direction.normalize * force)
@@ -13,6 +15,7 @@ module Mover
13
15
  @velocity ||= Coordinates.zero
14
16
 
15
17
  @velocity += @acceleration
18
+
16
19
  @velocity.resize(max_speed) if @velocity.length > max_speed
17
20
 
18
21
  unless @velocity.length.zero?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module UserInputs
2
4
  # Set callbacks
3
5
  def on_cursor_down(&block)
@@ -57,4 +59,8 @@ module UserInputs
57
59
  puts "XXX: on_click_do: #{@on_click_callback}"
58
60
  instance_exec(&@on_click_callback) unless @on_click_callback.nil?
59
61
  end
62
+
63
+ protected
64
+
65
+ attr_accessor :on_cursor_down_callback, :on_cursor_up_callback, :on_cursor_left_callback, :on_cursor_right_callback, :on_space_bar_callback, :on_mouse_button_left_callback
60
66
  end
data/lib/fantasy/loop.rb CHANGED
@@ -1,12 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Game < Gosu::Window
2
- def initialize
3
- # TODO: require SCREEN_WIDTH and SCREEN_HEIGHT
4
- super(SCREEN_WIDTH, SCREEN_HEIGHT)
5
- Global.initialize
4
+ def initialize(screen_width, screen_height)
5
+ Camera.initialize
6
+ Global.initialize(screen_width, screen_height)
7
+
8
+ super(Global.screen_width, Global.screen_height)
6
9
 
7
- Global.presentation_proc.call()
10
+ Global.presentation_proc.call
8
11
  end
9
12
 
13
+ # rubocop:disable Metrics/CyclomaticComplexity
10
14
  def button_down(button_id)
11
15
  case button_id
12
16
  when Cursor.down then cursor_down_pressed
@@ -18,73 +22,56 @@ class Game < Gosu::Window
18
22
  when Mouse.left then mouse_button_left_pressed
19
23
  end
20
24
 
21
- Global.button_proc.call(button_id) unless Global.button_proc.nil?
25
+ Global.button_proc&.call(button_id)
22
26
 
23
27
  super
24
28
  end
29
+ # rubocop:enable Metrics/CyclomaticComplexity
25
30
 
26
31
  def cursor_down_pressed
27
- Global.cursor_down_proc.call unless Global.cursor_down_proc.nil?
28
- invoke_input_method("on_cursor_down_do")
32
+ Global.cursor_down_proc&.call
33
+ invoke_input_method_in_entities("on_cursor_down_do")
29
34
  end
30
35
 
31
36
  def cursor_up_pressed
32
- Global.cursor_up_proc.call unless Global.cursor_up_proc.nil?
33
- invoke_input_method("on_cursor_up_do")
37
+ Global.cursor_up_proc&.call
38
+ invoke_input_method_in_entities("on_cursor_up_do")
34
39
  end
35
40
 
36
41
  def cursor_left_pressed
37
- Global.cursor_left_proc.call unless Global.cursor_left_proc.nil?
38
- invoke_input_method("on_cursor_left_do")
42
+ Global.cursor_left_proc&.call
43
+ invoke_input_method_in_entities("on_cursor_left_do")
39
44
  end
40
45
 
41
46
  def cursor_right_pressed
42
- Global.cursor_right_proc.call unless Global.cursor_right_proc.nil?
43
- invoke_input_method("on_cursor_right_do")
47
+ Global.cursor_right_proc&.call
48
+ invoke_input_method_in_entities("on_cursor_right_do")
44
49
  end
45
50
 
46
51
  def space_bar_pressed
47
- Global.space_bar_proc.call unless Global.space_bar_proc.nil?
48
- invoke_input_method("on_space_bar_do")
52
+ Global.space_bar_proc&.call
53
+ invoke_input_method_in_entities("on_space_bar_do")
49
54
  end
50
55
 
51
56
  def mouse_button_left_pressed
52
- Global.mouse_button_left_proc.call unless Global.mouse_button_left_proc.nil?
57
+ Global.mouse_button_left_proc&.call
53
58
 
54
59
  check_click
55
60
  end
56
61
 
57
- def invoke_input_method(input_method_name)
58
- (
59
- Global.actors +
60
- Global.shapes
61
- ).sort_by(&:layer).each do |e|
62
- e.send(input_method_name)
63
- end
64
- end
65
-
66
62
  def update
67
63
  Global.update
68
64
 
69
- Global.actors.each do |e|
70
- e.move
71
- end
72
-
73
- Global.hud_texts.each do |e|
74
- e.move
75
- end
76
-
77
- Global.hud_images.each do |e|
78
- e.move
79
- end
80
-
81
- Global.camera.move
65
+ Global.actors.each(&:move)
66
+ Global.hud_texts.each(&:move)
67
+ Global.hud_images.each(&:move)
68
+ Camera.main.move
82
69
 
83
- Global.loop_proc.call() unless Global.loop_proc.nil?
70
+ Global.loop_proc&.call
84
71
  end
85
72
 
86
73
  def draw
87
- Gosu.draw_rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Global.background)
74
+ Gosu.draw_rect(0, 0, Global.screen_width, Global.screen_height, Global.background)
88
75
 
89
76
  (
90
77
  Global.backgrounds +
@@ -93,9 +80,7 @@ class Game < Gosu::Window
93
80
  Global.hud_texts +
94
81
  Global.hud_images +
95
82
  Global.shapes
96
- ).sort_by(&:layer).each do |e|
97
- e.draw
98
- end
83
+ ).sort_by(&:layer).each(&:draw)
99
84
  end
100
85
 
101
86
  def check_click
@@ -106,4 +91,16 @@ class Game < Gosu::Window
106
91
  e.on_click_do if Utils.collision_at?(e, mouse_x, mouse_y)
107
92
  end
108
93
  end
94
+
95
+ private
96
+
97
+ def invoke_input_method_in_entities(input_method_name)
98
+ (
99
+ Global.actors +
100
+ Global.shapes
101
+ ).sort_by(&:layer).each do |e|
102
+ e.send(input_method_name)
103
+ end
104
+ end
105
+
109
106
  end
data/lib/fantasy/mouse.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mouse
2
4
  def self.left
3
5
  Gosu::MS_LEFT
data/lib/fantasy/music.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Music
2
4
  class << self
3
5
  @@musics = {}
@@ -13,7 +15,7 @@ module Music
13
15
  end
14
16
 
15
17
  def stop
16
- @@actual_song.stop unless @@actual_song.nil?
18
+ @@actual_song&.stop
17
19
  end
18
20
 
19
21
  def volume
@@ -35,7 +37,7 @@ module Music
35
37
 
36
38
  @@musics[music_name] = Gosu::Song.new("#{base_path}/#{file_name}")
37
39
 
38
- return @@musics[music_name]
40
+ @@musics[music_name]
39
41
  end
40
42
 
41
43
  def preload_musics
data/lib/fantasy/shape.rb CHANGED
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Shape
2
4
  include UserInputs
3
5
 
4
6
  attr_accessor :kind, :position, :width, :height, :stroke, :color, :fill, :stroke_color, :layer
5
7
 
8
+ # rubocop:disable Metrics/ParameterLists
6
9
  def initialize(kind:, position:, width:, height:, stroke: 1, fill: true, color: Color.palette.black, stroke_color: nil)
7
10
  @kind = kind
8
11
  @position = position
@@ -16,9 +19,10 @@ class Shape
16
19
 
17
20
  Global.shapes << self
18
21
  end
22
+ # rubocop:enable Metrics/ParameterLists
19
23
 
20
- def self.rectangle(position:, width:, height:, color: Color.palette.black)
21
- Shape.new(kind: "rectangle", position: position, width: width, height: height)
24
+ def self.rectangle(position:, width:, height:, color: Color.palette.black, stroke_color: nil, stroke: 0)
25
+ Shape.new(kind: "rectangle", position: position, width: width, height: height, color: color)
22
26
  end
23
27
 
24
28
  def draw
@@ -36,20 +40,25 @@ class Shape
36
40
 
37
41
  private
38
42
 
43
+ # rubocop:disable Style/GuardClause
39
44
  def draw_rectangle
40
45
  if fill
41
46
  Gosu.draw_rect(@position.x, @position.y, @width, @height, @color)
42
47
  end
43
48
 
49
+
44
50
  unless stroke.zero?
45
51
  draw_frame(@position.x, @position.y, @width, @height, @stroke, @stroke_color || @color)
46
52
  end
47
53
  end
54
+ # rubocop:enable Style/GuardClause
48
55
 
56
+ # rubocop:disable Metrics/ParameterLists
49
57
  def draw_frame(x, y, width, height, stroke, color)
50
58
  Gosu.draw_rect(x, y, width, stroke, color)
51
59
  Gosu.draw_rect(width - stroke + x, y, stroke, height, color)
52
60
  Gosu.draw_rect(x, height - stroke + y, width, stroke, color)
53
61
  Gosu.draw_rect(x, y, stroke, height, color)
54
62
  end
63
+ # rubocop:enable Metrics/ParameterLists
55
64
  end
data/lib/fantasy/sound.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sound
2
4
  class << self
3
5
  @@sounds = {}
@@ -17,7 +19,7 @@ module Sound
17
19
 
18
20
  @@sounds[sound_name] = Gosu::Sample.new("#{base_path}/#{file_name}")
19
21
 
20
- return @@sounds[sound_name]
22
+ @@sounds[sound_name]
21
23
  end
22
24
 
23
25
  def preload_sounds