fantasy 0.1.7 → 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -1
- data/COLOR_PALETTE.md +159 -0
- data/README.md +74 -10
- data/lib/fantasy/actor.rb +180 -39
- data/lib/fantasy/background.rb +1 -1
- data/lib/fantasy/color.rb +182 -1
- data/lib/fantasy/coordinates.rb +4 -0
- data/lib/fantasy/cursor.rb +42 -0
- data/lib/fantasy/disk.rb +31 -0
- data/lib/fantasy/global.rb +15 -1
- data/lib/fantasy/hud_image.rb +1 -1
- data/lib/fantasy/hud_text.rb +37 -11
- data/lib/fantasy/image.rb +2 -0
- data/lib/fantasy/includes/gravitier.rb +5 -0
- data/lib/fantasy/includes/jumper.rb +10 -0
- data/lib/fantasy/includes/move_by_cursors.rb +39 -11
- data/lib/fantasy/includes/move_by_direction.rb +5 -0
- data/lib/fantasy/includes/mover.rb +24 -0
- data/lib/fantasy/includes/user_inputs.rb +60 -0
- data/lib/fantasy/loop.rb +58 -8
- data/lib/fantasy/mouse.rb +9 -0
- data/lib/fantasy/music.rb +53 -0
- data/lib/fantasy/shape.rb +55 -0
- data/lib/fantasy/sound.rb +4 -2
- data/lib/fantasy/version.rb +1 -1
- data/lib/fantasy.rb +12 -1
- metadata +13 -2
data/lib/fantasy/actor.rb
CHANGED
@@ -1,26 +1,41 @@
|
|
1
1
|
class Actor
|
2
2
|
include MoveByCursor
|
3
|
+
include MoveByDirection
|
4
|
+
include Mover
|
5
|
+
include Gravitier
|
6
|
+
include Jumper
|
7
|
+
include UserInputs
|
3
8
|
|
4
9
|
attr_reader :image, :moving_with_cursors
|
5
|
-
attr_accessor :image_name, :position, :direction, :speed, :solid, :scale, :name, :layer
|
10
|
+
attr_accessor :image_name, :position, :direction, :speed, :jump_force, :gravity, :solid, :scale, :name, :layer
|
11
|
+
attr_accessor :collision_with
|
6
12
|
|
7
13
|
def initialize(image_name)
|
8
14
|
@image_name = image_name
|
9
15
|
@image = Image.new(image_name)
|
10
16
|
@name = image_name
|
11
|
-
@position = Coordinates.
|
12
|
-
@direction = Coordinates.
|
17
|
+
@position = Coordinates.zero
|
18
|
+
@direction = Coordinates.zero
|
13
19
|
@speed = 0
|
14
20
|
@scale = 1
|
15
|
-
|
21
|
+
|
16
22
|
@moving_with_cursors = false
|
17
23
|
@solid = false
|
18
24
|
@draggable_on_debug = true
|
19
25
|
@dragging = false
|
20
26
|
@dragging_offset = nil
|
21
27
|
@layer = 0
|
28
|
+
@gravity = 0
|
29
|
+
@jump_force = 0
|
30
|
+
@collision_with = "all"
|
22
31
|
|
32
|
+
@on_floor = false
|
33
|
+
|
34
|
+
@on_after_move_callback = nil
|
23
35
|
@on_collision_callback = nil
|
36
|
+
@on_destroy_callback = nil
|
37
|
+
@on_jumping_callback = nil
|
38
|
+
@on_floor_callback = nil
|
24
39
|
|
25
40
|
Global.actors << self
|
26
41
|
end
|
@@ -30,20 +45,16 @@ class Actor
|
|
30
45
|
end
|
31
46
|
|
32
47
|
def width
|
33
|
-
@image.width
|
48
|
+
@image.width * @scale
|
34
49
|
end
|
35
50
|
|
36
51
|
def height
|
37
|
-
@image.height
|
38
|
-
end
|
39
|
-
|
40
|
-
def move_with_cursors
|
41
|
-
@moving_with_cursors = true
|
52
|
+
@image.height * @scale
|
42
53
|
end
|
43
54
|
|
44
55
|
def direction=(value)
|
45
56
|
@direction = value
|
46
|
-
@direction = @direction.normalize
|
57
|
+
@direction = @direction.normalize unless @direction.zero?
|
47
58
|
end
|
48
59
|
|
49
60
|
def draw
|
@@ -61,6 +72,25 @@ class Actor
|
|
61
72
|
@position - Global.camera.position
|
62
73
|
end
|
63
74
|
|
75
|
+
# TODO: make this work optimized
|
76
|
+
# def position_top_left
|
77
|
+
# @position - position_delta
|
78
|
+
# end
|
79
|
+
|
80
|
+
# def position_delta
|
81
|
+
# case @alignment
|
82
|
+
# when "top-left"
|
83
|
+
# Coordinates.zero
|
84
|
+
# when "center"
|
85
|
+
# Coordinates.new(width/2, height/2)
|
86
|
+
# else
|
87
|
+
# raise "Actor.alignment value not valid '#{@alignment}'. Valid values: 'top-left, center'"
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
|
91
|
+
# TODO: I made more of this code while I was with Covid
|
92
|
+
# It looks horrible and it is crap
|
93
|
+
# I'll improve it some day :)
|
64
94
|
def move
|
65
95
|
mouse_position = Global.mouse_position + Global.camera.position
|
66
96
|
|
@@ -76,30 +106,102 @@ class Actor
|
|
76
106
|
if @dragging
|
77
107
|
@position = mouse_position - @dragging_offset
|
78
108
|
else
|
79
|
-
|
109
|
+
# Direction moving
|
110
|
+
unless @direction.zero?
|
111
|
+
last_position = @position
|
112
|
+
move_by_direction
|
113
|
+
|
114
|
+
# Check collision after cursor moving
|
115
|
+
if @solid && @position != last_position
|
116
|
+
manage_collisions(last_position)
|
117
|
+
end
|
118
|
+
end
|
80
119
|
|
81
|
-
|
82
|
-
|
83
|
-
|
120
|
+
# Cursors moving
|
121
|
+
last_position = @position
|
122
|
+
move_by_cursors
|
84
123
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
124
|
+
# Check collision after cursor moving
|
125
|
+
if @solid && @position != last_position
|
126
|
+
manage_collisions(last_position)
|
127
|
+
end
|
90
128
|
|
91
|
-
|
92
|
-
|
129
|
+
# # Jump moving
|
130
|
+
# unless @jump_force.zero?
|
131
|
+
# last_position = @position
|
132
|
+
# add_force_by_jump
|
133
|
+
# apply_forces(max_speed: @jump_speed || @jump_force)
|
134
|
+
|
135
|
+
# # Check collision after jump moving
|
136
|
+
# if @solid && @position != last_position
|
137
|
+
# if manage_collisions(last_position)
|
138
|
+
# @jumping = false
|
139
|
+
# end
|
140
|
+
# end
|
141
|
+
# end
|
142
|
+
|
143
|
+
# Gravity force
|
144
|
+
if !@gravity.zero?
|
145
|
+
add_force_by_gravity
|
93
146
|
end
|
147
|
+
|
148
|
+
# Apply forces
|
149
|
+
last_position = @position
|
150
|
+
apply_forces(max_speed: @speed)
|
151
|
+
|
152
|
+
# Check collision after gravity moving
|
153
|
+
if @solid && @position != last_position
|
154
|
+
@on_floor = false
|
155
|
+
manage_collisions(last_position)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
on_after_move_do
|
160
|
+
end
|
161
|
+
|
162
|
+
def manage_collisions(last_position)
|
163
|
+
@velocity ||= Coordinates.zero # In case it is not initialized yet
|
164
|
+
|
165
|
+
collisions.each do |other|
|
166
|
+
on_collision_do(other)
|
167
|
+
other.on_collision_do(self)
|
168
|
+
|
169
|
+
if other.position.y > (last_position.y + height)
|
170
|
+
on_floor_do unless @on_floor
|
171
|
+
|
172
|
+
@on_floor = true
|
173
|
+
@jumping = false
|
174
|
+
@velocity.y = 0
|
175
|
+
end
|
176
|
+
|
177
|
+
if other.position.y + other.height < last_position.y
|
178
|
+
@velocity.y = 0
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# # Reset position pixel by pixel
|
183
|
+
# was_collision = false
|
184
|
+
# while collisions.any? && @position != last_position
|
185
|
+
# was_collision = true
|
186
|
+
# last_position_direction = last_position - @position
|
187
|
+
# @position += last_position_direction.normalize
|
188
|
+
# end
|
189
|
+
# was_collision
|
190
|
+
|
191
|
+
if collisions.any? # we don't cache collisions because position may be changed on collision callback
|
192
|
+
@position = last_position
|
193
|
+
|
194
|
+
return true
|
94
195
|
end
|
95
196
|
|
96
|
-
|
197
|
+
false
|
97
198
|
end
|
98
199
|
|
99
200
|
def solid?
|
100
201
|
@solid
|
101
202
|
end
|
102
203
|
|
204
|
+
# Set callbacks
|
103
205
|
def on_after_move(&block)
|
104
206
|
@on_after_move_callback = block
|
105
207
|
end
|
@@ -112,18 +214,50 @@ class Actor
|
|
112
214
|
@on_destroy_callback = block
|
113
215
|
end
|
114
216
|
|
115
|
-
def
|
116
|
-
@
|
217
|
+
def on_jumping(&block)
|
218
|
+
@on_jumping_callback = block
|
117
219
|
end
|
118
220
|
|
221
|
+
def on_floor(&block)
|
222
|
+
@on_floor_callback = block
|
223
|
+
end
|
224
|
+
|
225
|
+
|
226
|
+
# Execute callbacks
|
227
|
+
def on_after_move_do
|
228
|
+
instance_exec(&@on_after_move_callback) unless @on_after_move_callback.nil?
|
229
|
+
end
|
230
|
+
|
231
|
+
def on_collision_do(other)
|
232
|
+
instance_exec(other, &@on_collision_callback) unless @on_collision_callback.nil?
|
233
|
+
end
|
234
|
+
|
235
|
+
def on_destroy_do
|
236
|
+
instance_exec(&@on_destroy_callback) unless @on_destroy_callback.nil?
|
237
|
+
end
|
238
|
+
|
239
|
+
def on_jumping_do
|
240
|
+
instance_exec(&@on_jumping_callback) unless @on_jumping_callback.nil?
|
241
|
+
end
|
242
|
+
|
243
|
+
def on_floor_do
|
244
|
+
instance_exec(&@on_floor_callback) unless @on_floor_callback.nil?
|
245
|
+
end
|
246
|
+
|
247
|
+
|
119
248
|
def collisions
|
120
|
-
Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |
|
121
|
-
|
249
|
+
Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |other|
|
250
|
+
if(
|
251
|
+
(@collision_with == "all" || @collision_with.include?(other.name)) &&
|
252
|
+
(other.collision_with == "all" || other.collision_with.include?(self.name))
|
253
|
+
)
|
254
|
+
Utils.collision? self, other
|
255
|
+
end
|
122
256
|
end
|
123
257
|
end
|
124
258
|
|
125
259
|
def destroy
|
126
|
-
|
260
|
+
on_destroy_do
|
127
261
|
Global.actors.delete(self)
|
128
262
|
end
|
129
263
|
|
@@ -133,30 +267,37 @@ class Actor
|
|
133
267
|
actor.name = @name
|
134
268
|
actor.position = @position.clone
|
135
269
|
actor.direction = @direction.clone
|
270
|
+
|
136
271
|
actor.speed = @speed
|
137
272
|
actor.scale = @scale
|
138
273
|
actor.moving_with_cursors if @moving_with_cursors
|
139
274
|
actor.solid = @solid
|
140
275
|
actor.layer = @layer
|
276
|
+
actor.gravity = @gravity
|
277
|
+
actor.jump_force = @jump_force
|
278
|
+
actor.collision_with = @collision_with
|
141
279
|
|
142
280
|
actor.on_after_move_callback = @on_after_move_callback
|
143
281
|
actor.on_collision_callback = @on_collision_callback
|
144
282
|
actor.on_destroy_callback = @on_destroy_callback
|
283
|
+
actor.on_jumping_callback = @on_jumping_callback
|
284
|
+
actor.on_floor_callback = @on_floor_callback
|
145
285
|
|
146
|
-
actor
|
147
|
-
|
286
|
+
actor.on_cursor_down_callback = @on_cursor_down_callback
|
287
|
+
actor.on_cursor_up_callback = @on_cursor_up_callback
|
288
|
+
actor.on_cursor_left_callback = @on_cursor_left_callback
|
289
|
+
actor.on_cursor_right_callback = @on_cursor_right_callback
|
290
|
+
actor.on_space_bar_callback = @on_space_bar_callback
|
291
|
+
actor.on_mouse_button_left_callback = @on_mouse_button_left_callback
|
148
292
|
|
149
|
-
|
293
|
+
actor.on_click_callback = @on_click_callback
|
150
294
|
|
151
|
-
|
152
|
-
@on_after_move_callback = block
|
295
|
+
actor
|
153
296
|
end
|
154
297
|
|
155
|
-
|
156
|
-
@on_collision_callback = block
|
157
|
-
end
|
298
|
+
protected
|
158
299
|
|
159
|
-
|
160
|
-
|
161
|
-
|
300
|
+
attr_accessor :on_after_move_callback, :on_collision_callback, :on_destroy_callback, :on_jumping_callback, :on_floor_callback
|
301
|
+
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
|
302
|
+
attr_accessor :on_click_callback
|
162
303
|
end
|
data/lib/fantasy/background.rb
CHANGED
data/lib/fantasy/color.rb
CHANGED
@@ -1,5 +1,186 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
|
1
3
|
class Color < Gosu::Color
|
2
|
-
|
4
|
+
attr_reader :a, :r, :g, :b, :name
|
5
|
+
|
6
|
+
def initialize(r:, g:, b:, a: 255, name: nil)
|
3
7
|
super(a, r, g, b)
|
8
|
+
|
9
|
+
@a = a
|
10
|
+
@r = r
|
11
|
+
@g = g
|
12
|
+
@b = b
|
13
|
+
@name = name
|
4
14
|
end
|
15
|
+
|
16
|
+
def hex
|
17
|
+
[@r, @g, @b].map do |e|
|
18
|
+
e.to_s(16).rjust(2, "0")
|
19
|
+
end.join
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
result = "r:#{@r}, g:#{@g}, b:#{@b}, a:#{@a}, hex:#{hex}"
|
24
|
+
result += " (#{name})" unless name.nil?
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
attr_reader :palette
|
31
|
+
end
|
32
|
+
|
33
|
+
@palette = OpenStruct.new({
|
34
|
+
"orange" => Color.new(r:255, g:165, b:0, a:255, name: "orange"),
|
35
|
+
"red" => Color.new(r:255, g:0, b:0, a:255, name: "red"),
|
36
|
+
"orange_red" => Color.new(r:255, g:69, b:0, a:255, name: "orange_red"),
|
37
|
+
"tomato" => Color.new(r:255, g:99, b:71, a:255, name: "tomato"),
|
38
|
+
"dark_red" => Color.new(r:139, g:0, b:0, a:255, name: "dark_red"),
|
39
|
+
"fire_brick" => Color.new(r:178, g:34, b:34, a:255, name: "fire_brick"),
|
40
|
+
"crimson" => Color.new(r:220, g:20, b:60, a:255, name: "crimson"),
|
41
|
+
"deep_pink" => Color.new(r:255, g:20, b:147, a:255, name: "deep_pink"),
|
42
|
+
"maroon" => Color.new(r:176, g:48, b:96, a:255, name: "maroon"),
|
43
|
+
"indian_red" => Color.new(r:205, g:92, b:92, a:255, name: "indian_red"),
|
44
|
+
"medium_violet_red" => Color.new(r:199, g:21, b:133, a:255, name: "medium_violet_red"),
|
45
|
+
"violet_red" => Color.new(r:208, g:32, b:144, a:255, name: "violet_red"),
|
46
|
+
"light_coral" => Color.new(r:240, g:128, b:128, a:255, name: "light_coral"),
|
47
|
+
"hot_pink" => Color.new(r:255, g:105, b:180, a:255, name: "hot_pink"),
|
48
|
+
"pale_violet_red" => Color.new(r:219, g:112, b:147, a:255, name: "pale_violet_red"),
|
49
|
+
"light_pink" => Color.new(r:255, g:182, b:193, a:255, name: "light_pink"),
|
50
|
+
"rosy_brown" => Color.new(r:188, g:143, b:143, a:255, name: "rosy_brown"),
|
51
|
+
"pink" => Color.new(r:255, g:192, b:203, a:255, name: "pink"),
|
52
|
+
"orchid" => Color.new(r:218, g:112, b:214, a:255, name: "orchid"),
|
53
|
+
"lavender_blush" => Color.new(r:255, g:240, b:245, a:255, name: "lavender_blush"),
|
54
|
+
"snow" => Color.new(r:255, g:250, b:250, a:255, name: "snow"),
|
55
|
+
"chocolate" => Color.new(r:210, g:105, b:30, a:255, name: "chocolate"),
|
56
|
+
"saddle_brown" => Color.new(r:139, g:69, b:19, a:255, name: "saddle_brown"),
|
57
|
+
"brown" => Color.new(r:132, g:60, b:36, a:255, name: "brown"),
|
58
|
+
"dark_orange" => Color.new(r:255, g:140, b:0, a:255, name: "dark_orange"),
|
59
|
+
"coral" => Color.new(r:255, g:127, b:80, a:255, name: "coral"),
|
60
|
+
"sienna" => Color.new(r:160, g:82, b:45, a:255, name: "sienna"),
|
61
|
+
"salmon" => Color.new(r:250, g:128, b:114, a:255, name: "salmon"),
|
62
|
+
"peru" => Color.new(r:205, g:133, b:63, a:255, name: "peru"),
|
63
|
+
"dark_goldenrod" => Color.new(r:184, g:134, b:11, a:255, name: "dark_goldenrod"),
|
64
|
+
"goldenrod" => Color.new(r:218, g:165, b:32, a:255, name: "goldenrod"),
|
65
|
+
"sandy_brown" => Color.new(r:244, g:164, b:96, a:255, name: "sandy_brown"),
|
66
|
+
"light_salmon" => Color.new(r:255, g:160, b:122, a:255, name: "light_salmon"),
|
67
|
+
"dark_salmon" => Color.new(r:233, g:150, b:122, a:255, name: "dark_salmon"),
|
68
|
+
"gold" => Color.new(r:255, g:215, b:0, a:255, name: "gold"),
|
69
|
+
"yellow" => Color.new(r:255, g:255, b:0, a:255, name: "yellow"),
|
70
|
+
"olive" => Color.new(r:128, g:128, b:0, a:255, name: "olive"),
|
71
|
+
"burlywood" => Color.new(r:222, g:184, b:135, a:255, name: "burlywood"),
|
72
|
+
"tan" => Color.new(r:210, g:180, b:140, a:255, name: "tan"),
|
73
|
+
"navajo_white" => Color.new(r:255, g:222, b:173, a:255, name: "navajo_white"),
|
74
|
+
"peach_puff" => Color.new(r:255, g:218, b:185, a:255, name: "peach_puff"),
|
75
|
+
"khaki" => Color.new(r:240, g:230, b:140, a:255, name: "khaki"),
|
76
|
+
"dark_khaki" => Color.new(r:189, g:183, b:107, a:255, name: "dark_khaki"),
|
77
|
+
"moccasin" => Color.new(r:255, g:228, b:181, a:255, name: "moccasin"),
|
78
|
+
"wheat" => Color.new(r:245, g:222, b:179, a:255, name: "wheat"),
|
79
|
+
"bisque" => Color.new(r:255, g:228, b:196, a:255, name: "bisque"),
|
80
|
+
"pale_goldenrod" => Color.new(r:238, g:232, b:170, a:255, name: "pale_goldenrod"),
|
81
|
+
"blanched_almond" => Color.new(r:255, g:235, b:205, a:255, name: "blanched_almond"),
|
82
|
+
"medium_goldenrod" => Color.new(r:234, g:234, b:173, a:255, name: "medium_goldenrod"),
|
83
|
+
"papaya_whip" => Color.new(r:255, g:239, b:213, a:255, name: "papaya_whip"),
|
84
|
+
"misty_rose" => Color.new(r:255, g:228, b:225, a:255, name: "misty_rose"),
|
85
|
+
"lemon_chiffon" => Color.new(r:255, g:250, b:205, a:255, name: "lemon_chiffon"),
|
86
|
+
"antique_white" => Color.new(r:250, g:235, b:215, a:255, name: "antique_white"),
|
87
|
+
"cornsilk" => Color.new(r:255, g:248, b:220, a:255, name: "cornsilk"),
|
88
|
+
"light_goldenrod_yellow" => Color.new(r:250, g:250, b:210, a:255, name: "light_goldenrod_yellow"),
|
89
|
+
"old_lace" => Color.new(r:253, g:245, b:230, a:255, name: "old_lace"),
|
90
|
+
"linen" => Color.new(r:250, g:240, b:230, a:255, name: "linen"),
|
91
|
+
"light_yellow" => Color.new(r:255, g:255, b:224, a:255, name: "light_yellow"),
|
92
|
+
"seashell" => Color.new(r:255, g:245, b:238, a:255, name: "seashell"),
|
93
|
+
"beige" => Color.new(r:245, g:245, b:220, a:255, name: "beige"),
|
94
|
+
"floral_white" => Color.new(r:255, g:250, b:240, a:255, name: "floral_white"),
|
95
|
+
"ivory" => Color.new(r:255, g:255, b:240, a:255, name: "ivory"),
|
96
|
+
"green" => Color.new(r:0, g:255, b:0, a:255, name: "green"),
|
97
|
+
"lawn_green" => Color.new(r:124, g:252, b:0, a:255, name: "lawn_green"),
|
98
|
+
"chartreuse" => Color.new(r:127, g:255, b:0, a:255, name: "chartreuse"),
|
99
|
+
"green_yellow" => Color.new(r:173, g:255, b:47, a:255, name: "green_yellow"),
|
100
|
+
"yellow_green" => Color.new(r:154, g:205, b:50, a:255, name: "yellow_green"),
|
101
|
+
"medium_forest_green" => Color.new(r:107, g:142, b:35, a:255, name: "medium_forest_green"),
|
102
|
+
"olive_drab" => Color.new(r:107, g:142, b:35, a:255, name: "olive_drab"),
|
103
|
+
"dark_olive_green" => Color.new(r:85, g:107, b:47, a:255, name: "dark_olive_green"),
|
104
|
+
"dark_sea_green" => Color.new(r:143, g:188, b:139, a:255, name: "dark_sea_green"),
|
105
|
+
"lime" => Color.new(r:0, g:255, b:0, a:255, name: "lime"),
|
106
|
+
"dark_green" => Color.new(r:0, g:100, b:0, a:255, name: "dark_green"),
|
107
|
+
"lime_green" => Color.new(r:50, g:205, b:50, a:255, name: "lime_green"),
|
108
|
+
"forest_green" => Color.new(r:34, g:139, b:34, a:255, name: "forest_green"),
|
109
|
+
"spring_green" => Color.new(r:0, g:255, b:127, a:255, name: "spring_green"),
|
110
|
+
"medium_spring_green" => Color.new(r:0, g:250, b:154, a:255, name: "medium_spring_green"),
|
111
|
+
"sea_green" => Color.new(r:46, g:139, b:87, a:255, name: "sea_green"),
|
112
|
+
"medium_sea_green" => Color.new(r:60, g:179, b:113, a:255, name: "medium_sea_green"),
|
113
|
+
"aquamarine" => Color.new(r:112, g:216, b:144, a:255, name: "aquamarine"),
|
114
|
+
"light_green" => Color.new(r:144, g:238, b:144, a:255, name: "light_green"),
|
115
|
+
"pale_green" => Color.new(r:152, g:251, b:152, a:255, name: "pale_green"),
|
116
|
+
"medium_aquamarine" => Color.new(r:102, g:205, b:170, a:255, name: "medium_aquamarine"),
|
117
|
+
"turquoise" => Color.new(r:64, g:224, b:208, a:255, name: "turquoise"),
|
118
|
+
"light_sea_green" => Color.new(r:32, g:178, b:170, a:255, name: "light_sea_green"),
|
119
|
+
"medium_turquoise" => Color.new(r:72, g:209, b:204, a:255, name: "medium_turquoise"),
|
120
|
+
"honeydew" => Color.new(r:240, g:255, b:240, a:255, name: "honeydew"),
|
121
|
+
"mint_cream" => Color.new(r:245, g:255, b:250, a:255, name: "mint_cream"),
|
122
|
+
"royal_blue" => Color.new(r:65, g:105, b:225, a:255, name: "royal_blue"),
|
123
|
+
"dodger_blue" => Color.new(r:30, g:144, b:255, a:255, name: "dodger_blue"),
|
124
|
+
"deep_sky_blue" => Color.new(r:0, g:191, b:255, a:255, name: "deep_sky_blue"),
|
125
|
+
"cornflower_blue" => Color.new(r:100, g:149, b:237, a:255, name: "cornflower_blue"),
|
126
|
+
"steel_blue" => Color.new(r:70, g:130, b:180, a:255, name: "steel_blue"),
|
127
|
+
"light_sky_blue" => Color.new(r:135, g:206, b:250, a:255, name: "light_sky_blue"),
|
128
|
+
"dark_turquoise" => Color.new(r:0, g:206, b:209, a:255, name: "dark_turquoise"),
|
129
|
+
"cyan" => Color.new(r:0, g:255, b:255, a:255, name: "cyan"),
|
130
|
+
"aqua" => Color.new(r:0, g:255, b:255, a:255, name: "aqua"),
|
131
|
+
"dark_cyan" => Color.new(r:0, g:139, b:139, a:255, name: "dark_cyan"),
|
132
|
+
"teal" => Color.new(r:0, g:128, b:128, a:255, name: "teal"),
|
133
|
+
"sky_blue" => Color.new(r:135, g:206, b:235, a:255, name: "sky_blue"),
|
134
|
+
"cadet_blue" => Color.new(r:95, g:158, b:160, a:255, name: "cadet_blue"),
|
135
|
+
"dark_slate_gray" => Color.new(r:47, g:79, b:79, a:255, name: "dark_slate_gray"),
|
136
|
+
"dark_slate_grey" => Color.new(r:47, g:79, b:79, a:255, name: "dark_slate_grey"),
|
137
|
+
"light_slate_gray" => Color.new(r:119, g:136, b:153, a:255, name: "light_slate_gray"),
|
138
|
+
"light_slate_grey" => Color.new(r:119, g:136, b:153, a:255, name: "light_slate_grey"),
|
139
|
+
"slate_gray" => Color.new(r:112, g:128, b:144, a:255, name: "slate_gray"),
|
140
|
+
"slate_grey" => Color.new(r:112, g:128, b:144, a:255, name: "slate_grey"),
|
141
|
+
"light_steel_blue" => Color.new(r:176, g:196, b:222, a:255, name: "light_steel_blue"),
|
142
|
+
"light_blue" => Color.new(r:173, g:216, b:230, a:255, name: "light_blue"),
|
143
|
+
"powder_blue" => Color.new(r:176, g:224, b:230, a:255, name: "powder_blue"),
|
144
|
+
"pale_turquoise" => Color.new(r:175, g:238, b:238, a:255, name: "pale_turquoise"),
|
145
|
+
"light_cyan" => Color.new(r:224, g:255, b:255, a:255, name: "light_cyan"),
|
146
|
+
"alice_blue" => Color.new(r:240, g:248, b:255, a:255, name: "alice_blue"),
|
147
|
+
"azure" => Color.new(r:240, g:255, b:255, a:255, name: "azure"),
|
148
|
+
"medium_blue" => Color.new(r:0, g:0, b:205, a:255, name: "medium_blue"),
|
149
|
+
"dark_blue" => Color.new(r:0, g:0, b:139, a:255, name: "dark_blue"),
|
150
|
+
"midnight_blue" => Color.new(r:25, g:25, b:112, a:255, name: "midnight_blue"),
|
151
|
+
"navy" => Color.new(r:36, g:36, b:140, a:255, name: "navy"),
|
152
|
+
"blue" => Color.new(r:0, g:0, b:255, a:255, name: "blue"),
|
153
|
+
"indigo" => Color.new(r:75, g:0, b:130, a:255, name: "indigo"),
|
154
|
+
"blue_violet" => Color.new(r:138, g:43, b:226, a:255, name: "blue_violet"),
|
155
|
+
"medium_slate_blue" => Color.new(r:123, g:104, b:238, a:255, name: "medium_slate_blue"),
|
156
|
+
"slate_blue" => Color.new(r:106, g:90, b:205, a:255, name: "slate_blue"),
|
157
|
+
"purple" => Color.new(r:160, g:32, b:240, a:255, name: "purple"),
|
158
|
+
"dark_slate_blue" => Color.new(r:72, g:61, b:139, a:255, name: "dark_slate_blue"),
|
159
|
+
"dark_violet" => Color.new(r:148, g:0, b:211, a:255, name: "dark_violet"),
|
160
|
+
"dark_orchid" => Color.new(r:153, g:50, b:204, a:255, name: "dark_orchid"),
|
161
|
+
"medium_purple" => Color.new(r:147, g:112, b:219, a:255, name: "medium_purple"),
|
162
|
+
"medium_orchid" => Color.new(r:186, g:85, b:211, a:255, name: "medium_orchid"),
|
163
|
+
"magenta" => Color.new(r:255, g:0, b:255, a:255, name: "magenta"),
|
164
|
+
"fuchsia" => Color.new(r:255, g:0, b:255, a:255, name: "fuchsia"),
|
165
|
+
"dark_magenta" => Color.new(r:139, g:0, b:139, a:255, name: "dark_magenta"),
|
166
|
+
"violet" => Color.new(r:238, g:130, b:238, a:255, name: "violet"),
|
167
|
+
"plum" => Color.new(r:221, g:160, b:221, a:255, name: "plum"),
|
168
|
+
"lavender" => Color.new(r:230, g:230, b:250, a:255, name: "lavender"),
|
169
|
+
"thistle" => Color.new(r:216, g:191, b:216, a:255, name: "thistle"),
|
170
|
+
"ghost_white" => Color.new(r:248, g:248, b:255, a:255, name: "ghost_white"),
|
171
|
+
"white" => Color.new(r:255, g:255, b:255, a:255, name: "white"),
|
172
|
+
"white_smoke" => Color.new(r:245, g:245, b:245, a:255, name: "white_smoke"),
|
173
|
+
"gainsboro" => Color.new(r:220, g:220, b:220, a:255, name: "gainsboro"),
|
174
|
+
"light_gray" => Color.new(r:211, g:211, b:211, a:255, name: "light_gray"),
|
175
|
+
"light_grey" => Color.new(r:211, g:211, b:211, a:255, name: "light_grey"),
|
176
|
+
"silver" => Color.new(r:192, g:192, b:192, a:255, name: "silver"),
|
177
|
+
"gray" => Color.new(r:190, g:190, b:190, a:255, name: "gray"),
|
178
|
+
"grey" => Color.new(r:190, g:190, b:190, a:255, name: "grey"),
|
179
|
+
"dark_gray" => Color.new(r:169, g:169, b:169, a:255, name: "dark_gray"),
|
180
|
+
"dark_grey" => Color.new(r:169, g:169, b:169, a:255, name: "dark_grey"),
|
181
|
+
"dim_gray" => Color.new(r:105, g:105, b:105, a:255, name: "dim_gray"),
|
182
|
+
"dim_grey" => Color.new(r:105, g:105, b:105, a:255, name: "dim_grey"),
|
183
|
+
"black" => Color.new(r:0, g:0, b:0, a:255, name: "black"),
|
184
|
+
"transparent" => Color.new(r:0, g:0, b:0, a:0, name: "transparent")
|
185
|
+
})
|
5
186
|
end
|
data/lib/fantasy/coordinates.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Cursor
|
2
|
+
def self.left
|
3
|
+
Gosu::KB_LEFT
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.right
|
7
|
+
Gosu::KB_RIGHT
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.up
|
11
|
+
Gosu::KB_UP
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
Gosu::KB_DOWN
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.space_bar
|
19
|
+
Gosu::KB_SPACE
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def self.left?
|
24
|
+
Gosu.button_down?(Cursor.left)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.right?
|
28
|
+
Gosu.button_down?(Cursor.right)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.up?
|
32
|
+
Gosu.button_down?(Cursor.up)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.down?
|
36
|
+
Gosu.button_down?(Cursor.down)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.space_bar?
|
40
|
+
Gosu.button_down?(Cursor.space_bar)
|
41
|
+
end
|
42
|
+
end
|
data/lib/fantasy/disk.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "json"
|
2
|
+
require "ostruct"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
module Disk
|
6
|
+
@@data_path = "#{Dir.pwd}/disk/data.json"
|
7
|
+
@@data = nil
|
8
|
+
|
9
|
+
def self.data
|
10
|
+
@@data ||= OpenStruct.new(load)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.save
|
14
|
+
dirname = File.dirname(@@data_path)
|
15
|
+
unless File.directory?(dirname)
|
16
|
+
FileUtils.mkdir_p(dirname)
|
17
|
+
end
|
18
|
+
|
19
|
+
File.open(@@data_path, "w") { |f| f.write JSON.pretty_generate(@@data.to_h) }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def self.load
|
25
|
+
if File.file?(@@data_path)
|
26
|
+
JSON.parse(File.read(@@data_path))
|
27
|
+
else
|
28
|
+
{}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/fantasy/global.rb
CHANGED
@@ -2,7 +2,7 @@ require "ostruct"
|
|
2
2
|
|
3
3
|
module Global
|
4
4
|
class << self
|
5
|
-
attr_accessor :actors, :hud_texts, :hud_images, :backgrounds, :tile_maps, :clocks
|
5
|
+
attr_accessor :actors, :hud_texts, :hud_images, :backgrounds, :tile_maps, :clocks, :shapes
|
6
6
|
attr_accessor :debug
|
7
7
|
attr_accessor :setup_proc, :loop_proc, :button_proc
|
8
8
|
attr_accessor :presentation_proc, :game_proc, :end_proc
|
@@ -28,6 +28,7 @@ module Global
|
|
28
28
|
@backgrounds = []
|
29
29
|
@tile_maps = []
|
30
30
|
@clocks = []
|
31
|
+
@shapes = []
|
31
32
|
@last_frame_at = Time.now
|
32
33
|
@debug = false
|
33
34
|
|
@@ -116,11 +117,23 @@ module Global
|
|
116
117
|
@hud_images.clear
|
117
118
|
@backgrounds.clear
|
118
119
|
@tile_maps.clear
|
120
|
+
@shapes.clear
|
121
|
+
@camera.position = Coordinates.zero
|
119
122
|
|
120
123
|
@clocks.reject(&:persistent?).each do |clock|
|
121
124
|
clock.stop unless clock.thread == Thread.current # no stop current Thread
|
122
125
|
end
|
123
126
|
|
127
|
+
# clear callbacks
|
128
|
+
@button_proc = nil
|
129
|
+
@space_bar_proc = nil
|
130
|
+
@cursor_up_proc = nil
|
131
|
+
@cursor_down_proc = nil
|
132
|
+
@cursor_left_proc = nil
|
133
|
+
@cursor_right_proc = nil
|
134
|
+
@mouse_button_left_proc = nil
|
135
|
+
@mouse_button_right_proc = nil
|
136
|
+
|
124
137
|
@background = Color.new(r: 0, g: 0, b: 0)
|
125
138
|
end
|
126
139
|
|
@@ -131,6 +144,7 @@ module Global
|
|
131
144
|
def setup
|
132
145
|
Sound.preload_sounds
|
133
146
|
Image.preload_images
|
147
|
+
Music.preload_musics
|
134
148
|
end
|
135
149
|
|
136
150
|
def seconds_in_scene
|
data/lib/fantasy/hud_image.rb
CHANGED
@@ -37,7 +37,7 @@ class HudImage
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def draw_debug
|
40
|
-
Global.
|
40
|
+
Global.pixel_fonts["medium"].draw_text("#{@position.x.floor},#{@position.y.floor}", @position.x, @position.y - 20, 1)
|
41
41
|
end
|
42
42
|
|
43
43
|
def destroy
|