ehb_game_lib 0.0.5
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 +7 -0
- data/lib/ehb_game_lib.rb +24 -0
- data/lib/ehb_game_lib/gfx.rb +36 -0
- data/lib/ehb_game_lib/globals.rb +10 -0
- data/lib/ehb_game_lib/math/circle.rb +38 -0
- data/lib/ehb_game_lib/math/intersection/circle_line.rb +76 -0
- data/lib/ehb_game_lib/math/intersection/circle_line_segment.rb +24 -0
- data/lib/ehb_game_lib/math/line.rb +27 -0
- data/lib/ehb_game_lib/math/line_segment.rb +35 -0
- data/lib/ehb_game_lib/math/quadratic_equation.rb +28 -0
- data/lib/ehb_game_lib/math/rectable_object.rb +98 -0
- data/lib/ehb_game_lib/math/vector.rb +52 -0
- data/lib/ehb_game_lib/nes/all_colors_palette.rb +29 -0
- data/lib/ehb_game_lib/nes/color.rb +21 -0
- data/lib/ehb_game_lib/nes/palette.rb +19 -0
- data/lib/ehb_game_lib/patches/chingu/basic_game_object.rb +22 -0
- data/lib/ehb_game_lib/patches/gosu/font.rb +29 -0
- data/lib/ehb_game_lib/traits/bounding_line_segment.rb +56 -0
- data/lib/ehb_game_lib/utils/cursor.rb +58 -0
- data/lib/ehb_game_lib/version.rb +3 -0
- data/test/lib/ehb_game_lib/math/circle_test.rb +16 -0
- data/test/lib/ehb_game_lib/math/intersection/circle_line_segment_test.rb +39 -0
- data/test/lib/ehb_game_lib/math/intersection/circle_line_test.rb +40 -0
- data/test/lib/ehb_game_lib/math/line_segment_test.rb +27 -0
- data/test/lib/ehb_game_lib/math/line_test.rb +40 -0
- data/test/lib/ehb_game_lib/math/quadratic_equation_test.rb +19 -0
- data/test/lib/ehb_game_lib/math/rectable_object_test.rb +77 -0
- data/test/test_helper.rb +2 -0
- metadata +154 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e2dd328f0f04eb106f0d5583057e3327c7e2ed15
|
4
|
+
data.tar.gz: 635f13624ba391b24b80a9403ae987db25d53d80
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 95094355b73f2229f9c976314f12b2ae364f9640e05e32e289bf05731b2bd736382ed508af0876be125d9953dc4eead42e4b3ffda5f2ea503474a682e536334c
|
7
|
+
data.tar.gz: 763dd1a5d99ee835996d3faf697c7668c0bb95fbf6b612794116aa7e0dd5673a0f1907ac44fdb2ca0222896ac130a3a3f36ee88b7745ece671c1f4091ea21d13
|
data/lib/ehb_game_lib.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext'
|
3
|
+
require 'chingu'
|
4
|
+
require 'ehb_game_lib/version'
|
5
|
+
require 'ehb_game_lib/globals'
|
6
|
+
require 'ehb_game_lib/gfx'
|
7
|
+
require 'ehb_game_lib/math/circle'
|
8
|
+
require 'ehb_game_lib/math/line'
|
9
|
+
require 'ehb_game_lib/math/line_segment'
|
10
|
+
require 'ehb_game_lib/math/quadratic_equation'
|
11
|
+
require 'ehb_game_lib/math/rectable_object'
|
12
|
+
require 'ehb_game_lib/math/vector'
|
13
|
+
require 'ehb_game_lib/math/intersection/circle_line'
|
14
|
+
require 'ehb_game_lib/math/intersection/circle_line_segment'
|
15
|
+
require 'ehb_game_lib/nes/all_colors_palette'
|
16
|
+
require 'ehb_game_lib/nes/color'
|
17
|
+
require 'ehb_game_lib/nes/palette'
|
18
|
+
require 'ehb_game_lib/patches/chingu/basic_game_object'
|
19
|
+
require 'ehb_game_lib/patches/gosu/font'
|
20
|
+
require 'ehb_game_lib/traits/bounding_line_segment'
|
21
|
+
require 'ehb_game_lib/utils/cursor'
|
22
|
+
|
23
|
+
module EhbGameLib
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
class Gfx
|
3
|
+
class << self
|
4
|
+
def fill_circle(cx, cy, r, color, z)
|
5
|
+
x1 = 0
|
6
|
+
y1 = -r
|
7
|
+
circ = 2 * ::Math::PI * r
|
8
|
+
step = 360 / circ
|
9
|
+
step.step(45, step) do |a|
|
10
|
+
x2 = Gosu.offset_x(a, r)
|
11
|
+
y2 = Gosu.offset_y(a, r)
|
12
|
+
EhbGameLib::Globals.window.draw_quad \
|
13
|
+
cx + x1, cy + y1, color, cx + x2, cy + y2, color,
|
14
|
+
cx - x2, cy + y2, color, cx - x1, cy + y1, color, z
|
15
|
+
EhbGameLib::Globals.window.draw_quad \
|
16
|
+
cx - x1, cy - y1, color, cx - x2, cy - y2, color,
|
17
|
+
cx + x2, cy - y2, color, cx + x1, cy - y1, color, z
|
18
|
+
EhbGameLib::Globals.window.draw_quad \
|
19
|
+
cx + y1, cy + x1, color, cx + y2, cy + x2, color,
|
20
|
+
cx - y2, cy + x2, color, cx - y1, cy + x1, color, z
|
21
|
+
EhbGameLib::Globals.window.draw_quad \
|
22
|
+
cx - y1, cy - x1, color, cx - y2, cy - x2, color,
|
23
|
+
cx + y2, cy - x2, color, cx + y1, cy - x1, color, z
|
24
|
+
x1 = x2
|
25
|
+
y1 = y2
|
26
|
+
end
|
27
|
+
EhbGameLib::Globals.window.draw_quad \
|
28
|
+
cx + x1, cy + y1, color, cx - y1, cy - x1, color,
|
29
|
+
cx + y1, cy - x1, color, cx - x1, cy + y1, color, z
|
30
|
+
EhbGameLib::Globals.window.draw_quad \
|
31
|
+
cx - x1, cy - y1, color, cx + y1, cy + x1, color,
|
32
|
+
cx - y1, cy + x1, color, cx + x1, cy - y1, color, z
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
class Circle
|
4
|
+
attr_reader :center, :radius
|
5
|
+
|
6
|
+
def initialize(cx, cy, radius)
|
7
|
+
@center = Vector.new(cx, cy)
|
8
|
+
@radius = radius
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"C: #{center}, R: #{radius}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def ys(x)
|
16
|
+
QuadraticEquation.new(1, -2 * cy, ys_c(x)).roots
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def ys_c(x)
|
22
|
+
x.abs2 - 2 * x * cx + cx.abs2 + cy.abs2 - r.abs2
|
23
|
+
end
|
24
|
+
|
25
|
+
def cx
|
26
|
+
center.x
|
27
|
+
end
|
28
|
+
|
29
|
+
def cy
|
30
|
+
center.y
|
31
|
+
end
|
32
|
+
|
33
|
+
def r
|
34
|
+
radius
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
module Intersection
|
4
|
+
class CircleLine
|
5
|
+
def initialize(circle, line)
|
6
|
+
@circle = circle
|
7
|
+
@line = line
|
8
|
+
end
|
9
|
+
|
10
|
+
def intersection
|
11
|
+
@intersection ||= intersection_uncached
|
12
|
+
end
|
13
|
+
|
14
|
+
def intersect?
|
15
|
+
!intersection.empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def intersection_uncached
|
21
|
+
xs.flat_map do |x|
|
22
|
+
@circle.ys(x).map { |y| Vector.new(x, y) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def xs
|
27
|
+
QuadraticEquation.new(xs_a, xs_b, xs_c).roots
|
28
|
+
end
|
29
|
+
|
30
|
+
def xs_a
|
31
|
+
b.abs2 + a.abs2
|
32
|
+
end
|
33
|
+
|
34
|
+
def xs_b
|
35
|
+
-2 * cx * b.abs2 + 2 * a * (c + cy * b)
|
36
|
+
end
|
37
|
+
|
38
|
+
def xs_c
|
39
|
+
xs_c0 + xs_c1
|
40
|
+
end
|
41
|
+
|
42
|
+
def xs_c0
|
43
|
+
b.abs2 * (cx.abs2 + cy.abs2 - r.abs2)
|
44
|
+
end
|
45
|
+
|
46
|
+
def xs_c1
|
47
|
+
c * (c + 2 * cy * b)
|
48
|
+
end
|
49
|
+
|
50
|
+
def a
|
51
|
+
@line.a
|
52
|
+
end
|
53
|
+
|
54
|
+
def b
|
55
|
+
@line.b
|
56
|
+
end
|
57
|
+
|
58
|
+
def c
|
59
|
+
@line.c
|
60
|
+
end
|
61
|
+
|
62
|
+
def r
|
63
|
+
@circle.radius
|
64
|
+
end
|
65
|
+
|
66
|
+
def cx
|
67
|
+
@circle.center.x
|
68
|
+
end
|
69
|
+
|
70
|
+
def cy
|
71
|
+
@circle.center.y
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
module Intersection
|
4
|
+
class CircleLineSegment
|
5
|
+
def initialize(circle, line_segment)
|
6
|
+
@circle = circle
|
7
|
+
@line_segment = line_segment
|
8
|
+
end
|
9
|
+
|
10
|
+
def intersection
|
11
|
+
circle_line.intersection.select do |point|
|
12
|
+
@line_segment.point_in_area?(point)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def circle_line
|
19
|
+
@circle_line ||= CircleLine.new(@circle, @line_segment.line)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
class Line
|
4
|
+
class << self
|
5
|
+
def new_by_coordinates(x0, y0, x1, y1)
|
6
|
+
new(
|
7
|
+
y1 - y0,
|
8
|
+
x0 - x1,
|
9
|
+
y0 * x1 + x0 * y0 - x0 * y1 - y0 * x0
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :a, :b, :c
|
15
|
+
|
16
|
+
def initialize(a, b, c)
|
17
|
+
@a = a
|
18
|
+
@b = b
|
19
|
+
@c = c
|
20
|
+
end
|
21
|
+
|
22
|
+
def point_in?(vector)
|
23
|
+
(vector.x * a + vector.y * b + c).zero?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
class LineSegment
|
4
|
+
attr_reader :p0, :p1
|
5
|
+
|
6
|
+
def initialize(x0, y0, x1, y1)
|
7
|
+
@p0 = Vector.new(x0, y0)
|
8
|
+
@p1 = Vector.new(x1, y1)
|
9
|
+
end
|
10
|
+
|
11
|
+
def line
|
12
|
+
@line ||= Line.new_by_coordinates(p0.x, p0.y, p1.x, p1.y)
|
13
|
+
end
|
14
|
+
|
15
|
+
def point_in_area?(vector)
|
16
|
+
x_interval.include?(vector.x) && y_interval.include?(vector.y)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def x_interval
|
22
|
+
@x_interval ||= interval(p0.x, p1.x)
|
23
|
+
end
|
24
|
+
|
25
|
+
def y_interval
|
26
|
+
@y_interval ||= interval(p0.y, p1.y)
|
27
|
+
end
|
28
|
+
|
29
|
+
def interval(c0, c1)
|
30
|
+
i = [c0, c1].sort
|
31
|
+
(i[0]..i[1])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
class QuadraticEquation
|
4
|
+
attr_reader :a, :b, :c
|
5
|
+
|
6
|
+
def initialize(a, b, c)
|
7
|
+
@a = a
|
8
|
+
@b = b
|
9
|
+
@c = c
|
10
|
+
end
|
11
|
+
|
12
|
+
def roots
|
13
|
+
return [root(1), root(-1)] if delta > 0.0
|
14
|
+
return [root(1)] if delta == 0.0
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
|
18
|
+
def delta
|
19
|
+
@delta ||= b**2 - 4 * a * c
|
20
|
+
end
|
21
|
+
|
22
|
+
def root(signal)
|
23
|
+
signal = signal < 0 ? -1 : 1
|
24
|
+
(-b + signal * ::Math.sqrt(delta)) / (2 * a)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
module RectableObject
|
4
|
+
H_AXIS = { name: :ax, coord: :x, size: :width, floor: :left, mean: :center,
|
5
|
+
ceil: :right }.freeze
|
6
|
+
V_AXIS = { name: :ay, coord: :y, size: :height, floor: :top, mean: :middle,
|
7
|
+
ceil: :bottom }.freeze
|
8
|
+
|
9
|
+
[H_AXIS, V_AXIS].each do |a|
|
10
|
+
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
11
|
+
def #{a[:name]}
|
12
|
+
@#{a[:name]} ||= Axis.new(
|
13
|
+
-> { #{a[:coord]} },
|
14
|
+
-> (v) { self.#{a[:coord]} = v },
|
15
|
+
-> { #{a[:size]} }
|
16
|
+
)
|
17
|
+
end
|
18
|
+
RUBY_EVAL
|
19
|
+
|
20
|
+
%i[floor mean ceil].each do |m|
|
21
|
+
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
22
|
+
def #{a[m]}
|
23
|
+
#{a[:name]}.#{m}
|
24
|
+
end
|
25
|
+
|
26
|
+
def #{a[m]}=(v)
|
27
|
+
#{a[:name]}.#{m} = v
|
28
|
+
end
|
29
|
+
RUBY_EVAL
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def rect
|
34
|
+
::Chingu::Rect.new(left, top, width, height)
|
35
|
+
end
|
36
|
+
|
37
|
+
class Axis
|
38
|
+
attr_accessor :anchor
|
39
|
+
|
40
|
+
def initialize(coord_get, coord_set, size_get)
|
41
|
+
@coord_get = coord_get
|
42
|
+
@coord_set = coord_set
|
43
|
+
@size_get = size_get
|
44
|
+
end
|
45
|
+
|
46
|
+
def coord
|
47
|
+
@coord_get.call
|
48
|
+
end
|
49
|
+
|
50
|
+
def coord=(v)
|
51
|
+
@coord_set.call(v)
|
52
|
+
end
|
53
|
+
|
54
|
+
def size
|
55
|
+
@size_get.call
|
56
|
+
end
|
57
|
+
|
58
|
+
%w[floor mean ceil].each do |m|
|
59
|
+
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
60
|
+
def #{m}
|
61
|
+
coord + #{m}_delta
|
62
|
+
end
|
63
|
+
|
64
|
+
def #{m}=(v)
|
65
|
+
self.coord = v - #{m}_delta
|
66
|
+
end
|
67
|
+
RUBY_EVAL
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def floor_delta
|
73
|
+
case anchor
|
74
|
+
when :mean then - size / 2
|
75
|
+
when :ceil then - size
|
76
|
+
else 0
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def mean_delta
|
81
|
+
case anchor
|
82
|
+
when :mean then 0
|
83
|
+
when :ceil then - size / 2
|
84
|
+
else size / 2
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def ceil_delta
|
89
|
+
case anchor
|
90
|
+
when :mean then size / 2
|
91
|
+
when :ceil then 0
|
92
|
+
else size
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Math
|
3
|
+
class Vector
|
4
|
+
attr_reader :x, :y
|
5
|
+
|
6
|
+
def initialize(x, y)
|
7
|
+
@x = x
|
8
|
+
@y = y
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"#{x}, #{y}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def equal?(other)
|
16
|
+
x == other.x && y == other.y
|
17
|
+
end
|
18
|
+
|
19
|
+
def ==(other)
|
20
|
+
equal?(other)
|
21
|
+
end
|
22
|
+
|
23
|
+
def +(other)
|
24
|
+
self.class.new(x + other.x, y + other.y)
|
25
|
+
end
|
26
|
+
|
27
|
+
def -(other)
|
28
|
+
self.class.new(x - other.x, y - other.y)
|
29
|
+
end
|
30
|
+
|
31
|
+
def *(other)
|
32
|
+
self.class.new(x * other, y * other)
|
33
|
+
end
|
34
|
+
|
35
|
+
def /(other)
|
36
|
+
self.class.new(x / other, y / other)
|
37
|
+
end
|
38
|
+
|
39
|
+
def dot(other)
|
40
|
+
x * other.x + y * other.y
|
41
|
+
end
|
42
|
+
|
43
|
+
def length
|
44
|
+
@length ||= ::Math.sqrt(x * x + y * y)
|
45
|
+
end
|
46
|
+
|
47
|
+
def normalize
|
48
|
+
self / length
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Nes
|
3
|
+
class AllColorsPalette
|
4
|
+
def initialize(pal_file)
|
5
|
+
@colors = []
|
6
|
+
File.open(pal_file) do |file|
|
7
|
+
while (b = file.read(3))
|
8
|
+
b = b.bytes.to_a
|
9
|
+
@colors << Gosu::Color.rgba(b[0], b[1], b[2], 0xFF)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
@colors.freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
def gosu_color(i)
|
16
|
+
@colors[i]
|
17
|
+
end
|
18
|
+
|
19
|
+
def draw(x, y)
|
20
|
+
s = 32
|
21
|
+
@colors.each_with_index do |c, i|
|
22
|
+
cx = x + (i % 16) * s
|
23
|
+
cy = y + (i / 16) * s
|
24
|
+
Gosu.draw_rect(cx, cy, s, s, c)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Nes
|
3
|
+
class Color
|
4
|
+
attr_accessor :color_index
|
5
|
+
|
6
|
+
BLACK = 0x0F
|
7
|
+
YELLOW = 0x28
|
8
|
+
RED = 0x05
|
9
|
+
WHITE = 0x30
|
10
|
+
|
11
|
+
def initialize(all_colors, color_index)
|
12
|
+
@all_colors = all_colors
|
13
|
+
@color_index = color_index
|
14
|
+
end
|
15
|
+
|
16
|
+
def gosu_color
|
17
|
+
@all_colors.gosu_color(color_index)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Nes
|
3
|
+
class Palette
|
4
|
+
COLORS_COUNT = 16
|
5
|
+
|
6
|
+
def initialize(all_colors)
|
7
|
+
@colors = Array.new(COLORS_COUNT) { |i| ::EhbGameLib::Nes::Color.new(all_colors, i) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](index)
|
11
|
+
@colors[index % @colors.length]
|
12
|
+
end
|
13
|
+
|
14
|
+
def []=(index, value)
|
15
|
+
@colors[index % @colors.length].color_index = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Patches
|
3
|
+
module Chingu
|
4
|
+
module BasicGameObject
|
5
|
+
def destroy
|
6
|
+
super
|
7
|
+
@alive = false
|
8
|
+
end
|
9
|
+
|
10
|
+
def alive?
|
11
|
+
@alive.nil? ? true : false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
unless ::Chingu::BasicGameObject.included_modules.include?(
|
19
|
+
::EhbGameLib::Patches::Chingu::BasicGameObject
|
20
|
+
)
|
21
|
+
::Chingu::BasicGameObject.prepend(::EhbGameLib::Patches::Chingu::BasicGameObject)
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Patches
|
3
|
+
module Gosu
|
4
|
+
module Font
|
5
|
+
# Draw text with line breaks.
|
6
|
+
def drawm(text, x, y, z, scale_x = 1, scale_y = 1, color = 0xff_ffffff, mode = :default)
|
7
|
+
text.each_line do |line|
|
8
|
+
draw(line.delete("\n"), x, y, z, scale_x, scale_y, color, mode)
|
9
|
+
y += height
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def text_height(text)
|
14
|
+
text.lines.count * height
|
15
|
+
end
|
16
|
+
|
17
|
+
def text_width(text)
|
18
|
+
text.lines.map { |l| super(l) }.max
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
unless ::Gosu::Font.included_modules.include?(
|
26
|
+
::EhbGameLib::Patches::Gosu::Font
|
27
|
+
)
|
28
|
+
::Gosu::Font.prepend(::EhbGameLib::Patches::Gosu::Font)
|
29
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Traits
|
3
|
+
# Interface required:
|
4
|
+
# attr_reader :last_x, :last_y
|
5
|
+
module BoundingLineSegment
|
6
|
+
def nearest_circle_collision(klasses)
|
7
|
+
return [nil, nil] unless line_segment?
|
8
|
+
min_obj = min_p = min_dist = nil
|
9
|
+
each_circle_collision(klasses) do |object, p|
|
10
|
+
dist = Gosu.distance(last_x, last_y, p.x, p.y)
|
11
|
+
next unless min_dist.nil? || dist < min_dist
|
12
|
+
min_dist = dist
|
13
|
+
min_obj = object
|
14
|
+
min_p = p
|
15
|
+
end
|
16
|
+
[min_obj, min_p]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def each_circle_collision(klasses)
|
22
|
+
each_game_object(klasses) do |object|
|
23
|
+
object_intersection(object).intersection.each do |p|
|
24
|
+
yield(object, p)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def each_game_object(klasses)
|
30
|
+
Array(klasses).each do |klass|
|
31
|
+
(klass.respond_to?(:all) ? klass.all : Array(klass)).each do |object|
|
32
|
+
yield(object)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def line_segment?
|
38
|
+
last_x.nil? || last_y.nil? || x.nil? || y.nil? ? false : true
|
39
|
+
end
|
40
|
+
|
41
|
+
def line_segment
|
42
|
+
::EhbGameLib::Math::LineSegment.new(last_x, last_y, x, y)
|
43
|
+
end
|
44
|
+
|
45
|
+
def object_circle(object)
|
46
|
+
::EhbGameLib::Math::Circle.new(object.x, object.y, object.radius)
|
47
|
+
end
|
48
|
+
|
49
|
+
def object_intersection(object)
|
50
|
+
::EhbGameLib::Math::Intersection::CircleLineSegment.new(
|
51
|
+
object_circle(object), line_segment
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module EhbGameLib
|
2
|
+
module Utils
|
3
|
+
class Cursor
|
4
|
+
def initialize(set)
|
5
|
+
@set = set.to_a
|
6
|
+
@index = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
delegate :count, :each, :inject, :map, to: :set
|
10
|
+
|
11
|
+
def select_last
|
12
|
+
self.index = @set.length - 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def next_element
|
16
|
+
next_previous_element(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
def previous_element
|
20
|
+
next_previous_element(-1)
|
21
|
+
end
|
22
|
+
|
23
|
+
def current
|
24
|
+
index.nil? ? nil : @set[index]
|
25
|
+
end
|
26
|
+
|
27
|
+
def index
|
28
|
+
fix_index
|
29
|
+
@index
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def fix_index
|
35
|
+
if @set.empty?
|
36
|
+
@index = nil
|
37
|
+
elsif @index.nil?
|
38
|
+
@index = 0
|
39
|
+
elsif @index >= @set.count
|
40
|
+
@index = @set.count - 1
|
41
|
+
elsif @index < 0
|
42
|
+
@index = 0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def index=(value)
|
47
|
+
@index = value
|
48
|
+
fix_index
|
49
|
+
end
|
50
|
+
|
51
|
+
attr_reader :set
|
52
|
+
|
53
|
+
def next_previous_element(steps)
|
54
|
+
self.index = (index + steps) % @set.count
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
class CircleTest < Test::Unit::TestCase
|
6
|
+
test 'ys' do
|
7
|
+
circle = Circle.new(0, 0, 1)
|
8
|
+
assert_equal [], circle.ys(-1.1)
|
9
|
+
assert_equal [0], circle.ys(-1)
|
10
|
+
assert_equal [1, -1], circle.ys(0)
|
11
|
+
assert_equal [0], circle.ys(1)
|
12
|
+
assert_equal [], circle.ys(1.1)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
module Intersection
|
6
|
+
class CircleLineSegmentTest < Test::Unit::TestCase
|
7
|
+
test 'intersect' do
|
8
|
+
@circle = Circle.new(0, 0, 1)
|
9
|
+
assert_equal [], intersection(-1.1, -1, -1.1, 1)
|
10
|
+
assert_equal [Vector.new(-1.0, 0)], intersection(-1.0, -1, -1.0, 1)
|
11
|
+
assert_equal [Vector.new(0, -1)], intersection(0, -1, 0, 0)
|
12
|
+
assert_equal [Vector.new(0, 1), Vector.new(0, -1)], intersection(0, -1, 0, 1)
|
13
|
+
assert_equal [Vector.new(1, 0), Vector.new(-1, 0)], intersection(-2, 0, 2, 0)
|
14
|
+
|
15
|
+
@circle = Circle.new(320, 120, 12)
|
16
|
+
assert_equal [Vector.new(320, 132), Vector.new(320, 108)],
|
17
|
+
intersection(320.0, 215.0, 320.0, -4785.0)
|
18
|
+
|
19
|
+
@circle = Circle.new(320, 240, 12)
|
20
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
21
|
+
intersection(100, 240, 500, 240)
|
22
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
23
|
+
intersection(455.0, 240, -4545.0, 240)
|
24
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
25
|
+
intersection(455.0, 240.00000000012759, -4545.0, 239.9999999235764)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def intersection(seg_x0, seg_y0, seg_x1, seg_y1)
|
31
|
+
CircleLineSegment.new(
|
32
|
+
@circle,
|
33
|
+
::EhbGameLib::Math::LineSegment.new(seg_x0, seg_y0, seg_x1, seg_y1)
|
34
|
+
).intersection
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
module Intersection
|
6
|
+
class CircleLineTest < Test::Unit::TestCase
|
7
|
+
test 'intersect' do
|
8
|
+
@circle = Circle.new(0, 0, 1)
|
9
|
+
assert_equal [], intersection(-1.1, -1, -1.1, 1)
|
10
|
+
assert_equal [Vector.new(-1.0, 0)], intersection(-1.0, -1, -1.0, 1)
|
11
|
+
assert_equal [Vector.new(0, 1), Vector.new(0, -1)], intersection(0, -1, 0, 0)
|
12
|
+
assert_equal [Vector.new(0, 1), Vector.new(0, -1)], intersection(0, -1, 0, 1)
|
13
|
+
assert_equal [Vector.new(1, 0), Vector.new(-1, 0)], intersection(-2, 0, 2, 0)
|
14
|
+
|
15
|
+
@circle = Circle.new(320, 120, 12)
|
16
|
+
assert_equal [Vector.new(320, 132), Vector.new(320, 108)],
|
17
|
+
intersection(320.0, 215.0, 320.0, -4785.0)
|
18
|
+
|
19
|
+
@circle = Circle.new(320, 240, 12)
|
20
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
21
|
+
intersection(100, 240, 500, 240)
|
22
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
23
|
+
intersection(455.0, 240, -4545.0, 240)
|
24
|
+
assert_equal [Vector.new(332, 240), Vector.new(308, 240)],
|
25
|
+
intersection(455.0, 240.00000000012759, -4545.0, 239.9999999235764)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def intersection(seg_x0, seg_y0, seg_x1, seg_y1)
|
31
|
+
CircleLine.new(@circle, line(seg_x0, seg_y0, seg_x1, seg_y1)).intersection
|
32
|
+
end
|
33
|
+
|
34
|
+
def line(seg_x0, seg_y0, seg_x1, seg_y1)
|
35
|
+
::EhbGameLib::Math::Line.new_by_coordinates(seg_x0, seg_y0, seg_x1, seg_y1)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
class LineSegmentTest < Test::Unit::TestCase
|
6
|
+
test 'point_in_area?' do
|
7
|
+
line = LineSegment.new(-1, -1, -1, 1)
|
8
|
+
assert_equal true, line.point_in_area?(Vector.new(-1, -1))
|
9
|
+
assert_equal true, line.point_in_area?(Vector.new(-1, 1))
|
10
|
+
assert_equal true, line.point_in_area?(Vector.new(-1, 0))
|
11
|
+
assert_equal false, line.point_in_area?(Vector.new(-1, 2))
|
12
|
+
assert_equal false, line.point_in_area?(Vector.new(-1.1, 2))
|
13
|
+
|
14
|
+
line = LineSegment.new(-1, -1, 1, -1)
|
15
|
+
assert_equal true, line.point_in_area?(Vector.new(-1, -1))
|
16
|
+
assert_equal true, line.point_in_area?(Vector.new(1, -1))
|
17
|
+
assert_equal true, line.point_in_area?(Vector.new(0, -1))
|
18
|
+
assert_equal false, line.point_in_area?(Vector.new(2, -1))
|
19
|
+
assert_equal false, line.point_in_area?(Vector.new(2, -1.1))
|
20
|
+
|
21
|
+
line = LineSegment.new(455.0, 240.00000000012759, -4545.0, 239.9999999235764)
|
22
|
+
assert_equal true, line.point_in_area?(Vector.new(332.0, 240.0))
|
23
|
+
assert_equal true, line.point_in_area?(Vector.new(308.0, 240.0))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
class LineTest < Test::Unit::TestCase
|
6
|
+
test 'new_by_coordinates' do
|
7
|
+
l = Line.new_by_coordinates(100, 240, 500, 240)
|
8
|
+
assert_equal(0, l.a)
|
9
|
+
assert_equal(-400, l.b)
|
10
|
+
assert_equal(96_000, l.c)
|
11
|
+
|
12
|
+
l = Line.new_by_coordinates(455.0, 240, -4545.0, 240)
|
13
|
+
assert_equal(0, l.a)
|
14
|
+
assert_equal(5000, l.b)
|
15
|
+
assert_equal(-1_200_000, l.c)
|
16
|
+
|
17
|
+
l = Line.new_by_coordinates(455.0, 240.00000000012759, -4545.0, 239.9999999235764)
|
18
|
+
assert_equal(-7.65511742883973e-08, l.a)
|
19
|
+
assert_equal(5000, l.b)
|
20
|
+
assert_equal(-1_199_999.9999658072, l.c)
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'point_in?' do
|
24
|
+
line = Line.new_by_coordinates(-1, -1, -1, 1)
|
25
|
+
assert_equal true, line.point_in?(Vector.new(-1, -1))
|
26
|
+
assert_equal true, line.point_in?(Vector.new(-1, 1))
|
27
|
+
assert_equal true, line.point_in?(Vector.new(-1, 0))
|
28
|
+
assert_equal true, line.point_in?(Vector.new(-1, 2))
|
29
|
+
assert_equal false, line.point_in?(Vector.new(-1.1, 2))
|
30
|
+
|
31
|
+
line = Line.new_by_coordinates(-1, -1, 1, -1)
|
32
|
+
assert_equal true, line.point_in?(Vector.new(-1, -1))
|
33
|
+
assert_equal true, line.point_in?(Vector.new(1, -1))
|
34
|
+
assert_equal true, line.point_in?(Vector.new(0, -1))
|
35
|
+
assert_equal true, line.point_in?(Vector.new(2, -1))
|
36
|
+
assert_equal false, line.point_in?(Vector.new(2, -1.1))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
class QuadraticEquationTest < Test::Unit::TestCase
|
6
|
+
test 'delta' do
|
7
|
+
assert_equal(-8, QuadraticEquation.new(1, 2, 3).delta)
|
8
|
+
assert_equal(0, QuadraticEquation.new(1, 8, 16).delta)
|
9
|
+
assert_equal(16, QuadraticEquation.new(1, 2, -3).delta)
|
10
|
+
end
|
11
|
+
|
12
|
+
test 'roots' do
|
13
|
+
assert_equal([], QuadraticEquation.new(1, 2, 3).roots)
|
14
|
+
assert_equal([-4], QuadraticEquation.new(1, 8, 16).roots)
|
15
|
+
assert_equal([1, -3], QuadraticEquation.new(1, 2, -3).roots)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module EhbGameLib
|
4
|
+
module Math
|
5
|
+
class RectableObjectTest < Test::Unit::TestCase
|
6
|
+
class Stub
|
7
|
+
include ::EhbGameLib::Math::RectableObject
|
8
|
+
|
9
|
+
attr_accessor :x, :y
|
10
|
+
|
11
|
+
def width
|
12
|
+
10
|
13
|
+
end
|
14
|
+
|
15
|
+
def height
|
16
|
+
10
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
setup do
|
21
|
+
@o = Stub.new
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'x anchor' do
|
25
|
+
@o.x = 20
|
26
|
+
assert_x_values(20, 20, 25, 30)
|
27
|
+
|
28
|
+
@o.ax.anchor = :mean
|
29
|
+
assert_x_values(20, 15, 20, 25)
|
30
|
+
|
31
|
+
@o.ax.anchor = :ceil
|
32
|
+
assert_x_values(20, 10, 15, 20)
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'y anchor' do
|
36
|
+
@o.y = 20
|
37
|
+
assert_y_values(20, 20, 25, 30)
|
38
|
+
|
39
|
+
@o.ay.anchor = :mean
|
40
|
+
assert_y_values(20, 15, 20, 25)
|
41
|
+
|
42
|
+
@o.ay.anchor = :ceil
|
43
|
+
assert_y_values(20, 10, 15, 20)
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'left set' do
|
47
|
+
@o.ax.anchor = :floor
|
48
|
+
@o.left = 20
|
49
|
+
assert_x_values(20, 20, 25, 30)
|
50
|
+
|
51
|
+
@o.ax.anchor = :mean
|
52
|
+
@o.left = 30
|
53
|
+
assert_x_values(35, 30, 35, 40)
|
54
|
+
|
55
|
+
@o.ax.anchor = :ceil
|
56
|
+
@o.left = 40
|
57
|
+
assert_x_values(50, 40, 45, 50)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def assert_x_values(x, left, center, right)
|
63
|
+
assert_equal x, @o.x, 'x'
|
64
|
+
assert_equal left, @o.left, 'left'
|
65
|
+
assert_equal center, @o.center, 'center'
|
66
|
+
assert_equal right, @o.right, 'right'
|
67
|
+
end
|
68
|
+
|
69
|
+
def assert_y_values(y, top, middle, bottom)
|
70
|
+
assert_equal y, @o.y, 'y'
|
71
|
+
assert_equal top, @o.top, 'top'
|
72
|
+
assert_equal middle, @o.middle, 'middle'
|
73
|
+
assert_equal bottom, @o.bottom, 'bottom'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ehb_game_lib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eduardo H. Bogoni
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: chingu
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: gosu
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.13.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.13.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.42.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.42.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: test-unit
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- eduardobogoni@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- lib/ehb_game_lib.rb
|
105
|
+
- lib/ehb_game_lib/gfx.rb
|
106
|
+
- lib/ehb_game_lib/globals.rb
|
107
|
+
- lib/ehb_game_lib/math/circle.rb
|
108
|
+
- lib/ehb_game_lib/math/intersection/circle_line.rb
|
109
|
+
- lib/ehb_game_lib/math/intersection/circle_line_segment.rb
|
110
|
+
- lib/ehb_game_lib/math/line.rb
|
111
|
+
- lib/ehb_game_lib/math/line_segment.rb
|
112
|
+
- lib/ehb_game_lib/math/quadratic_equation.rb
|
113
|
+
- lib/ehb_game_lib/math/rectable_object.rb
|
114
|
+
- lib/ehb_game_lib/math/vector.rb
|
115
|
+
- lib/ehb_game_lib/nes/all_colors_palette.rb
|
116
|
+
- lib/ehb_game_lib/nes/color.rb
|
117
|
+
- lib/ehb_game_lib/nes/palette.rb
|
118
|
+
- lib/ehb_game_lib/patches/chingu/basic_game_object.rb
|
119
|
+
- lib/ehb_game_lib/patches/gosu/font.rb
|
120
|
+
- lib/ehb_game_lib/traits/bounding_line_segment.rb
|
121
|
+
- lib/ehb_game_lib/utils/cursor.rb
|
122
|
+
- lib/ehb_game_lib/version.rb
|
123
|
+
- test/lib/ehb_game_lib/math/circle_test.rb
|
124
|
+
- test/lib/ehb_game_lib/math/intersection/circle_line_segment_test.rb
|
125
|
+
- test/lib/ehb_game_lib/math/intersection/circle_line_test.rb
|
126
|
+
- test/lib/ehb_game_lib/math/line_segment_test.rb
|
127
|
+
- test/lib/ehb_game_lib/math/line_test.rb
|
128
|
+
- test/lib/ehb_game_lib/math/quadratic_equation_test.rb
|
129
|
+
- test/lib/ehb_game_lib/math/rectable_object_test.rb
|
130
|
+
- test/test_helper.rb
|
131
|
+
homepage:
|
132
|
+
licenses: []
|
133
|
+
metadata: {}
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
require_paths:
|
137
|
+
- lib
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
requirements: []
|
149
|
+
rubyforge_project:
|
150
|
+
rubygems_version: 2.6.14
|
151
|
+
signing_key:
|
152
|
+
specification_version: 4
|
153
|
+
summary: EHB's game library for Ruby
|
154
|
+
test_files: []
|