ehb_game_lib 0.1.0 → 0.4.0

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: 29657e3bdfde37d33d26b4ab32ed8048421d48a82f2cd823e005878f438e3c78
4
- data.tar.gz: 252deae3be739fb8b83917bd3e4f7e914701b76132f02338dbf489e5957a04b8
3
+ metadata.gz: 42ec189978ad34c8ab1c64d5ba99e63ae27099553310cfa380e1cb2eec9bb19d
4
+ data.tar.gz: aabf62f8fcb17570c9088b3c94dc9d6c47c5900916cb7630e113f3672a3e8f1e
5
5
  SHA512:
6
- metadata.gz: e31e685a986caae81bd127bf9cabdf6ca59a767f08b72e64c50b7df2ffd98bd7383cab432d230b8e18e3ec44629cc962a8bf7740253685cde557cd71620f4d98
7
- data.tar.gz: cf7d3da8e1ff2f29c86852f1c265d15e8984a3fa8e07bd57c07ae667d82eb05a1ed9cda7fb468aadfb0827861fdd5f6ad1c859c119967041b43da5c6ac503816
6
+ metadata.gz: 1964fd37af7244749fc0303dbe7c9504e2df777574ada1fb5cd7db174705e485363f45bbeacefb66c27ef2436b3f8c5c8b3926bcdc9004f37c81e0740f816fe0
7
+ data.tar.gz: e8de637269a0de65b42668c04df1632268689cbb26476803b2681d347e1b7ba49525272e5960697b5aca6cbe83f4f1d9a74aee32b7216b34e3c609c2b7217b98
@@ -1,31 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support'
4
- require 'active_support/core_ext'
5
3
  require 'chingu'
4
+ require 'eac_ruby_utils/core_ext'
6
5
  require 'opengl'
7
- require 'ehb_game_lib/version'
8
- require 'ehb_game_lib/base_state'
9
- require 'ehb_game_lib/globals'
10
- require 'ehb_game_lib/gfx'
11
- require 'ehb_game_lib/math/circle'
12
- require 'ehb_game_lib/math/line'
13
- require 'ehb_game_lib/math/line_segment'
14
- require 'ehb_game_lib/math/quadratic_equation'
15
- require 'ehb_game_lib/math/rectable_object'
16
- require 'ehb_game_lib/math/vector'
17
- require 'ehb_game_lib/math/intersection/circle_line'
18
- require 'ehb_game_lib/math/intersection/circle_line_segment'
19
- require 'ehb_game_lib/nes/all_colors_palette'
20
- require 'ehb_game_lib/nes/color'
21
- require 'ehb_game_lib/nes/palette'
22
- require 'ehb_game_lib/patches/chingu/basic_game_object'
23
- require 'ehb_game_lib/patches/gosu/font'
24
- require 'ehb_game_lib/traits/bounding_line_segment'
25
- require 'ehb_game_lib/text/bitmap_font'
26
- require 'ehb_game_lib/text/bitmap_text'
27
- require 'ehb_game_lib/utils/cursor'
28
- require 'ehb_game_lib/window'
29
6
 
30
7
  module EhbGameLib
8
+ require_sub __FILE__
31
9
  end
@@ -2,9 +2,5 @@
2
2
 
3
3
  module EhbGameLib
4
4
  class BaseState < ::Chingu::GameState
5
- def draw
6
- super
7
- ::EhbGameLib::Globals.window.draw_resized
8
- end
9
5
  end
10
6
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehb_game_lib/math/rectable_object'
5
+
6
+ module EhbGameLib
7
+ class Canvas
8
+ include ::EhbGameLib::Math::RectableObject
9
+
10
+ common_constructor :width, :height
11
+
12
+ def x
13
+ 0
14
+ end
15
+
16
+ def y
17
+ 0
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Math
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -1,99 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/core_ext'
4
+
3
5
  module EhbGameLib
4
6
  module Math
5
7
  module RectableObject
