metro 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +51 -20
- data/changelog.md +9 -0
- data/lib/metro/events/hit_list.rb +7 -8
- data/lib/metro/font.rb +3 -0
- data/lib/metro/game.rb +7 -3
- data/lib/metro/models/model.rb +16 -13
- data/lib/metro/models/properties/animation_property.rb +5 -1
- data/lib/metro/models/properties/dimensions_property.rb +8 -7
- data/lib/metro/models/properties/font_property.rb +2 -1
- data/lib/metro/models/properties/model_property.rb +84 -0
- data/lib/metro/models/properties/property.rb +2 -1
- data/lib/metro/models/ui/border.rb +69 -0
- data/lib/metro/models/ui/fps.rb +54 -0
- data/lib/metro/models/ui/generic.rb +8 -1
- data/lib/metro/models/ui/grid_drawer.rb +17 -5
- data/lib/metro/models/ui/image.rb +40 -8
- data/lib/metro/models/ui/label.rb +48 -7
- data/lib/metro/models/ui/menu.rb +61 -8
- data/lib/metro/models/ui/model_label.rb +65 -0
- data/lib/metro/models/ui/model_labeler.rb +79 -0
- data/lib/metro/models/ui/rectangle.rb +6 -0
- data/lib/metro/scene.rb +1 -1
- data/lib/metro/transitions/edit_transition_scene.rb +28 -1
- data/lib/metro/units/dimensions.rb +29 -2
- data/lib/metro/units/point.rb +16 -4
- data/lib/metro/units/rectangle_bounds.rb +38 -16
- data/lib/metro/version.rb +1 -1
- data/lib/setup_handlers/reload_game_on_game_file_changes.rb +6 -1
- data/lib/templates/game/scenes/first_scene.rb +4 -0
- metadata +14 -8
@@ -0,0 +1,79 @@
|
|
1
|
+
module Metro
|
2
|
+
module UI
|
3
|
+
|
4
|
+
#
|
5
|
+
# The model labeler will draw a bounding box and label around all the
|
6
|
+
# scene's drawers.
|
7
|
+
#
|
8
|
+
# The model labeler is used in the edit transition scene to generate
|
9
|
+
# the bounding boxes and labeles around all the actors within the scene
|
10
|
+
# being edited.
|
11
|
+
#
|
12
|
+
class ModelLabeler < Metro::Model
|
13
|
+
|
14
|
+
# @attribute
|
15
|
+
# The color use for the border surrounding each actor and the background
|
16
|
+
# behind the model's name.
|
17
|
+
property :color, default: "rgba(255,0,0,0.5)"
|
18
|
+
|
19
|
+
# @attribute
|
20
|
+
# Sets whether to draw the bounding boxes around the actors.
|
21
|
+
property :should_draw_bounding_boxes, type: :boolean, default: true
|
22
|
+
|
23
|
+
# @attribute
|
24
|
+
# The color of the model name text.
|
25
|
+
property :label_color, default: "rgba(255,255,255,1.0)"
|
26
|
+
|
27
|
+
# @attribute
|
28
|
+
# The font of the model name label.
|
29
|
+
property :font, default: { name: 'Arial', size: 16 }
|
30
|
+
|
31
|
+
# @attribute
|
32
|
+
# Sets whether to draw the model name labels
|
33
|
+
property :should_draw_labels, type: :boolean, default: true
|
34
|
+
|
35
|
+
# @attribute
|
36
|
+
# For actors that have no bounds, like sound or custom models without
|
37
|
+
# a position, they are normally hidden but can be shown. Currently they
|
38
|
+
# appear all overlapped in the upper-left corner of the screen.
|
39
|
+
#
|
40
|
+
# @todo when enabled the boundless actors should be presented in a cleaner
|
41
|
+
# way to allow for easier viewing of them.
|
42
|
+
property :should_hide_boundless_actors, type: :boolean, default: true
|
43
|
+
|
44
|
+
# Store the labels that are being drawn in the scene. This hash of labels
|
45
|
+
# acts as a cache around the items that are being labeled based on the
|
46
|
+
# name of the objects that are being labeled.
|
47
|
+
def labels
|
48
|
+
@labels ||= {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def show
|
52
|
+
self.saveable_to_view = false
|
53
|
+
end
|
54
|
+
|
55
|
+
def update
|
56
|
+
scene.drawers.each do |drawer|
|
57
|
+
next if (drawer.bounds == Bounds.none and should_hide_boundless_actors)
|
58
|
+
label = labels[drawer.name]
|
59
|
+
|
60
|
+
unless label
|
61
|
+
label = create "metro::ui::modellabel", target: drawer
|
62
|
+
labels[drawer.name] = label
|
63
|
+
end
|
64
|
+
|
65
|
+
label.should_draw_label = should_draw_labels
|
66
|
+
label.should_draw_bounding_box = should_draw_bounding_boxes
|
67
|
+
label.bounds = drawer.bounds
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def draw
|
73
|
+
labels.values.each { |label| label.draw }
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -14,10 +14,16 @@ module Metro
|
|
14
14
|
#
|
15
15
|
class Rectangle < ::Metro::Model
|
16
16
|
|
17
|
+
# @attribute
|
18
|
+
# The position of the upper-left corner of the rectangle
|
17
19
|
property :position
|
18
20
|
|
21
|
+
# @attribute
|
22
|
+
# The color to rectangle
|
19
23
|
property :color
|
20
24
|
|
25
|
+
# @attribute
|
26
|
+
# The dimensions of the rectangle
|
21
27
|
property :dimensions do
|
22
28
|
window.dimensions
|
23
29
|
end
|
data/lib/metro/scene.rb
CHANGED
@@ -513,7 +513,7 @@ module Metro
|
|
513
513
|
# @return a hash of all the drawers
|
514
514
|
#
|
515
515
|
def to_hash
|
516
|
-
drawn = drawers.find_all{|draw| draw.
|
516
|
+
drawn = drawers.find_all{|draw| draw.saveable_to_view }.inject({}) do |hash,drawer|
|
517
517
|
drawer_hash = drawer.to_hash
|
518
518
|
hash.merge drawer_hash
|
519
519
|
end
|
@@ -2,6 +2,19 @@ require_relative '../events/hit_list'
|
|
2
2
|
|
3
3
|
module Metro
|
4
4
|
|
5
|
+
#
|
6
|
+
# The Edit Transition Scene is place where scenes go to be edited. Any scene
|
7
|
+
# can transition into edit mode. This scene will copy all the actors and
|
8
|
+
# gain access to the view.
|
9
|
+
#
|
10
|
+
# This scene grants new keyboard commands that will enable, disable, and
|
11
|
+
# toggle feature of edit mode:
|
12
|
+
#
|
13
|
+
# * `e` will end edit mode
|
14
|
+
# * `g` will toggle the display of the grid
|
15
|
+
# * `l` will toggle the display of the model labels
|
16
|
+
# * `b` will toggle the bounding boxes around the models.
|
17
|
+
#
|
5
18
|
class EditTransitionScene < Metro::TransitionScene
|
6
19
|
|
7
20
|
def initialize
|
@@ -15,7 +28,8 @@ module Metro
|
|
15
28
|
# easier to dup scenes.
|
16
29
|
#
|
17
30
|
self.class.drawings.clear
|
18
|
-
self.class.draw :overlay, model: "
|
31
|
+
self.class.draw :overlay, model: "metro::ui::griddrawer"
|
32
|
+
self.class.draw :labeler, model: "metro::ui::modellabeler"
|
19
33
|
add_actors_to_scene
|
20
34
|
after_initialize
|
21
35
|
end
|
@@ -44,6 +58,18 @@ module Metro
|
|
44
58
|
transition_to next_scene.scene_name
|
45
59
|
end
|
46
60
|
|
61
|
+
event :on_up, KbG do
|
62
|
+
overlay.enabled = !overlay.enabled
|
63
|
+
end
|
64
|
+
|
65
|
+
event :on_up, KbL do
|
66
|
+
labeler.should_draw_labels = !labeler.should_draw_labels
|
67
|
+
end
|
68
|
+
|
69
|
+
event :on_up, KbB do
|
70
|
+
labeler.should_draw_bounding_boxes = !labeler.should_draw_bounding_boxes
|
71
|
+
end
|
72
|
+
|
47
73
|
#
|
48
74
|
# Generate a hitlist which manages the click start, hold, and release
|
49
75
|
# of the mouse button.
|
@@ -65,6 +91,7 @@ module Metro
|
|
65
91
|
end
|
66
92
|
|
67
93
|
event :on_up, KbS do
|
94
|
+
log.info "Saving changes to Scene #{previous_scene} View - #{view_name}"
|
68
95
|
save_view
|
69
96
|
end
|
70
97
|
|
@@ -19,7 +19,7 @@ module Metro
|
|
19
19
|
# two attributes width and height.
|
20
20
|
#
|
21
21
|
def self.parse(string)
|
22
|
-
of *string.split(",",2).map(&:to_f)
|
22
|
+
of *string.to_s.split(",",2).map(&:to_f)
|
23
23
|
end
|
24
24
|
|
25
25
|
|
@@ -28,7 +28,7 @@ module Metro
|
|
28
28
|
# will enforce that the values added are converted to floating
|
29
29
|
# point numbers.
|
30
30
|
#
|
31
|
-
def self.of(width,height)
|
31
|
+
def self.of(width=0.0,height=0.0)
|
32
32
|
new width.to_f, height.to_f
|
33
33
|
end
|
34
34
|
|
@@ -36,6 +36,33 @@ module Metro
|
|
36
36
|
"#{width},#{height}"
|
37
37
|
end
|
38
38
|
|
39
|
+
#
|
40
|
+
# Add the dimensions to another dimensions-like structure. A
|
41
|
+
# dimensions like structure is anything that responds to width and height.
|
42
|
+
#
|
43
|
+
# @return a new dimensions which is the sum of the two dimensions
|
44
|
+
#
|
45
|
+
def +(value)
|
46
|
+
raise "Unable to add dimension to #{value} #{value.class}" if [ :width, :height ].find { |method| ! value.respond_to?(method) }
|
47
|
+
self.class.of (width + value.width.to_f), (height + value.height.to_f)
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Subtract the dimensions-like structure from this dimension. A
|
52
|
+
# dimensions like structure is anything that responds to width and height.
|
53
|
+
#
|
54
|
+
# @return a new dimensions which is the different of the two dimensions
|
55
|
+
#
|
56
|
+
def -(value)
|
57
|
+
raise "Unable to subtract from these dimensions with #{value} #{value.class}" if [ :width, :height ].find { |method| ! value.respond_to?(method) }
|
58
|
+
self.class.of (width - value.width.to_f), (height - value.height.to_f)
|
59
|
+
end
|
60
|
+
|
61
|
+
def <=>(value)
|
62
|
+
raise "Unable to subtract from these dimensions with #{value} #{value.class}" if [ :width, :height ].find { |method| ! value.respond_to?(method) }
|
63
|
+
(width * height) <=> (value.width * value.height)
|
64
|
+
end
|
65
|
+
|
39
66
|
end
|
40
67
|
end
|
41
68
|
end
|
data/lib/metro/units/point.rb
CHANGED
@@ -40,14 +40,26 @@ module Metro
|
|
40
40
|
end
|
41
41
|
|
42
42
|
#
|
43
|
-
# Add
|
44
|
-
# the methods x, y, and z.
|
43
|
+
# Add this point to another another point-like structure. A point like structure
|
44
|
+
# is anything has the methods x, y, and z.
|
45
45
|
#
|
46
46
|
# @return a new point which is the sum of the point and the provided value.
|
47
47
|
#
|
48
48
|
def +(value)
|
49
|
-
raise "
|
50
|
-
self.class.at(
|
49
|
+
raise "Unable to add point to #{value} #{value.class}" if [ :x, :y, :z ].find { |method| ! value.respond_to?(method) }
|
50
|
+
self.class.at (x + value.x.to_f), (y + value.y.to_f), (z + value.z.to_f)
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Subtract the point-like structure from this point. A point like structure
|
55
|
+
# is anything has the methods x, y, and z.
|
56
|
+
#
|
57
|
+
# @return a new point which is the difference of the point and the
|
58
|
+
# provided value.
|
59
|
+
#
|
60
|
+
def -(value)
|
61
|
+
raise "Unable to subtract from this point with #{value} #{value.class}" if [ :x, :y, :z ].find { |method| ! value.respond_to?(method) }
|
62
|
+
self.class.at (x - value.x.to_f), (y - value.y.to_f), (z - value.z.to_f)
|
51
63
|
end
|
52
64
|
|
53
65
|
end
|
@@ -4,46 +4,68 @@ module Metro
|
|
4
4
|
#
|
5
5
|
# An object that represents a rectanglar bounds.
|
6
6
|
#
|
7
|
-
class RectangleBounds
|
7
|
+
class RectangleBounds
|
8
8
|
|
9
9
|
# Allow the ability to refer to the min, max values with their
|
10
10
|
# other alternate names.
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
alias_method :top=, :min_y=
|
18
|
-
alias_method :bottom, :max_y
|
19
|
-
alias_method :bottom=, :max_y=
|
12
|
+
attr_accessor :left, :right, :top, :bottom
|
13
|
+
|
14
|
+
def self.none
|
15
|
+
new left: 0, right: 0, top: 0, bottom: 0
|
16
|
+
end
|
20
17
|
|
21
18
|
#
|
22
19
|
# Create a bounds with bounds.
|
23
20
|
#
|
24
21
|
def initialize(params = {})
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
@left = params[:left].to_f
|
23
|
+
@top = params[:top].to_f
|
24
|
+
@right = params[:right].to_f
|
25
|
+
@bottom = params[:bottom].to_f
|
26
|
+
end
|
27
|
+
|
28
|
+
def top_left
|
29
|
+
Point.at(left,top)
|
30
|
+
end
|
31
|
+
|
32
|
+
def top_right
|
33
|
+
Point.at(right,top)
|
34
|
+
end
|
35
|
+
|
36
|
+
def bottom_right
|
37
|
+
Point.at(right,bottom)
|
38
|
+
end
|
39
|
+
|
40
|
+
def bottom_left
|
41
|
+
Point.at(left,bottom)
|
42
|
+
end
|
43
|
+
|
44
|
+
def dimensions
|
45
|
+
Dimensions.of (right - left), (bottom - top)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ==(value)
|
49
|
+
return if [ :left, :right, :top, :bottom ].find { |method| ! value.respond_to?(method) }
|
50
|
+
left == value.left and right == value.right and top == value.top and bottom == value.bottom
|
29
51
|
end
|
30
52
|
|
31
53
|
#
|
32
54
|
# Does this bounds contain the following point?
|
33
55
|
#
|
34
56
|
def contains?(x,y)
|
35
|
-
x >
|
57
|
+
x > left and x < right and y > top and y < bottom
|
36
58
|
end
|
37
59
|
|
38
60
|
#
|
39
61
|
# Does this rectanglular bounds intersect with another rectanglular bounds?
|
40
62
|
#
|
41
63
|
def intersect?(b)
|
42
|
-
not(b.
|
64
|
+
not(b.left > right or b.right < left or b.top > bottom or b.bottom < top)
|
43
65
|
end
|
44
66
|
|
45
67
|
def to_s
|
46
|
-
"(#{
|
68
|
+
"(#{left},#{top}) to (#{right},#{bottom})"
|
47
69
|
end
|
48
70
|
|
49
71
|
end
|
data/lib/metro/version.rb
CHANGED
@@ -64,9 +64,14 @@ module Metro
|
|
64
64
|
def reload_game_because_files_changed(changed)
|
65
65
|
log.debug "Metro has detected #{changed.count} game source #{changed.count != 1 ? 'files have' : 'file has'} changed. RELOADING GAME CODE!"
|
66
66
|
if Metro.game_has_valid_code?
|
67
|
-
Game.current_scene.after(1.tick)
|
67
|
+
Game.current_scene.after(1.tick) do
|
68
|
+
Metro.reload!
|
69
|
+
scene_is_being_edited = scene_name == "metro/edit_transition"
|
70
|
+
transition_to(scene_name) unless scene_is_being_edited
|
71
|
+
end
|
68
72
|
end
|
69
73
|
end
|
74
|
+
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gosu
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- lib/metro/models/properties/dimensions_property.rb
|
183
183
|
- lib/metro/models/properties/font_property.rb
|
184
184
|
- lib/metro/models/properties/image_property.rb
|
185
|
+
- lib/metro/models/properties/model_property.rb
|
185
186
|
- lib/metro/models/properties/numeric_property.rb
|
186
187
|
- lib/metro/models/properties/options_property/no_option.rb
|
187
188
|
- lib/metro/models/properties/options_property/options.rb
|
@@ -193,11 +194,15 @@ files:
|
|
193
194
|
- lib/metro/models/properties/scale_property.rb
|
194
195
|
- lib/metro/models/properties/song_property.rb
|
195
196
|
- lib/metro/models/properties/text_property.rb
|
197
|
+
- lib/metro/models/ui/border.rb
|
198
|
+
- lib/metro/models/ui/fps.rb
|
196
199
|
- lib/metro/models/ui/generic.rb
|
197
200
|
- lib/metro/models/ui/grid_drawer.rb
|
198
201
|
- lib/metro/models/ui/image.rb
|
199
202
|
- lib/metro/models/ui/label.rb
|
200
203
|
- lib/metro/models/ui/menu.rb
|
204
|
+
- lib/metro/models/ui/model_label.rb
|
205
|
+
- lib/metro/models/ui/model_labeler.rb
|
201
206
|
- lib/metro/models/ui/rectangle.rb
|
202
207
|
- lib/metro/parameters/command_line_args_parser.rb
|
203
208
|
- lib/metro/parameters/options.rb
|
@@ -279,12 +284,13 @@ licenses:
|
|
279
284
|
post_install_message: ! " ______ ___ _____\n ___ |/ /_____ __ /_______________\n
|
280
285
|
\ __ /|_/ / _ _ \\_ __/__ ___/_ __ \\\n _ / / / / __// /_ _ / /
|
281
286
|
/_/ /\n /_/ /_/ \\___/ \\__/ /_/ \\____/\n\n Thank you for installing
|
282
|
-
metro 0.3.
|
283
|
-
\ Changes:\n \n *
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
\ \n\n
|
287
|
+
metro 0.3.3 / 2012-11-28.\n ---------------------------------------------------------------------\n
|
288
|
+
\ Changes:\n \n * Edit Mode - actors within a scene can have their position
|
289
|
+
edited\n and saved. Actors within the scene that have a valid bounds\n specified
|
290
|
+
will appear within the scene with name and bounding box.\n * Dimensions can now
|
291
|
+
be defined as strings\n * Game bounds and Game dimensions return objects of that
|
292
|
+
type\n * `metr::ui::fps` added and has some shortcut placements settings\n \n\n
|
293
|
+
\ ---------------------------------------------------------------------\n"
|
288
294
|
rdoc_options: []
|
289
295
|
require_paths:
|
290
296
|
- lib
|