cyberarm_engine 0.13.0 → 0.13.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 +4 -4
- data/.gitignore +8 -8
- data/.travis.yml +5 -5
- data/Gemfile +6 -6
- data/LICENSE.txt +21 -21
- data/README.md +73 -43
- data/Rakefile +10 -10
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/cyberarm_engine.gemspec +36 -36
- data/lib/cyberarm_engine.rb +49 -47
- data/lib/cyberarm_engine/animator.rb +53 -53
- data/lib/cyberarm_engine/background.rb +175 -175
- data/lib/cyberarm_engine/bounding_box.rb +149 -149
- data/lib/cyberarm_engine/common.rb +96 -96
- data/lib/cyberarm_engine/config_file.rb +46 -0
- data/lib/cyberarm_engine/engine.rb +101 -101
- data/lib/cyberarm_engine/game_object.rb +256 -256
- data/lib/cyberarm_engine/game_state.rb +88 -88
- data/lib/cyberarm_engine/gosu_ext/circle.rb +8 -8
- data/lib/cyberarm_engine/ray.rb +55 -55
- data/lib/cyberarm_engine/shader.rb +398 -262
- data/lib/cyberarm_engine/text.rb +146 -146
- data/lib/cyberarm_engine/timer.rb +22 -22
- data/lib/cyberarm_engine/transform.rb +272 -272
- data/lib/cyberarm_engine/ui/border_canvas.rb +100 -100
- data/lib/cyberarm_engine/ui/dsl.rb +98 -98
- data/lib/cyberarm_engine/ui/element.rb +275 -275
- data/lib/cyberarm_engine/ui/elements/button.rb +66 -66
- data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -58
- data/lib/cyberarm_engine/ui/elements/container.rb +176 -176
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +171 -171
- data/lib/cyberarm_engine/ui/elements/flow.rb +16 -16
- data/lib/cyberarm_engine/ui/elements/image.rb +51 -51
- data/lib/cyberarm_engine/ui/elements/label.rb +49 -49
- data/lib/cyberarm_engine/ui/elements/progress.rb +49 -49
- data/lib/cyberarm_engine/ui/elements/stack.rb +12 -12
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +55 -55
- data/lib/cyberarm_engine/ui/event.rb +46 -46
- data/lib/cyberarm_engine/ui/gui_state.rb +134 -134
- data/lib/cyberarm_engine/ui/style.rb +36 -36
- data/lib/cyberarm_engine/ui/theme.rb +120 -120
- data/lib/cyberarm_engine/vector.rb +289 -202
- data/lib/cyberarm_engine/version.rb +4 -4
- metadata +3 -2
@@ -1,54 +1,54 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Animator
|
3
|
-
DEFAULT_TWEEN = :linear
|
4
|
-
def initialize(start_time:, duration:, from:, to:, &block)
|
5
|
-
@start_time, @duration = start_time, duration
|
6
|
-
@from, @to = from.dup, to.dup
|
7
|
-
@block = block
|
8
|
-
end
|
9
|
-
|
10
|
-
def update
|
11
|
-
@block.call(self, @from, @to) if @block
|
12
|
-
end
|
13
|
-
|
14
|
-
def progress
|
15
|
-
(@start_time.to_f + (Gosu.milliseconds - @start_time)) / (@start_time + @duration.to_f)
|
16
|
-
end
|
17
|
-
|
18
|
-
def complete?
|
19
|
-
progress >= 1.0
|
20
|
-
end
|
21
|
-
|
22
|
-
def transition(from, to, tween = DEFAULT_TWEEN)
|
23
|
-
from + (to - from) * send("tween_#{tween}", progress)
|
24
|
-
end
|
25
|
-
|
26
|
-
def color_transition(from, to, tween = DEFAULT_TWEEN)
|
27
|
-
r = transition(from.red, to.red)
|
28
|
-
g = transition(from.green, to.green)
|
29
|
-
b = transition(from.blue, to.blue)
|
30
|
-
a = transition(from.alpha, to.alpha)
|
31
|
-
|
32
|
-
Gosu::Color.rgba(r, g, b, a)
|
33
|
-
end
|
34
|
-
|
35
|
-
def color_hsv_transition(from, to, tween = DEFAULT_TWEEN)
|
36
|
-
hue = transition(from.hue, to.hue, tween)
|
37
|
-
saturation = transition(from.saturation, to.saturation, tween)
|
38
|
-
value = transition(from.value, to.value, tween)
|
39
|
-
alpha = transition(from.alpha, to.alpha, tween)
|
40
|
-
|
41
|
-
Gosu::Color.from_ahsv(alpha, hue, saturation, value)
|
42
|
-
end
|
43
|
-
|
44
|
-
# NOTE: Use this for future reference? https://github.com/danro/easing-js/blob/master/easing.js
|
45
|
-
|
46
|
-
def tween_linear(t)
|
47
|
-
t
|
48
|
-
end
|
49
|
-
|
50
|
-
def tween_sine(t)
|
51
|
-
Math.sin(t) * t
|
52
|
-
end
|
53
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Animator
|
3
|
+
DEFAULT_TWEEN = :linear
|
4
|
+
def initialize(start_time:, duration:, from:, to:, &block)
|
5
|
+
@start_time, @duration = start_time, duration
|
6
|
+
@from, @to = from.dup, to.dup
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
@block.call(self, @from, @to) if @block
|
12
|
+
end
|
13
|
+
|
14
|
+
def progress
|
15
|
+
(@start_time.to_f + (Gosu.milliseconds - @start_time)) / (@start_time + @duration.to_f)
|
16
|
+
end
|
17
|
+
|
18
|
+
def complete?
|
19
|
+
progress >= 1.0
|
20
|
+
end
|
21
|
+
|
22
|
+
def transition(from, to, tween = DEFAULT_TWEEN)
|
23
|
+
from + (to - from) * send("tween_#{tween}", progress)
|
24
|
+
end
|
25
|
+
|
26
|
+
def color_transition(from, to, tween = DEFAULT_TWEEN)
|
27
|
+
r = transition(from.red, to.red)
|
28
|
+
g = transition(from.green, to.green)
|
29
|
+
b = transition(from.blue, to.blue)
|
30
|
+
a = transition(from.alpha, to.alpha)
|
31
|
+
|
32
|
+
Gosu::Color.rgba(r, g, b, a)
|
33
|
+
end
|
34
|
+
|
35
|
+
def color_hsv_transition(from, to, tween = DEFAULT_TWEEN)
|
36
|
+
hue = transition(from.hue, to.hue, tween)
|
37
|
+
saturation = transition(from.saturation, to.saturation, tween)
|
38
|
+
value = transition(from.value, to.value, tween)
|
39
|
+
alpha = transition(from.alpha, to.alpha, tween)
|
40
|
+
|
41
|
+
Gosu::Color.from_ahsv(alpha, hue, saturation, value)
|
42
|
+
end
|
43
|
+
|
44
|
+
# NOTE: Use this for future reference? https://github.com/danro/easing-js/blob/master/easing.js
|
45
|
+
|
46
|
+
def tween_linear(t)
|
47
|
+
t
|
48
|
+
end
|
49
|
+
|
50
|
+
def tween_sine(t)
|
51
|
+
Math.sin(t) * t
|
52
|
+
end
|
53
|
+
end
|
54
54
|
end
|
@@ -1,175 +1,175 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Background
|
3
|
-
attr_accessor :x, :y, :z, :width, :height, :angle, :debug
|
4
|
-
attr_reader :background
|
5
|
-
def initialize(x: 0, y: 0, z: 0, width: 0, height: 0, background: Gosu::Color::BLACK, angle: 0, debug: false)
|
6
|
-
@x,@y,@z = x,y,z
|
7
|
-
@width,@height = width,height
|
8
|
-
@debug = debug
|
9
|
-
|
10
|
-
@paint = Paint.new(background)
|
11
|
-
@angle = angle
|
12
|
-
|
13
|
-
@top_left = Vector.new(@x, @y)
|
14
|
-
@top_right = Vector.new(@x + @width, @y)
|
15
|
-
@bottom_left = Vector.new(@x, @y + @height)
|
16
|
-
@bottom_right = Vector.new(@x + @width, @y + @height)
|
17
|
-
end
|
18
|
-
|
19
|
-
def draw
|
20
|
-
Gosu.clip_to(@x, @y, @width, @height) do
|
21
|
-
Gosu.draw_quad(
|
22
|
-
@top_left.x, @top_left.y, @paint.top_left,
|
23
|
-
@top_right.x, @top_right.y, @paint.top_right,
|
24
|
-
@bottom_right.x, @bottom_right.y, @paint.bottom_right,
|
25
|
-
@bottom_left.x, @bottom_left.y, @paint.bottom_left,
|
26
|
-
@z
|
27
|
-
)
|
28
|
-
end
|
29
|
-
|
30
|
-
debug_outline if @debug
|
31
|
-
end
|
32
|
-
|
33
|
-
def update
|
34
|
-
origin_x = (@x + (@width/2))
|
35
|
-
origin_y = (@y + (@height/2))
|
36
|
-
|
37
|
-
points = [
|
38
|
-
@top_left = Vector.new(@x, @y),
|
39
|
-
@top_right = Vector.new(@x + @width, @y),
|
40
|
-
@bottom_left = Vector.new(@x, @y + @height),
|
41
|
-
@bottom_right = Vector.new(@x + @width, @y + @height)
|
42
|
-
]
|
43
|
-
|
44
|
-
[@top_left, @top_right, @bottom_left, @bottom_right].each do |vector|
|
45
|
-
temp_x = vector.x - origin_x
|
46
|
-
temp_y = vector.y - origin_y
|
47
|
-
|
48
|
-
# 90 is up here, while gosu uses 0 for up.
|
49
|
-
radians = (@angle + 90).gosu_to_radians
|
50
|
-
vector.x = (@x + (@width/2)) + ((temp_x * Math.cos(radians)) - (temp_y * Math.sin(radians)))
|
51
|
-
vector.y = (@y + (@height/2)) + ((temp_x * Math.sin(radians)) + (temp_y * Math.cos(radians)))
|
52
|
-
end
|
53
|
-
|
54
|
-
# [
|
55
|
-
# [:top, @top_left, @top_right],
|
56
|
-
# [:right, @top_right, @bottom_right],
|
57
|
-
# [:bottom, @bottom_right, @bottom_left],
|
58
|
-
# [:left, @bottom_left, @top_left]
|
59
|
-
# ].each do |edge|
|
60
|
-
# points.each do |point|
|
61
|
-
# puts "#{edge.first} -> #{shortest_distance(point, edge[1], edge[2])}"
|
62
|
-
# end
|
63
|
-
# end
|
64
|
-
end
|
65
|
-
|
66
|
-
def shortest_distance(point, la, lb)
|
67
|
-
a = la.x - lb.x
|
68
|
-
b = la.y - lb.y
|
69
|
-
c = Gosu.distance(la.x, la.y, lb.x, lb.y)
|
70
|
-
p a,b,c
|
71
|
-
d = (a * point.x + b * point.y + c).abs / (Math.sqrt(a * a + b * b))
|
72
|
-
puts "Distance: #{d}"
|
73
|
-
exit!
|
74
|
-
return d
|
75
|
-
end
|
76
|
-
|
77
|
-
def debug_outline
|
78
|
-
# Top
|
79
|
-
Gosu.draw_line(
|
80
|
-
@x, @y, Gosu::Color::RED,
|
81
|
-
@x + @width, @y, Gosu::Color::RED,
|
82
|
-
@z
|
83
|
-
)
|
84
|
-
|
85
|
-
# Right
|
86
|
-
Gosu.draw_line(
|
87
|
-
@x + @width, @y, Gosu::Color::RED,
|
88
|
-
@x + @width, @y + @height, Gosu::Color::RED,
|
89
|
-
@z
|
90
|
-
)
|
91
|
-
|
92
|
-
# Bottom
|
93
|
-
Gosu.draw_line(
|
94
|
-
@x + @width, @y + @height, Gosu::Color::RED,
|
95
|
-
@x, @y + @height, Gosu::Color::RED,
|
96
|
-
@z
|
97
|
-
)
|
98
|
-
|
99
|
-
# Left
|
100
|
-
Gosu.draw_line(
|
101
|
-
@x, @y + @height, Gosu::Color::RED,
|
102
|
-
@x, @y, Gosu::Color::RED,
|
103
|
-
@z
|
104
|
-
)
|
105
|
-
end
|
106
|
-
|
107
|
-
def background=(_background)
|
108
|
-
@paint.set(_background)
|
109
|
-
update
|
110
|
-
end
|
111
|
-
|
112
|
-
def angle=(n)
|
113
|
-
@angle = n
|
114
|
-
update
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class Paint
|
119
|
-
attr_accessor :top_left, :top_right, :bottom_left, :bottom_right
|
120
|
-
def initialize(background)
|
121
|
-
set(background)
|
122
|
-
end
|
123
|
-
|
124
|
-
def set(background)
|
125
|
-
@background = background
|
126
|
-
|
127
|
-
|
128
|
-
if background.is_a?(Numeric)
|
129
|
-
@top_left = background
|
130
|
-
@top_right = background
|
131
|
-
@bottom_left = background
|
132
|
-
@bottom_right = background
|
133
|
-
elsif background.is_a?(Gosu::Color)
|
134
|
-
@top_left = background
|
135
|
-
@top_right = background
|
136
|
-
@bottom_left = background
|
137
|
-
@bottom_right = background
|
138
|
-
elsif background.is_a?(Array)
|
139
|
-
if background.size == 1
|
140
|
-
set(background.first)
|
141
|
-
elsif background.size == 2
|
142
|
-
@top_left = background.first
|
143
|
-
@top_right = background.last
|
144
|
-
@bottom_left = background.first
|
145
|
-
@bottom_right = background.last
|
146
|
-
elsif background.size == 4
|
147
|
-
@top_left = background[0]
|
148
|
-
@top_right = background[1]
|
149
|
-
@bottom_left = background[2]
|
150
|
-
@bottom_right = background[3]
|
151
|
-
else
|
152
|
-
raise ArgumentError, "background array was empty or had wrong number of elements (expected 2 or 4 elements)"
|
153
|
-
end
|
154
|
-
elsif background.is_a?(Hash)
|
155
|
-
@top_left = background[:top_left]
|
156
|
-
@top_right = background[:top_right]
|
157
|
-
@bottom_left = background[:bottom_left]
|
158
|
-
@bottom_right = background[:bottom_right]
|
159
|
-
elsif background.is_a?(Range)
|
160
|
-
set([background.begin, background.begin, background.end, background.end])
|
161
|
-
else
|
162
|
-
raise ArgumentError, "background '#{background}' of type '#{background.class}' was not able to be processed"
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
# Add <=> method to support Range based gradients
|
169
|
-
module Gosu
|
170
|
-
class Color
|
171
|
-
def <=>(other)
|
172
|
-
self
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Background
|
3
|
+
attr_accessor :x, :y, :z, :width, :height, :angle, :debug
|
4
|
+
attr_reader :background
|
5
|
+
def initialize(x: 0, y: 0, z: 0, width: 0, height: 0, background: Gosu::Color::BLACK, angle: 0, debug: false)
|
6
|
+
@x,@y,@z = x,y,z
|
7
|
+
@width,@height = width,height
|
8
|
+
@debug = debug
|
9
|
+
|
10
|
+
@paint = Paint.new(background)
|
11
|
+
@angle = angle
|
12
|
+
|
13
|
+
@top_left = Vector.new(@x, @y)
|
14
|
+
@top_right = Vector.new(@x + @width, @y)
|
15
|
+
@bottom_left = Vector.new(@x, @y + @height)
|
16
|
+
@bottom_right = Vector.new(@x + @width, @y + @height)
|
17
|
+
end
|
18
|
+
|
19
|
+
def draw
|
20
|
+
Gosu.clip_to(@x, @y, @width, @height) do
|
21
|
+
Gosu.draw_quad(
|
22
|
+
@top_left.x, @top_left.y, @paint.top_left,
|
23
|
+
@top_right.x, @top_right.y, @paint.top_right,
|
24
|
+
@bottom_right.x, @bottom_right.y, @paint.bottom_right,
|
25
|
+
@bottom_left.x, @bottom_left.y, @paint.bottom_left,
|
26
|
+
@z
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
debug_outline if @debug
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
origin_x = (@x + (@width/2))
|
35
|
+
origin_y = (@y + (@height/2))
|
36
|
+
|
37
|
+
points = [
|
38
|
+
@top_left = Vector.new(@x, @y),
|
39
|
+
@top_right = Vector.new(@x + @width, @y),
|
40
|
+
@bottom_left = Vector.new(@x, @y + @height),
|
41
|
+
@bottom_right = Vector.new(@x + @width, @y + @height)
|
42
|
+
]
|
43
|
+
|
44
|
+
[@top_left, @top_right, @bottom_left, @bottom_right].each do |vector|
|
45
|
+
temp_x = vector.x - origin_x
|
46
|
+
temp_y = vector.y - origin_y
|
47
|
+
|
48
|
+
# 90 is up here, while gosu uses 0 for up.
|
49
|
+
radians = (@angle + 90).gosu_to_radians
|
50
|
+
vector.x = (@x + (@width/2)) + ((temp_x * Math.cos(radians)) - (temp_y * Math.sin(radians)))
|
51
|
+
vector.y = (@y + (@height/2)) + ((temp_x * Math.sin(radians)) + (temp_y * Math.cos(radians)))
|
52
|
+
end
|
53
|
+
|
54
|
+
# [
|
55
|
+
# [:top, @top_left, @top_right],
|
56
|
+
# [:right, @top_right, @bottom_right],
|
57
|
+
# [:bottom, @bottom_right, @bottom_left],
|
58
|
+
# [:left, @bottom_left, @top_left]
|
59
|
+
# ].each do |edge|
|
60
|
+
# points.each do |point|
|
61
|
+
# puts "#{edge.first} -> #{shortest_distance(point, edge[1], edge[2])}"
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
end
|
65
|
+
|
66
|
+
def shortest_distance(point, la, lb)
|
67
|
+
a = la.x - lb.x
|
68
|
+
b = la.y - lb.y
|
69
|
+
c = Gosu.distance(la.x, la.y, lb.x, lb.y)
|
70
|
+
p a,b,c
|
71
|
+
d = (a * point.x + b * point.y + c).abs / (Math.sqrt(a * a + b * b))
|
72
|
+
puts "Distance: #{d}"
|
73
|
+
exit!
|
74
|
+
return d
|
75
|
+
end
|
76
|
+
|
77
|
+
def debug_outline
|
78
|
+
# Top
|
79
|
+
Gosu.draw_line(
|
80
|
+
@x, @y, Gosu::Color::RED,
|
81
|
+
@x + @width, @y, Gosu::Color::RED,
|
82
|
+
@z
|
83
|
+
)
|
84
|
+
|
85
|
+
# Right
|
86
|
+
Gosu.draw_line(
|
87
|
+
@x + @width, @y, Gosu::Color::RED,
|
88
|
+
@x + @width, @y + @height, Gosu::Color::RED,
|
89
|
+
@z
|
90
|
+
)
|
91
|
+
|
92
|
+
# Bottom
|
93
|
+
Gosu.draw_line(
|
94
|
+
@x + @width, @y + @height, Gosu::Color::RED,
|
95
|
+
@x, @y + @height, Gosu::Color::RED,
|
96
|
+
@z
|
97
|
+
)
|
98
|
+
|
99
|
+
# Left
|
100
|
+
Gosu.draw_line(
|
101
|
+
@x, @y + @height, Gosu::Color::RED,
|
102
|
+
@x, @y, Gosu::Color::RED,
|
103
|
+
@z
|
104
|
+
)
|
105
|
+
end
|
106
|
+
|
107
|
+
def background=(_background)
|
108
|
+
@paint.set(_background)
|
109
|
+
update
|
110
|
+
end
|
111
|
+
|
112
|
+
def angle=(n)
|
113
|
+
@angle = n
|
114
|
+
update
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Paint
|
119
|
+
attr_accessor :top_left, :top_right, :bottom_left, :bottom_right
|
120
|
+
def initialize(background)
|
121
|
+
set(background)
|
122
|
+
end
|
123
|
+
|
124
|
+
def set(background)
|
125
|
+
@background = background
|
126
|
+
|
127
|
+
|
128
|
+
if background.is_a?(Numeric)
|
129
|
+
@top_left = background
|
130
|
+
@top_right = background
|
131
|
+
@bottom_left = background
|
132
|
+
@bottom_right = background
|
133
|
+
elsif background.is_a?(Gosu::Color)
|
134
|
+
@top_left = background
|
135
|
+
@top_right = background
|
136
|
+
@bottom_left = background
|
137
|
+
@bottom_right = background
|
138
|
+
elsif background.is_a?(Array)
|
139
|
+
if background.size == 1
|
140
|
+
set(background.first)
|
141
|
+
elsif background.size == 2
|
142
|
+
@top_left = background.first
|
143
|
+
@top_right = background.last
|
144
|
+
@bottom_left = background.first
|
145
|
+
@bottom_right = background.last
|
146
|
+
elsif background.size == 4
|
147
|
+
@top_left = background[0]
|
148
|
+
@top_right = background[1]
|
149
|
+
@bottom_left = background[2]
|
150
|
+
@bottom_right = background[3]
|
151
|
+
else
|
152
|
+
raise ArgumentError, "background array was empty or had wrong number of elements (expected 2 or 4 elements)"
|
153
|
+
end
|
154
|
+
elsif background.is_a?(Hash)
|
155
|
+
@top_left = background[:top_left]
|
156
|
+
@top_right = background[:top_right]
|
157
|
+
@bottom_left = background[:bottom_left]
|
158
|
+
@bottom_right = background[:bottom_right]
|
159
|
+
elsif background.is_a?(Range)
|
160
|
+
set([background.begin, background.begin, background.end, background.end])
|
161
|
+
else
|
162
|
+
raise ArgumentError, "background '#{background}' of type '#{background.class}' was not able to be processed"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Add <=> method to support Range based gradients
|
169
|
+
module Gosu
|
170
|
+
class Color
|
171
|
+
def <=>(other)
|
172
|
+
self
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|