6
- H_AXIS = { name: :ax, coord: :x, size: :width, floor: :left, mean: :center,
7
- ceil: :right }.freeze
8
- V_AXIS = { name: :ay, coord: :y, size: :height, floor: :top, mean: :middle,
9
- ceil: :bottom }.freeze
10
-
11
- [H_AXIS, V_AXIS].each do |a|
12
- class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
13
- def #{a[:name]}
14
- @#{a[:name]} ||= Axis.new(
15
- -> { #{a[:coord]} },
16
- -> (v) { self.#{a[:coord]} = v },
17
- -> { #{a[:size]} }
8
+ require_sub __FILE__
9
+
10
+ [%i[ax x width x_anchor left center right], # rubocop:disable Metrics/BlockLength
11
+ %i[ay y height y_anchor top middle bottom]].each do |aa|
12
+ a = ::OpenStruct.new(
13
+ %i[name coord size anchor floor mean ceil]
14
+ .each_with_index.map { |k, i| [k, aa[i]] }.to_h
15
+ )
16
+
17
+ define_method a.name do
18
+ @data ||= {}
19
+ @data[a.name] ||=
20
+ Axis.new(
21
+ -> { send(a.coord) },
22
+ ->(v) { send("#{a.coord}=", v) },
23
+ -> { send(a.size) }
18
24
  )
19
- end
20
- RUBY_EVAL
21
-
22
- %i[floor mean ceil].each do |m|
23
- class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
24
- def #{a[m]}
25
- #{a[:name]}.#{m}
26
- end
27
-
28
- def #{a[m]}=(v)
29
- #{a[:name]}.#{m} = v
30
- end
31
- RUBY_EVAL
32
- end
33
- end
34
-
35
- def rect
36
- ::Chingu::Rect.new(left, top, width, height)
37
- end
38
-
39
- class Axis
40
- attr_accessor :anchor
41
-
42
- def initialize(coord_get, coord_set, size_get)
43
- @coord_get = coord_get
44
- @coord_set = coord_set
45
- @size_get = size_get
46
25
  end
47
26
 
48
- def coord
49
- @coord_get.call
50
- end
27
+ %i[anchor floor mean ceil].each do |m|
28
+ define_method a[m] do |*args|
29
+ if args.count.zero?
30
+ send(a.name).send(m)
31
+ elsif args.count == 1
32
+ send(a.name).send("#{m}=", args[0])
51
33
 
52
- def coord=(v)
53
- @coord_set.call(v)
54
- end
55
-
56
- def size
57
- @size_get.call
58
- end
59
-
60
- %w[floor mean ceil].each do |m|
61
- class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
62
- def #{m}
63
- coord + #{m}_delta
34
+ self
35
+ else
36
+ raise ::ArgumentError, "Invalid number of arguments (#{args.count} for 0..1)"
64
37
  end
65
-
66
- def #{m}=(v)
67
- self.coord = v - #{m}_delta
68
- end
69
- RUBY_EVAL
70
- end
71
-
72
- private
73
-
74
- def floor_delta
75
- case anchor
76
- when :mean then - size / 2
77
- when :ceil then - size
78
- else 0
79
38
  end
80
- end
81
39
 
82
- def mean_delta
83
- case anchor
84
- when :mean then 0
85
- when :ceil then - size / 2
86
- else size / 2
40
+ define_method "#{a[m]}=" do |v|
41
+ send(a.name).send("#{m}=", v)
87
42
  end
88
43
  end
44
+ end
89
45
 
90
- def ceil_delta
91
- case anchor
92
- when :mean then size / 2
93
- when :ceil then 0
94
- else size
95
- end
96
- end
46
+ def rect
47
+ ::Chingu::Rect.new(left, top, width, height)
97
48
  end
98
49
  end
99
50
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Math
7
+ module RectableObject
8
+ class Axis
9
+ attr_accessor :anchor
10
+
11
+ common_constructor :coord_get, :coord_set, :size_get
12
+
13
+ def coord
14
+ coord_get.call
15
+ end
16
+
17
+ def coord=(v)
18
+ coord_set.call(v)
19
+ end
20
+
21
+ def size
22
+ size_get.call
23
+ end
24
+
25
+ %w[floor mean ceil].each do |m|
26
+ define_method m do
27
+ coord + send("#{m}_delta")
28
+ end
29
+
30
+ define_method "#{m}=" do |v|
31
+ self.coord = v - send("#{m}_delta")
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def floor_delta
38
+ case anchor
39
+ when :mean then - size / 2
40
+ when :ceil then - size
41
+ else 0
42
+ end
43
+ end
44
+
45
+ def mean_delta
46
+ case anchor
47
+ when :mean then 0
48
+ when :ceil then - size / 2
49
+ else size / 2
50
+ end
51
+ end
52
+
53
+ def ceil_delta
54
+ case anchor
55
+ when :mean then size / 2
56
+ when :ceil then 0
57
+ else size
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehb_game_lib/palettes/sprite'
5
+ require 'ehb_game_lib/text/bitmap_font'
6
+
7
+ module EhbGameLib
8
+ class MediaPath
9
+ class << self
10
+ # @return [EhbGameLib::MediaPath]
11
+ def default
12
+ @default ||= new
13
+ end
14
+ end
15
+
16
+ # @return [Array]
17
+ def paths
18
+ @paths ||= []
19
+ end
20
+
21
+ # @return [Pathname]
22
+ def find(subpath)
23
+ paths.each do |path|
24
+ full_path = path.to_pathname.expand_path.join(subpath)
25
+ return full_path if full_path.exist?
26
+ end
27
+ raise "Subpath \"#{subpath}\" not found (Searched in: #{paths})"
28
+ end
29
+
30
+ # @return [EhbGameLib::Text::BitmapFont]
31
+ def load_bitmap_font(subpath, line_height)
32
+ ::EhbGameLib::Text::BitmapFont.new(find(subpath).to_path, line_height)
33
+ end
34
+
35
+ # @return [Gosu::Image]
36
+ def load_gosu_image(subpath)
37
+ ::Gosu::Image.new(find(subpath).to_path, ::EhbGameLib::Palettes::Sprite.to_gosu_image_options)
38
+ end
39
+
40
+ # @return [EhbGameLib::Palettes::Sprite]
41
+ def load_sprite(subpath)
42
+ ::EhbGameLib::Palettes::Sprite.from_file(find(subpath))
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Nes
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -1,20 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ehb_game_lib/palettes/palette'
4
+
3
5
  module EhbGameLib
4
6
  module Nes
5
- class Palette
6
- COLORS_COUNT = 16
7
+ # Reference: http://www.firebrandx.com/nespalette.html
8
+ class Palette < ::EhbGameLib::Palettes::Palette
9
+ COLUMNS = %w[grey blue indigo purple violet red brown orange yellow lawn_green lime_green
10
+ sea_green cyan black].freeze
11
+ ROWS = %w[dd d l ll].freeze
7
12
 
8
- def initialize(all_colors)
9
- @colors = Array.new(COLORS_COUNT) { |i| ::EhbGameLib::Nes::Color.new(all_colors, i) }
13
+ COLUMNS.each_with_index do |c_name, c_index|
14
+ ROWS.each_with_index do |r_name, r_index|
15
+ const_set("#{c_name}_#{r_name}".upcase, r_index * 0x10 + c_index)
16
+ end
10
17
  end
11
18
 
12
- def [](index)
13
- @colors[index % @colors.length]
14
- end
19
+ BLACK = BLACK_DD
20
+ WHITE = GREY_LL
21
+ TRANSPARENT = 0x3F
15
22
 
16
- def []=(index, value)
17
- @colors[index % @colors.length].color_index = value
23
+ def initialize
24
+ colors = ::EhbGameLib::Palettes::Color.array_from_file(
25
+ ::File.join(__dir__, 'pvm_style_d93_palette.pal')
26
+ )
27
+ colors[TRANSPARENT] = ::EhbGameLib::Palettes::Color.new(0x00, 0x00, 0x00, 0x00)
28
+ super(colors)
18
29
  end
19
30
  end
20
31
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Palettes
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'gosu'
5
+ require 'rmagick'
6
+
7
+ module EhbGameLib
8
+ module Palettes
9
+ class Color
10
+ QUANTUM_MIN = 0
11
+ QUANTUM_MAX = 255
12
+ QUANTUM_RANGE = (QUANTUM_MIN..QUANTUM_MAX).freeze
13
+
14
+ class << self
15
+ def validate_quantum(quantum)
16
+ raise "Not a integer: #{quantum}" unless quantum.is_a?(::Integer)
17
+ raise 'Out of bounds' unless QUANTUM_RANGE.include?(quantum)
18
+
19
+ quantum
20
+ end
21
+
22
+ def quantum_to_magick_range(quantum, invert = false)
23
+ r = ((quantum / QUANTUM_MAX.to_f) * ::Magick::QuantumRange).floor
24
+ r = ::Magick::QuantumRange - r if invert
25
+ r
26
+ end
27
+
28
+ # @return [Array<EhbGameLib::Palettes::Color>]
29
+ def array_from_file(file_path)
30
+ r = []
31
+ ::File.open(file_path.to_s) do |file|
32
+ while (b = file.read(3))
33
+ b = b.bytes.to_a
34
+ r << ::EhbGameLib::Palettes::Color.new(b[0], b[1], b[2])
35
+ end
36
+ end
37
+ r
38
+ end
39
+ end
40
+
41
+ enable_simple_cache
42
+ attr_reader :red, :green, :blue, :alpha
43
+
44
+ def initialize(red, green, blue, alpha = QUANTUM_MAX)
45
+ @red = self.class.validate_quantum(red)
46
+ @green = self.class.validate_quantum(green)
47
+ @blue = self.class.validate_quantum(blue)
48
+ @alpha = self.class.validate_quantum(alpha)
49
+ end
50
+
51
+ # @return [Gosu::Color]
52
+ def gosu_color
53
+ @gosu_color ||= ::Gosu::Color.rgba(red, green, blue, alpha)
54
+ end
55
+
56
+ # @return [Magick::Pixel]
57
+ def magick_pixel
58
+ @magick_pixel ||= ::Magick::Pixel.new(
59
+ *[red, green, blue].map { |n| self.class.quantum_to_magick_range(n) },
60
+ self.class.quantum_to_magick_range(alpha, true)
61
+ )
62
+ end
63
+
64
+ def names
65
+ Array(::Colorname.find(red, green, blue))
66
+ end
67
+
68
+ def rgb_to_s
69
+ values_to_s(red, green, blue)
70
+ end
71
+
72
+ def rgba_to_s
73
+ rgb_to_s + '|' + values_to_s(alpha)
74
+ end
75
+
76
+ def to_a
77
+ [red, green, blue, alpha]
78
+ end
79
+
80
+ def to_s
81
+ rgba_to_s
82
+ end
83
+
84
+ def to_html
85
+ '#' + rgb_to_s
86
+ end
87
+
88
+ private
89
+
90
+ def values_to_s(*values)
91
+ values.map { |i| i.to_s(16).rjust(2, '0') }.join.upcase
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gosu'
4
+ require 'ehb_game_lib/palettes/color'
5
+
6
+ module EhbGameLib
7
+ module Palettes
8
+ class Palette
9
+ class << self
10
+ # @return [EhbGameLib::Palettes::Palette]
11
+ def from_file(file_path)
12
+ new(::EhbGameLib::Palettes::Color.array_from_file(file_path))
13
+ end
14
+ end
15
+
16
+ # @return [Array<Gosu::Color>]
17
+ attr_reader :colors
18
+
19
+ def initialize(colors)
20
+ colors.each_with_index do |color, index|
21
+ unless color.is_a?(::EhbGameLib::Palettes::Color)
22
+ raise "\##{index} is not a Palette::Color (#{color})"
23
+ end
24
+ end
25
+ @colors = colors.to_a.freeze
26
+ end
27
+
28
+ # @return [EhbGameLib::Palettes::Color]
29
+ def color(index)
30
+ colors.fetch(index)
31
+ end
32
+
33
+ # @return [EhbGameLib::Palettes::Color]
34
+ def [](index)
35
+ colors.fetch(index)
36
+ end
37
+
38
+ # @return [EhbGameLib::Palettes::Palette]
39
+ def sub(*indexes)
40
+ sub_class.new(indexes.map { |index| color(index) })
41
+ end
42
+
43
+ def sub_class
44
+ ::EhbGameLib::Palettes::Palette
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehb_game_lib/media_path'
4
+ require 'rmagick'
5
+
6
+ module EhbGameLib
7
+ module Palettes
8
+ class Sprite
9
+ class << self
10
+ def from_file(file_path)
11
+ new(::Magick::Image.read(file_path.to_s).first)
12
+ end
13
+
14
+ def to_gosu_image_options
15
+ { retro: true, tileable: true }
16
+ end
17
+ end
18
+
19
+ common_constructor :magick_image do
20
+ magick_image.alpha(::Magick::ActivateAlphaChannel)
21
+ end
22
+
23
+ # @return Gosu::Image
24
+ def gosu_image
25
+ @gosu_image ||= begin
26
+ the_path = '/tmp/temp_magick_image.png'
27
+ magick_image.write(the_path)
28
+ ::Gosu::Image.new(the_path, self.class.to_gosu_image_options)
29
+ end
30
+ end
31
+
32
+ # @return [EhbGameLib::Palettes::Sprite]
33
+ def palette_image(palette)
34
+ r = magick_image.dup
35
+ r.colors.times.each do |index|
36
+ r.colormap(index, palette.color(index).magick_pixel)
37
+ end
38
+ self.class.new(r)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Palettes
7
+ module SpriteSet
8
+ class Paletted
9
+ common_constructor :palette, :source_set
10
+
11
+ def [](name)
12
+ sprite(name)
13
+ end
14
+
15
+ def sprite(name)
16
+ sprites_hash[name.to_sym] ||= source_set.sprite(name).palette_image(palette)
17
+ end
18
+
19
+ def sprites
20
+ source_set.sprites.keys.map { |name| [name, sprite(name)] }.to_h
21
+ end
22
+
23
+ private
24
+
25
+ def sprites_hash
26
+ @sprites_hash ||= {}
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehb_game_lib/media_path'
5
+ require 'ehb_game_lib/palettes/sprite'
6
+
7
+ module EhbGameLib
8
+ module Palettes
9
+ module SpriteSet
10
+ class Source
11
+ enable_simple_cache
12
+ common_constructor :media_path, default: [::EhbGameLib::MediaPath.default]
13
+
14
+ def add(name, sprite)
15
+ sprites_hash[name.to_sym] = sprite
16
+ reset_cache :sprites
17
+ end
18
+
19
+ def load(subpath, name = nil)
20
+ name ||= ::File.basename(subpath, '.*')
21
+
22
+ add(name, media_path.load_sprite(subpath))
23
+ end
24
+
25
+ def [](name)
26
+ sprite(name)
27
+ end
28
+
29
+ def sprite(name)
30
+ sprites_hash.fetch(name.to_sym)
31
+ end
32
+
33
+ private
34
+
35
+ def sprites_uncached
36
+ sprites_hash.dup.freeze
37
+ end
38
+
39
+ def sprites_hash
40
+ @sprites_hash ||= {}
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Text
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbGameLib
6
+ module Utils
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbGameLib
4
- VERSION = '0.1.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -1,71 +1,72 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_ruby_utils/require_sub'
5
+ require 'ehb_game_lib/canvas'
6
+ ::EacRubyUtils.require_sub(__FILE__)
7
+
3
8
  module EhbGameLib
4
9
  class Window < ::Chingu::Window
5
10
  attr_accessor :fit_canvas_to_window, :draw_retro
6
- attr_reader :canvas_width, :canvas_height, :canvas_factor
11
+ attr_reader :canvas, :canvas_factor
7
12
 
8
13
  def initialize(canvas_width, canvas_height)
9
- @canvas_width = canvas_width
10
- @canvas_height = canvas_height
14
+ @canvas = ::EhbGameLib::Canvas.new(canvas_width, canvas_height)
11
15
  @canvas_factor = 1
12
16
  self.fit_canvas_to_window = true
13
17
  self.draw_retro = true
14
18
  super calculated_width, calculated_height
19
+ dimensions_reset
15
20
  end
16
21
 
17
22
  def calculated_width
18
- canvas_width * canvas_factor
23
+ canvas.width * canvas_factor
19
24
  end
20
25
 
21
26
  def calculated_height
22
- canvas_height * canvas_factor
27
+ canvas.height * canvas_factor
23
28
  end
24
29
 
25
30
  def canvas_factor=(factor)
26
31
  @canvas_factor = factor
27
- self.width = calculated_width
28
- self.height = calculated_height
32
+ dimensions_reset
33
+ end
34
+
35
+ def fullscreen=(value)
36
+ super(value)
37
+ dimensions_reset
29
38
  end
30
39
 
31
40
  def draw
32
41
  super if ::EhbGameLib::Globals.window
42
+ draw_resized
43
+ end
44
+
45
+ private
46
+
47
+ def dimensions_reset
48
+ if fullscreen?
49
+ self.width = canvas.width
50
+ self.height = canvas.height
51
+ else
52
+ self.width = calculated_width
53
+ self.height = calculated_height
54
+ end
33
55
  end
34
56
 
35
57
  def draw_resized
36
- return unless fit_canvas_to_window
58
+ return unless fit_canvas_to_window && !fullscreen?
37
59
 
38
60
  ::Gosu::Image.new(canvas_image_source, retro: draw_retro)
39
61
  .draw(0, 0, 100, canvas_factor, canvas_factor)
40
62
  end
41
63
 
42
- private
43
-
44
64
  def canvas_image_source
45
- image_source(0, height - canvas_height, canvas_width, canvas_height)
65
+ image_source(0, height - canvas.height, canvas.width, canvas.height)
46
66
  end
47
67
 
48
68
  def image_source(x, y, w, h)
49
69
  GlReadPixelsImage.new(x, y, w, h)
50
70
  end
51
-
52
- class GlReadPixelsImage
53
- attr_reader :columns, :rows
54
-
55
- DEPTH = 4
56
-
57
- def initialize(x, y, width, height)
58
- @columns = width
59
- @rows = height
60
- Gosu.flush
61
- Gosu.gl do
62
- @blob = ::Gl.glReadPixels(x, y, width, height, Gl::GL_RGBA, Gl::GL_UNSIGNED_BYTE)
63
- end
64
- end
65
-
66
- def to_blob
67
- @blob.force_encoding('binary').scan(/.{#{columns * 4}}/m).reverse.join
68
- end
69
- end
70
71
  end
71
72
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'chingu'
4
+
5
+ module EhbGameLib
6
+ class Window < ::Chingu::Window
7
+ class GlReadPixelsImage
8
+ attr_reader :columns, :rows
9
+
10
+ DEPTH = 4
11
+
12
+ def initialize(x, y, width, height)
13
+ @columns = width
14
+ @rows = height
15
+ Gosu.flush
16
+ Gosu.gl do
17
+ @blob = ::Gl.glReadPixels(x, y, width, height, Gl::GL_RGBA, Gl::GL_UNSIGNED_BYTE)
18
+ end
19
+ end
20
+
21
+ def to_blob
22
+ @blob.force_encoding('binary').scan(/.{#{columns * 4}}/m).reverse.join
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ehb_game_lib/math/circle'
4
+ require 'ehb_game_lib/math/intersection/circle_line'
5
+ require 'ehb_game_lib/math/intersection/circle_line_segment'
3
6
  require 'test_helper'
4
7
 
5
8
  module EhbGameLib
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehb_game_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-22 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
14
+ name: chingu
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: 0.8.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.0
26
+ version: 0.8.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: chingu
28
+ name: eac_ruby_utils
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.1
33
+ version: '0.57'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.8.1
40
+ version: '0.57'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: gosu
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,33 +67,59 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: rmagick
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.1'
73
76
  - - ">="
74
77
  - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
78
+ version: 4.1.2
79
+ type: :runtime
77
80
  prerelease: false
78
81
  version_requirements: !ruby/object:Gem::Requirement
79
82
  requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '4.1'
80
86
  - - ">="
81
87
  - !ruby/object:Gem::Version
82
- version: '0'
88
+ version: 4.1.2
83
89
  - !ruby/object:Gem::Dependency
84
- name: rubocop
90
+ name: eac_ruby_gem_support
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: 0.79.0
95
+ version: '0.1'
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 0.1.2
90
99
  type: :development
91
100
  prerelease: false
92
101
  version_requirements: !ruby/object:Gem::Requirement
93
102
  requirements:
94
103
  - - "~>"
95
104
  - !ruby/object:Gem::Version
96
- version: 0.79.0
105
+ version: '0.1'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 0.1.2
109
+ - !ruby/object:Gem::Dependency
110
+ name: rake
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
97
123
  - !ruby/object:Gem::Dependency
98
124
  name: test-unit
99
125
  requirement: !ruby/object:Gem::Requirement
@@ -117,8 +143,10 @@ extra_rdoc_files: []
117
143
  files:
118
144
  - lib/ehb_game_lib.rb
119
145
  - lib/ehb_game_lib/base_state.rb
146
+ - lib/ehb_game_lib/canvas.rb
120
147
  - lib/ehb_game_lib/gfx.rb
121
148
  - lib/ehb_game_lib/globals.rb
149
+ - lib/ehb_game_lib/math.rb
122
150
  - lib/ehb_game_lib/math/circle.rb
123
151
  - lib/ehb_game_lib/math/intersection/circle_line.rb
124
152
  - lib/ehb_game_lib/math/intersection/circle_line_segment.rb
@@ -126,18 +154,29 @@ files:
126
154
  - lib/ehb_game_lib/math/line_segment.rb
127
155
  - lib/ehb_game_lib/math/quadratic_equation.rb
128
156
  - lib/ehb_game_lib/math/rectable_object.rb
157
+ - lib/ehb_game_lib/math/rectable_object/axis.rb
129
158
  - lib/ehb_game_lib/math/vector.rb
130
- - lib/ehb_game_lib/nes/all_colors_palette.rb
131
- - lib/ehb_game_lib/nes/color.rb
159
+ - lib/ehb_game_lib/media_path.rb
160
+ - lib/ehb_game_lib/nes.rb
132
161
  - lib/ehb_game_lib/nes/palette.rb
162
+ - lib/ehb_game_lib/nes/pvm_style_d93_palette.pal
163
+ - lib/ehb_game_lib/palettes.rb
164
+ - lib/ehb_game_lib/palettes/color.rb
165
+ - lib/ehb_game_lib/palettes/palette.rb
166
+ - lib/ehb_game_lib/palettes/sprite.rb
167
+ - lib/ehb_game_lib/palettes/sprite_set/paletted.rb
168
+ - lib/ehb_game_lib/palettes/sprite_set/source.rb
133
169
  - lib/ehb_game_lib/patches/chingu/basic_game_object.rb
134
170
  - lib/ehb_game_lib/patches/gosu/font.rb
171
+ - lib/ehb_game_lib/text.rb
135
172
  - lib/ehb_game_lib/text/bitmap_font.rb
136
173
  - lib/ehb_game_lib/text/bitmap_text.rb
137
174
  - lib/ehb_game_lib/traits/bounding_line_segment.rb
175
+ - lib/ehb_game_lib/utils.rb
138
176
  - lib/ehb_game_lib/utils/cursor.rb
139
177
  - lib/ehb_game_lib/version.rb
140
178
  - lib/ehb_game_lib/window.rb
179
+ - lib/ehb_game_lib/window/gl_read_pixels_image.rb
141
180
  - test/lib/ehb_game_lib/math/circle_test.rb
142
181
  - test/lib/ehb_game_lib/math/intersection/circle_line_segment_test.rb
143
182
  - test/lib/ehb_game_lib/math/intersection/circle_line_test.rb
@@ -164,8 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
203
  - !ruby/object:Gem::Version
165
204
  version: '0'
166
205
  requirements: []
167
- rubyforge_project:
168
- rubygems_version: 2.7.7
206
+ rubygems_version: 3.0.8
169
207
  signing_key:
170
208
  specification_version: 4
171
209
  summary: EHB's game library for Ruby
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EhbGameLib
4
- module Nes
5
- class AllColorsPalette
6
- def initialize(pal_file)
7
- @colors = []
8
- File.open(pal_file) do |file|
9
- while (b = file.read(3))
10
- b = b.bytes.to_a
11
- @colors << Gosu::Color.rgba(b[0], b[1], b[2], 0xFF)
12
- end
13
- end
14
- @colors.freeze
15
- end
16
-
17
- def gosu_color(i)
18
- @colors[i]
19
- end
20
-
21
- def draw(x, y)
22
- s = 32
23
- @colors.each_with_index do |c, i|
24
- cx = x + (i % 16) * s
25
- cy = y + (i / 16) * s
26
- Gosu.draw_rect(cx, cy, s, s, c)
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EhbGameLib
4
- module Nes
5
- class Color
6
- attr_accessor :color_index
7
-
8
- BLACK = 0x0F
9
- YELLOW = 0x28
10
- RED = 0x05
11
- WHITE = 0x30
12
-
13
- def initialize(all_colors, color_index)
14
- @all_colors = all_colors
15
- @color_index = color_index
16
- end
17
-
18
- def gosu_color
19
- @all_colors.gosu_color(color_index)
20
- end
21
- end
22
- end
23
- end