metro-ld25 0.3.3
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.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +6 -0
- data/Gemfile +12 -0
- data/Guardfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +189 -0
- data/Rakefile +18 -0
- data/bin/metro +16 -0
- data/changelog.md +157 -0
- data/lib/assets/menu-movement.wav +0 -0
- data/lib/assets/menu-selection.wav +0 -0
- data/lib/assets/missing.ogg +0 -0
- data/lib/assets/missing.png +0 -0
- data/lib/assets/missing.wav +0 -0
- data/lib/assets/missing_animation.png +0 -0
- data/lib/commands/generate_game.rb +13 -0
- data/lib/commands/generate_model.rb +25 -0
- data/lib/commands/generate_scene.rb +36 -0
- data/lib/commands/generate_view.rb +21 -0
- data/lib/commands/thor.rb +83 -0
- data/lib/core_ext/class.rb +14 -0
- data/lib/core_ext/numeric.rb +59 -0
- data/lib/gosu_ext/color.rb +62 -0
- data/lib/gosu_ext/gosu_constants.rb +53 -0
- data/lib/locale/en.yml +35 -0
- data/lib/locale/locale.rb +1 -0
- data/lib/metro.rb +140 -0
- data/lib/metro/animation.rb +135 -0
- data/lib/metro/animation/after_interval_factory.rb +12 -0
- data/lib/metro/animation/animation_factory.rb +15 -0
- data/lib/metro/animation/easing/ease_in.rb +15 -0
- data/lib/metro/animation/easing/easing.rb +51 -0
- data/lib/metro/animation/easing/linear.rb +15 -0
- data/lib/metro/animation/has_animations.rb +70 -0
- data/lib/metro/animation/implicit_animation.rb +100 -0
- data/lib/metro/animation/on_update_operation.rb +96 -0
- data/lib/metro/animation/scene_animation.rb +16 -0
- data/lib/metro/asset_path.rb +97 -0
- data/lib/metro/events/control_definition.rb +11 -0
- data/lib/metro/events/controls.rb +42 -0
- data/lib/metro/events/event_data.rb +60 -0
- data/lib/metro/events/event_dictionary.rb +52 -0
- data/lib/metro/events/event_factory.rb +17 -0
- data/lib/metro/events/event_relay.rb +300 -0
- data/lib/metro/events/event_state_manager.rb +63 -0
- data/lib/metro/events/events.rb +3 -0
- data/lib/metro/events/has_events.rb +108 -0
- data/lib/metro/events/hit_list.rb +75 -0
- data/lib/metro/events/unknown_sender.rb +5 -0
- data/lib/metro/font.rb +69 -0
- data/lib/metro/game.rb +102 -0
- data/lib/metro/game/dsl.rb +68 -0
- data/lib/metro/image.rb +68 -0
- data/lib/metro/logging.rb +33 -0
- data/lib/metro/missing_scene.rb +21 -0
- data/lib/metro/models/audio/song.rb +33 -0
- data/lib/metro/models/draws.rb +86 -0
- data/lib/metro/models/key_value_coding.rb +38 -0
- data/lib/metro/models/model.rb +236 -0
- data/lib/metro/models/model_factory.rb +32 -0
- data/lib/metro/models/models.rb +62 -0
- data/lib/metro/models/properties/animation_property.rb +115 -0
- data/lib/metro/models/properties/array_property.rb +24 -0
- data/lib/metro/models/properties/boolean_property.rb +27 -0
- data/lib/metro/models/properties/color_property.rb +116 -0
- data/lib/metro/models/properties/dimensions_property.rb +84 -0
- data/lib/metro/models/properties/font_property.rb +130 -0
- data/lib/metro/models/properties/image_property.rb +96 -0
- data/lib/metro/models/properties/model_property.rb +84 -0
- data/lib/metro/models/properties/numeric_property.rb +29 -0
- data/lib/metro/models/properties/options_property/no_option.rb +29 -0
- data/lib/metro/models/properties/options_property/options.rb +94 -0
- data/lib/metro/models/properties/options_property/options_property.rb +125 -0
- data/lib/metro/models/properties/position_property.rb +90 -0
- data/lib/metro/models/properties/property.rb +221 -0
- data/lib/metro/models/properties/property_owner.rb +137 -0
- data/lib/metro/models/properties/sample_property.rb +84 -0
- data/lib/metro/models/properties/scale_property.rb +80 -0
- data/lib/metro/models/properties/song_property.rb +89 -0
- data/lib/metro/models/properties/text_property.rb +75 -0
- data/lib/metro/models/ui/animated_sprite.rb +85 -0
- data/lib/metro/models/ui/border.rb +95 -0
- data/lib/metro/models/ui/fps.rb +54 -0
- data/lib/metro/models/ui/generic.rb +66 -0
- data/lib/metro/models/ui/grid_drawer.rb +74 -0
- data/lib/metro/models/ui/image.rb +87 -0
- data/lib/metro/models/ui/label.rb +175 -0
- data/lib/metro/models/ui/menu.rb +214 -0
- 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 +59 -0
- data/lib/metro/models/ui/sprite.rb +79 -0
- data/lib/metro/models/ui/tile_map.rb +162 -0
- data/lib/metro/models/ui/ui.rb +13 -0
- data/lib/metro/parameters/command_line_args_parser.rb +68 -0
- data/lib/metro/parameters/options.rb +25 -0
- data/lib/metro/parameters/parameters.rb +2 -0
- data/lib/metro/sample.rb +40 -0
- data/lib/metro/scene.rb +477 -0
- data/lib/metro/scenes.rb +154 -0
- data/lib/metro/song.rb +56 -0
- data/lib/metro/template_message.rb +60 -0
- data/lib/metro/transitions/edit_transition_scene.rb +100 -0
- data/lib/metro/transitions/fade_transition_scene.rb +66 -0
- data/lib/metro/transitions/scene_transitions.rb +44 -0
- data/lib/metro/transitions/transition_scene.rb +19 -0
- data/lib/metro/units/bounds.rb +8 -0
- data/lib/metro/units/calculation_validations.rb +74 -0
- data/lib/metro/units/dimensions.rb +60 -0
- data/lib/metro/units/point.rb +51 -0
- data/lib/metro/units/rectangle_bounds.rb +85 -0
- data/lib/metro/units/scale.rb +46 -0
- data/lib/metro/units/units.rb +6 -0
- data/lib/metro/version.rb +32 -0
- data/lib/metro/views/json_view.rb +60 -0
- data/lib/metro/views/no_view.rb +34 -0
- data/lib/metro/views/parsers.rb +42 -0
- data/lib/metro/views/scene_view.rb +107 -0
- data/lib/metro/views/view.rb +133 -0
- data/lib/metro/views/writers.rb +43 -0
- data/lib/metro/views/yaml_view.rb +94 -0
- data/lib/metro/window.rb +94 -0
- data/lib/setup_handlers/exit_if_dry_run.rb +26 -0
- data/lib/setup_handlers/game_execution.rb +65 -0
- data/lib/setup_handlers/load_game_configuration.rb +65 -0
- data/lib/setup_handlers/load_game_files.rb +101 -0
- data/lib/setup_handlers/move_to_game_directory.rb +25 -0
- data/lib/setup_handlers/reload_game_on_game_file_changes.rb +79 -0
- data/lib/templates/game/README.md.tt +52 -0
- data/lib/templates/game/assets/brand.jpg +0 -0
- data/lib/templates/game/assets/hero.png +0 -0
- data/lib/templates/game/lib/custom_easing.rb +32 -0
- data/lib/templates/game/metro.tt +63 -0
- data/lib/templates/game/models/hero.rb +62 -0
- data/lib/templates/game/scenes/brand_scene.rb +19 -0
- data/lib/templates/game/scenes/brand_to_title_scene.rb +13 -0
- data/lib/templates/game/scenes/first_scene.rb +28 -0
- data/lib/templates/game/scenes/game_scene.rb +43 -0
- data/lib/templates/game/scenes/title_scene.rb +15 -0
- data/lib/templates/game/views/brand.yaml +4 -0
- data/lib/templates/game/views/brand_to_title.yaml +8 -0
- data/lib/templates/game/views/first.yaml +26 -0
- data/lib/templates/game/views/title.yaml +11 -0
- data/lib/templates/message.erb +23 -0
- data/lib/templates/model.rb.tt +111 -0
- data/lib/templates/scene.rb.tt +140 -0
- data/lib/templates/view.yaml.tt +11 -0
- data/lib/tmxed_ext/tile_set.rb +34 -0
- data/metro.gemspec +56 -0
- data/spec/core_ext/numeric_spec.rb +78 -0
- data/spec/core_ext/string_spec.rb +33 -0
- data/spec/gosu_ext/color_spec.rb +80 -0
- data/spec/metro/events/event_state_manager_spec.rb +5 -0
- data/spec/metro/models/key_value_coding_spec.rb +61 -0
- data/spec/metro/models/properties/array_property_spec.rb +60 -0
- data/spec/metro/models/properties/color_property_spec.rb +85 -0
- data/spec/metro/models/properties/dimensions_spec.rb +29 -0
- data/spec/metro/models/properties/font_property_spec.rb +127 -0
- data/spec/metro/models/properties/numeric_property_spec.rb +46 -0
- data/spec/metro/models/properties/options_property/no_option_spec.rb +25 -0
- data/spec/metro/models/properties/options_property/options_property_spec.rb +133 -0
- data/spec/metro/models/properties/options_property/options_spec.rb +125 -0
- data/spec/metro/models/properties/position_property_spec.rb +90 -0
- data/spec/metro/models/ui/label_spec.rb +259 -0
- data/spec/metro/parameters/command_line_args_parser_spec.rb +42 -0
- data/spec/metro/scene_spec.rb +15 -0
- data/spec/metro/scene_views/json_view_spec.rb +27 -0
- data/spec/metro/scene_views/yaml_view_spec.rb +38 -0
- data/spec/metro/scenes_spec.rb +77 -0
- data/spec/metro/units/point_spec.rb +132 -0
- data/spec/metro/views/view_spec.rb +53 -0
- data/spec/setup_handlers/exit_if_dry_run_spec.rb +27 -0
- data/spec/setup_handlers/reload_game_on_game_file_changes_spec.rb +68 -0
- data/spec/spec_helper.rb +20 -0
- metadata +374 -0
data/lib/metro/scenes.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
module Metro
|
2
|
+
|
3
|
+
#
|
4
|
+
# @example Finding a scene based on the scene name
|
5
|
+
#
|
6
|
+
# class IntroScene < Metro::Scene
|
7
|
+
# # ... scene content ...
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# Scenes.find("intro") # => IntroScene
|
11
|
+
# Scenes.find(:intro) # => IntroScene
|
12
|
+
#
|
13
|
+
# @example Creating a scene instance based on the scene name
|
14
|
+
#
|
15
|
+
# class IntroScene < Metro::Scene
|
16
|
+
# # ... scene content ...
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# Scenes.generate("intro") # => [SCENE: title]
|
20
|
+
# Scenes.generate(:intro) # => [SCENE: title]
|
21
|
+
#
|
22
|
+
# @example Finding a scene that does not exist
|
23
|
+
#
|
24
|
+
# scene = Scenes.find(:unknown)
|
25
|
+
# scene.missing_scene # => :unknown
|
26
|
+
#
|
27
|
+
module Scenes
|
28
|
+
extend self
|
29
|
+
|
30
|
+
#
|
31
|
+
# Add a scene to the hash of scenes with the scene name of the scene as the key
|
32
|
+
# to retrieving this scene.
|
33
|
+
#
|
34
|
+
# @param [Scene] scene the scene to be added to the hash of Scenes.
|
35
|
+
#
|
36
|
+
def add(scene)
|
37
|
+
all_scenes_for(scene).each { |scene| scenes_hash[scene.scene_name] = scene.to_s }
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Finds the scene based on the specified scene name.
|
42
|
+
#
|
43
|
+
# @param [String,Symbol] scene_name the name of the scene to locate.
|
44
|
+
# @return the Scene class that is found matching the specified scene name.
|
45
|
+
#
|
46
|
+
def find(scene_name)
|
47
|
+
scenes_hash[scene_name].constantize
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# @return [Array<String>] all the names supported by the scenes hash.
|
52
|
+
#
|
53
|
+
def list
|
54
|
+
scenes_hash.keys
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Finds the scene with the specified name and then creates an instance of that
|
59
|
+
# scene.
|
60
|
+
#
|
61
|
+
# @param [String,Symbol,Object] scene_name the name of the scene to locate.
|
62
|
+
# @return an instance of Scene that is found matching the specified scene name
|
63
|
+
#
|
64
|
+
def generate(scene_or_scene_name,options = {})
|
65
|
+
new_scene = generate_scene_from(scene_or_scene_name)
|
66
|
+
apply_post_filters(new_scene,options)
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# If we have been given a scene, then we simply want to use it otherwise
|
71
|
+
# we need to find and generate our scene from the scene name.
|
72
|
+
#
|
73
|
+
# @param [String,Sybmol,Class] scene_or_scene_name the name of the scene or an instance
|
74
|
+
# of Scene.
|
75
|
+
#
|
76
|
+
def generate_scene_from(scene_or_scene_name)
|
77
|
+
if scene_or_scene_name.is_a? Scene
|
78
|
+
scene_or_scene_name
|
79
|
+
else
|
80
|
+
find(scene_or_scene_name).new
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Post filters are applied to the scene after it has been found. These are
|
86
|
+
# all objects that can respond to the #filter method.
|
87
|
+
#
|
88
|
+
def post_filters
|
89
|
+
@post_filters ||= []
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Register a filter that will be executed after a scene is found and generated. This
|
94
|
+
# allows for the scene to be modified or changed based on the provided options.
|
95
|
+
#
|
96
|
+
# A filter is any object that responds to #filter and accepts two parameters: the
|
97
|
+
# scene and a hash of options.
|
98
|
+
#
|
99
|
+
# @param [#filter] post_filter a filter is an object that can act as a filter.
|
100
|
+
#
|
101
|
+
def register_post_filter(post_filter)
|
102
|
+
post_filters.push(post_filter)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
#
|
108
|
+
# Apply all the post filtering to the specified scene with the given options
|
109
|
+
#
|
110
|
+
# @return a Scene object that has been filtered.
|
111
|
+
#
|
112
|
+
def apply_post_filters(new_scene,options)
|
113
|
+
post_filters.inject(new_scene) {|scene,post| post.filter(scene,options) }
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# @return a Hash that allows for accessing symbol names of the scenes
|
118
|
+
# as well as the class name constants to allow for the scenes to be found.
|
119
|
+
#
|
120
|
+
def scenes_hash
|
121
|
+
@scenes_hash ||= hash_with_missing_scene_default
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Create a hash that will return a setup missing scene by default.
|
126
|
+
#
|
127
|
+
def hash_with_missing_scene_default
|
128
|
+
hash = HashWithIndifferentAccess.new do |hash,key|
|
129
|
+
missing_scene = hash[:missing_scene].constantize
|
130
|
+
missing_scene.missing_scene = key.to_sym
|
131
|
+
missing_scene
|
132
|
+
end
|
133
|
+
hash[:missing_scene] = "Metro::MissingScene"
|
134
|
+
hash
|
135
|
+
end
|
136
|
+
|
137
|
+
#
|
138
|
+
# Returns all subclassed scenes of the scene or scenes provided. This method is
|
139
|
+
# meant to be called recursively to generate the entire list of all the scenes.
|
140
|
+
#
|
141
|
+
# @param [Scene,Array<Scene>] scenes a scene or scene subclass or an array of
|
142
|
+
# scene subclasses.
|
143
|
+
#
|
144
|
+
def all_scenes_for(scenes)
|
145
|
+
Array(scenes).map do |scene_class_name|
|
146
|
+
scene = scene_class_name.constantize
|
147
|
+
[ scene ] + all_scenes_for(scene.scenes)
|
148
|
+
end.flatten.compact
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
require_relative 'transitions/scene_transitions'
|
data/lib/metro/song.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module Metro
|
2
|
+
|
3
|
+
#
|
4
|
+
# Song is a wrapper class for a Gosu Song. This allows for additional data to be stored
|
5
|
+
# without relying on monkey-patching on functionality.
|
6
|
+
#
|
7
|
+
class Song < SimpleDelegator
|
8
|
+
|
9
|
+
attr_accessor :song, :path
|
10
|
+
|
11
|
+
def initialize(song,path)
|
12
|
+
super(song)
|
13
|
+
@song = song
|
14
|
+
@path = path
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Finds an existing song or creates a new song given the window and path.
|
19
|
+
#
|
20
|
+
# @example Finding or creating an Song
|
21
|
+
#
|
22
|
+
# Metro::Image.find_or_create window: model.window, path: "asset_path"
|
23
|
+
#
|
24
|
+
def self.find_or_create(options)
|
25
|
+
path = AssetPath.with(options[:path])
|
26
|
+
songs[path.to_s] or (songs[path.to_s] = create(options))
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Create an Song given the window and path.
|
31
|
+
#
|
32
|
+
# @example Creating an Song
|
33
|
+
#
|
34
|
+
# Metro::Song.create window: model.window, path: "asset_path"
|
35
|
+
#
|
36
|
+
def self.create(options)
|
37
|
+
window, asset_path = create_params(options)
|
38
|
+
gosu_song = Gosu::Song.new(window,asset_path.filepath)
|
39
|
+
new gosu_song, asset_path.path
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def self.create_params(options)
|
45
|
+
options.symbolize_keys!
|
46
|
+
asset_path = AssetPath.with(options[:path])
|
47
|
+
window = options[:window]
|
48
|
+
[ window, asset_path ]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.songs
|
52
|
+
@songs ||= {}
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class TemplateMessage
|
2
|
+
|
3
|
+
def initialize(details = {})
|
4
|
+
@messages = Array(details[:message]) + Array(details[:messages])
|
5
|
+
@details = details[:details]
|
6
|
+
@website = details[:website]
|
7
|
+
@email = details[:contact]
|
8
|
+
end
|
9
|
+
|
10
|
+
class Message
|
11
|
+
|
12
|
+
attr_reader :name, :details
|
13
|
+
|
14
|
+
def initialize(name,details)
|
15
|
+
@name = name
|
16
|
+
@details = details
|
17
|
+
end
|
18
|
+
|
19
|
+
def field_locale(field)
|
20
|
+
I18n.t("#{name}.#{field}",details)
|
21
|
+
end
|
22
|
+
|
23
|
+
def title
|
24
|
+
field_locale 'title'
|
25
|
+
end
|
26
|
+
|
27
|
+
def message
|
28
|
+
field_locale 'message'
|
29
|
+
end
|
30
|
+
|
31
|
+
def actions
|
32
|
+
Array( field_locale('actions') ).map {|action| "* #{action}" }.join("\n")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def messages
|
37
|
+
@messages.map {|m| Message.new m, @details }
|
38
|
+
end
|
39
|
+
|
40
|
+
def website
|
41
|
+
Array(@website).map {|website| "* #{website}" }.join("\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
def email
|
45
|
+
Array(@email).map {|email| "* #{email}" }.join("\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
def message_filename
|
49
|
+
File.join(File.dirname(__FILE__),"..","templates","message.erb")
|
50
|
+
end
|
51
|
+
|
52
|
+
def message_template
|
53
|
+
File.read(message_filename)
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
ERB.new(message_template).result(binding)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative '../events/hit_list'
|
2
|
+
|
3
|
+
module Metro
|
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
|
+
#
|
18
|
+
class EditTransitionScene < Metro::TransitionScene
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
#
|
22
|
+
# The EditTransitionScene needs to have all the drawers
|
23
|
+
# cleared from the class because it may still have
|
24
|
+
# drawers from other things that this was executed.
|
25
|
+
#
|
26
|
+
# This is a product of using the classes to store the definitions
|
27
|
+
# of scene. This means we need to change this so that it is much
|
28
|
+
# easier to dup scenes.
|
29
|
+
#
|
30
|
+
self.class.drawings.clear
|
31
|
+
self.class.draw :overlay, model: "metro::ui::grid_drawer"
|
32
|
+
self.class.draw :labeler, model: "metro::ui::model_labeler"
|
33
|
+
add_actors_to_scene
|
34
|
+
after_initialize
|
35
|
+
end
|
36
|
+
|
37
|
+
def prepare_transition_from(old_scene)
|
38
|
+
next_scene.prepare_transition_from(old_scene)
|
39
|
+
@previous_scene = old_scene
|
40
|
+
|
41
|
+
# Set the view name to the previous scene's view name
|
42
|
+
self.class.view_name old_scene.view_name
|
43
|
+
self.class.view.format = old_scene.class.view.format
|
44
|
+
|
45
|
+
# import all the actors from the previous scene into the current scene.
|
46
|
+
old_scene.class.actors.each do |scene_actor|
|
47
|
+
self.class.draw scene_actor.name, scene_actor.options
|
48
|
+
end
|
49
|
+
|
50
|
+
add_actors_to_scene
|
51
|
+
end
|
52
|
+
|
53
|
+
def show
|
54
|
+
window.show_cursor
|
55
|
+
end
|
56
|
+
|
57
|
+
event :on_up, KbE do
|
58
|
+
transition_to next_scene.scene_name
|
59
|
+
end
|
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
|
+
|
73
|
+
#
|
74
|
+
# Generate a hitlist which manages the click start, hold, and release
|
75
|
+
# of the mouse button.
|
76
|
+
#
|
77
|
+
def hitlist
|
78
|
+
@hitlist ||= HitList.new(drawers)
|
79
|
+
end
|
80
|
+
|
81
|
+
event :on_down, MsLeft do |event|
|
82
|
+
hitlist.hit(event)
|
83
|
+
end
|
84
|
+
|
85
|
+
event :on_hold, MsLeft do |event|
|
86
|
+
hitlist.update(event)
|
87
|
+
end
|
88
|
+
|
89
|
+
event :on_up, MsLeft do |event|
|
90
|
+
hitlist.release(event)
|
91
|
+
end
|
92
|
+
|
93
|
+
event :on_up, KbS do
|
94
|
+
log.info "Saving changes to Scene #{previous_scene} View - #{view_name}"
|
95
|
+
save_view
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Metro
|
2
|
+
class FadeTransitionScene < TransitionScene
|
3
|
+
|
4
|
+
draw :rectangle, model: "metro::ui::rectangle"
|
5
|
+
|
6
|
+
#
|
7
|
+
# When the scene is shown set up the starting color for the rectangle
|
8
|
+
# and queue the animation to transition the color to the final color.
|
9
|
+
#
|
10
|
+
def show
|
11
|
+
rectangle.color = starting_color
|
12
|
+
|
13
|
+
color = final_color
|
14
|
+
|
15
|
+
animate :rectangle, to: { red: color.red,
|
16
|
+
green: color.green,
|
17
|
+
blue: color.blue,
|
18
|
+
alpha: color.alpha },
|
19
|
+
interval: interval do
|
20
|
+
|
21
|
+
transition_to next_scene
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def interval
|
26
|
+
options[:interval] || default_interval
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_interval
|
30
|
+
60
|
31
|
+
end
|
32
|
+
|
33
|
+
def starting_color
|
34
|
+
options_starting_color || default_starting_color
|
35
|
+
end
|
36
|
+
|
37
|
+
def options_starting_color
|
38
|
+
color_from_options(:from)
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_starting_color
|
42
|
+
Gosu::Color.new "rgb(255,255,255)"
|
43
|
+
end
|
44
|
+
|
45
|
+
def final_color
|
46
|
+
options_final_color || default_final_color
|
47
|
+
end
|
48
|
+
|
49
|
+
def options_final_color
|
50
|
+
color_from_options(:to)
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_final_color
|
54
|
+
Gosu::Color.new "rgb(0,0,0)"
|
55
|
+
end
|
56
|
+
|
57
|
+
def color_from_options(position)
|
58
|
+
if options[position]
|
59
|
+
if options[position][:color]
|
60
|
+
Gosu::Color.new options[position][:color]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'transition_scene'
|
2
|
+
|
3
|
+
module Metro
|
4
|
+
module SceneTransitions
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def insert_transition(scene,options)
|
8
|
+
return scene unless options.key?(:with)
|
9
|
+
name = options[:with]
|
10
|
+
generate_transition(name,scene,options)
|
11
|
+
end
|
12
|
+
|
13
|
+
alias_method :filter, :insert_transition
|
14
|
+
|
15
|
+
def generate_transition(name,next_scene,options)
|
16
|
+
transition = find_transition(name).new
|
17
|
+
transition.next_scene = next_scene
|
18
|
+
transition.options = options
|
19
|
+
transition
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_transition(name)
|
23
|
+
transition_name = supported_transitions[name]
|
24
|
+
transition_name.constantize
|
25
|
+
end
|
26
|
+
|
27
|
+
def supported_transitions
|
28
|
+
@supported_transitions ||= begin
|
29
|
+
hash = HashWithIndifferentAccess.new("Metro::FadeTransitionScene")
|
30
|
+
hash[:edit] = "Metro::EditTransitionScene"
|
31
|
+
hash
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# The Scene Transition should act as a filter and allow for
|
39
|
+
# common or custom scenes to be inserted between the scene
|
40
|
+
# that was about to be displayed.
|
41
|
+
#
|
42
|
+
Scenes.register_post_filter SceneTransitions
|
43
|
+
|
44
|
+
end
|