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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require_relative 'event_relay'
|
|
2
|
+
|
|
3
|
+
module Metro
|
|
4
|
+
|
|
5
|
+
class EventStateManager
|
|
6
|
+
def initialize
|
|
7
|
+
@current_state = []
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
attr_accessor :window
|
|
11
|
+
|
|
12
|
+
attr_reader :current_state
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Clear all the event relays of the current game state
|
|
16
|
+
#
|
|
17
|
+
def clear
|
|
18
|
+
current_state.clear
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Fire events for held buttons within the current game state
|
|
23
|
+
#
|
|
24
|
+
def fire_events_for_held_buttons
|
|
25
|
+
current_state.each {|cs| cs.fire_events_for_held_buttons }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Fire events for button up for the current game state
|
|
30
|
+
#
|
|
31
|
+
def fire_button_up(id)
|
|
32
|
+
current_state.each {|cs| cs.fire_button_up(id) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Fire events for button down within the current game state
|
|
37
|
+
#
|
|
38
|
+
def fire_button_down(id)
|
|
39
|
+
current_state.each {|cs| cs.fire_button_down(id) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Fire notification events within the current game state
|
|
44
|
+
#
|
|
45
|
+
def fire_events_for_notification(event,sender)
|
|
46
|
+
current_state.each {|cs| cs.fire_events_for_notification(event,sender) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# An an event relay to the current game state
|
|
51
|
+
#
|
|
52
|
+
def add_events_for_target(target,events)
|
|
53
|
+
relay = EventRelay.new(target,window)
|
|
54
|
+
|
|
55
|
+
events.each do |target_event|
|
|
56
|
+
relay.send target_event.event, *target_event.buttons, &target_event.block
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
current_state.push relay
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require_relative 'event_dictionary'
|
|
2
|
+
|
|
3
|
+
module Metro
|
|
4
|
+
|
|
5
|
+
module HasEvents
|
|
6
|
+
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.extend ClassMethods
|
|
9
|
+
base.extend GosuConstants
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Register an event for the scene.
|
|
16
|
+
#
|
|
17
|
+
# @example Registering for a save complete event that would re-enable a menu.
|
|
18
|
+
#
|
|
19
|
+
# class ExampleScene
|
|
20
|
+
# event :notification, :save_complete do
|
|
21
|
+
# menu.enabled!
|
|
22
|
+
# end
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# @example Registering for button held events
|
|
26
|
+
#
|
|
27
|
+
# class ExampleScene
|
|
28
|
+
# event :on_hold KbLeft, GpLeft do
|
|
29
|
+
# player.turn_left
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# event :on_hold, KbRight, GpRight do
|
|
33
|
+
# player.turn_right
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# event :on_hold, KbUp, GpButton0, do: :calculate_accleration
|
|
37
|
+
#
|
|
38
|
+
# def calculate_acceleration
|
|
39
|
+
# long_complicated_calculated_result = 0
|
|
40
|
+
# # ... multi-line calculations to determine the player acceleration ...
|
|
41
|
+
# player.accelerate = long_complicated_calculated_result
|
|
42
|
+
# end
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# @example Registering for a button down event to call a method named 'next_option'
|
|
46
|
+
#
|
|
47
|
+
# class ExampleScene
|
|
48
|
+
# event :on_up, KbEscape, do: :leave_scene
|
|
49
|
+
#
|
|
50
|
+
# def leave_scene
|
|
51
|
+
# transition_to :title
|
|
52
|
+
# end
|
|
53
|
+
# end
|
|
54
|
+
#
|
|
55
|
+
# Here in this scene if the Escape Key is pressed and released the example scene
|
|
56
|
+
# will transition to the title scene.
|
|
57
|
+
#
|
|
58
|
+
# @example Registering for a button up event with a block of code to execute
|
|
59
|
+
#
|
|
60
|
+
# class ExampleScene
|
|
61
|
+
# event :on_up, KbEscape do
|
|
62
|
+
# transition_to :title
|
|
63
|
+
# end
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# @example Registering for a button down event to call a method named 'previous_option'
|
|
67
|
+
#
|
|
68
|
+
# class ExampleScene
|
|
69
|
+
# event :on_down, GpLeft, GpUp, do: :previous_option
|
|
70
|
+
#
|
|
71
|
+
# def previous_option
|
|
72
|
+
# @selected_index = @selected_index - 1
|
|
73
|
+
# @selected_index = options.length - 1 if @selected_index <= -1
|
|
74
|
+
# end
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# Here in this scene if the GpLeft or GpUp buttons are pressed down the method
|
|
78
|
+
# `previous_options` will be executed.
|
|
79
|
+
#
|
|
80
|
+
#
|
|
81
|
+
# @example Registering for a button down event with a block of code to execute
|
|
82
|
+
#
|
|
83
|
+
# class ExampleScene
|
|
84
|
+
# event :on_down, GpLeft, GpUp do
|
|
85
|
+
# @selected_index = @selected_index - 1
|
|
86
|
+
# @selected_index = options.length - 1 if @selected_index <= -1
|
|
87
|
+
# end
|
|
88
|
+
# end
|
|
89
|
+
#
|
|
90
|
+
# This example uses a block instead of a method name but it is absolultey the same
|
|
91
|
+
# as the last example.
|
|
92
|
+
#
|
|
93
|
+
def event(event_type,*args,&block)
|
|
94
|
+
EventDictionary.add target: metro_name, type: event_type, args: args, block: block
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# @return a list of all the EventFactories defined for this event holding object
|
|
99
|
+
#
|
|
100
|
+
def events
|
|
101
|
+
EventDictionary.events_for_targets(hierarchy)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Metro
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# The HitList is an object that maintains when an object is touched/clicked
|
|
5
|
+
# and then moved and finally released. The object attempts to work through
|
|
6
|
+
# the process:
|
|
7
|
+
#
|
|
8
|
+
# hit_list.hit(first_event)
|
|
9
|
+
# hit_list.update(next_event)
|
|
10
|
+
# hit_list.update(next_event)
|
|
11
|
+
# hit_list.release(last_event)
|
|
12
|
+
#
|
|
13
|
+
# @see EditTransitionScene
|
|
14
|
+
#
|
|
15
|
+
class HitList
|
|
16
|
+
|
|
17
|
+
def initialize(drawers)
|
|
18
|
+
@drawers = drawers
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
attr_reader :drawers
|
|
22
|
+
|
|
23
|
+
def hit(event)
|
|
24
|
+
add drawers_at(event.mouse_point)
|
|
25
|
+
save_event event
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def update(event)
|
|
29
|
+
offset = offset_from_last_event(event)
|
|
30
|
+
list.each { |d| d.position = d.position + offset }
|
|
31
|
+
|
|
32
|
+
save_event event
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def release(event)
|
|
36
|
+
offset = offset_from_last_event(event)
|
|
37
|
+
list.each { |d| d.position = d.position + offset }
|
|
38
|
+
|
|
39
|
+
save_event event
|
|
40
|
+
clear
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def drawers_at(point)
|
|
44
|
+
hit_drawers = drawers.find_all { |drawer| drawer.bounds.contains?(point) }
|
|
45
|
+
|
|
46
|
+
# assumed that we only want one item
|
|
47
|
+
top_drawer = hit_drawers.inject(hit_drawers.first) {|top,drawer| drawer.z_order > top.z_order ? drawer : top }
|
|
48
|
+
[ top_drawer ].compact
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def offset_from_last_event(event)
|
|
52
|
+
return Point.zero unless @last_event
|
|
53
|
+
event.mouse_point - @last_event.mouse_point
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def save_event(event)
|
|
57
|
+
@first_event = event unless @first_event
|
|
58
|
+
@last_event = event
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def list
|
|
62
|
+
@list ||= []
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def add(hits)
|
|
66
|
+
Array(hits).each {|hit| list.push hit }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def clear
|
|
70
|
+
list.clear
|
|
71
|
+
@first_event = nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
data/lib/metro/font.rb
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Metro
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Font is a wrapper class for a Gosu::Font. This allows for additional data
|
|
5
|
+
# to be stored without relying on monkey-patching on functionality.
|
|
6
|
+
#
|
|
7
|
+
class Font < SimpleDelegator
|
|
8
|
+
|
|
9
|
+
def initialize(gosu_font)
|
|
10
|
+
super(gosu_font)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# An alias to Gosu::Font's height method
|
|
14
|
+
def size ; height ; end
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Return a font that matches the specified criteria. Using the name, size,
|
|
18
|
+
# and window a font will be generated or retrieved from the cache.
|
|
19
|
+
#
|
|
20
|
+
# @example Finding or creating a Font
|
|
21
|
+
#
|
|
22
|
+
# Metro::Font.find_or_create window: model.window,
|
|
23
|
+
# name: "Times New Roman", size: 24
|
|
24
|
+
#
|
|
25
|
+
# @param [Hash] value the hash that contains the `name`, `size` and `window`
|
|
26
|
+
# that describe the font.
|
|
27
|
+
#
|
|
28
|
+
def self.find_or_create(options)
|
|
29
|
+
window, name, size = create_params(options)
|
|
30
|
+
gosu_font = fonts["#{name}:#{size}:#{window}"]
|
|
31
|
+
gosu_font ? new(gosu_font) : create(options)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# Return a font that matches the specified criteria. Using the name, size,
|
|
36
|
+
# and window a font will be generated and stored in the cache.
|
|
37
|
+
#
|
|
38
|
+
# @example Creating a Font
|
|
39
|
+
#
|
|
40
|
+
# Metro::Font.create window: model.window,
|
|
41
|
+
# name: "Comic Sans", size: 48
|
|
42
|
+
#
|
|
43
|
+
# @param [Hash] value the hash that contains the `name`, `size` and `window`
|
|
44
|
+
# that describe the font.
|
|
45
|
+
#
|
|
46
|
+
def self.create(options)
|
|
47
|
+
window, name, size = create_params(options)
|
|
48
|
+
gosu_font = create_gosu_font(window,name,size)
|
|
49
|
+
fonts["#{name}:#{size}:#{window}"] = gosu_font
|
|
50
|
+
new(gosu_font)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
def self.create_params(options)
|
|
56
|
+
options.symbolize_keys!
|
|
57
|
+
[ options[:window], options[:name], options[:size] ]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.create_gosu_font(window, name, size)
|
|
61
|
+
Gosu::Font.new window, name, size
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.fonts
|
|
65
|
+
@fonts ||= {}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/metro/game.rb
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'metro/game/dsl'
|
|
2
|
+
|
|
3
|
+
module Metro
|
|
4
|
+
module Game
|
|
5
|
+
extend self
|
|
6
|
+
|
|
7
|
+
def setup(game_configuration)
|
|
8
|
+
@config = game_configuration
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Creates a window and starts the game with the game parameters.
|
|
13
|
+
#
|
|
14
|
+
def start!
|
|
15
|
+
@window = Window.new width, height, fullscreen?
|
|
16
|
+
window.caption = name
|
|
17
|
+
window.scene = Scenes.generate(first_scene)
|
|
18
|
+
window.show
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# The original parameters specified during execution. These are the args
|
|
22
|
+
# found on the command-line that are passed in when the game started.
|
|
23
|
+
def execution_parameters
|
|
24
|
+
@execution_parameters ||= []
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
attr_writer :execution_parameters
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# @return the current game window.
|
|
31
|
+
#
|
|
32
|
+
attr_reader :window
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# @return [Scene,NilClass] the current scene that is being displayed. If
|
|
36
|
+
# this is called before the window is being displayed when this will return
|
|
37
|
+
# a nil value.
|
|
38
|
+
#
|
|
39
|
+
def current_scene
|
|
40
|
+
window ? window.scene : nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def first_scene
|
|
44
|
+
fetch(:first_scene)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def width
|
|
48
|
+
fetch(:width,800)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def height
|
|
52
|
+
fetch(:height,600)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def bounds
|
|
56
|
+
Units::RectangleBounds.new left: 0, right: width, top: 0, bottom: height
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def dimensions
|
|
60
|
+
Units::Dimensions.of width, height
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def center
|
|
64
|
+
Units::Point.at width / 2 , height / 2
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def fullscreen?
|
|
68
|
+
!!fetch(:fullscreen)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def debug?
|
|
72
|
+
!!fetch(:debug)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def name
|
|
76
|
+
fetch(:name)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def authors
|
|
80
|
+
fetch(:authors)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def website
|
|
84
|
+
fetch(:website,Metro::WEBSITE)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def contact
|
|
88
|
+
fetch(:contact)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def controls
|
|
92
|
+
config.controls.defined_controls
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def fetch(name,fallback = nil)
|
|
96
|
+
config.send(name) rescue fallback
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
attr_reader :config
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require_relative '../events/controls'
|
|
2
|
+
|
|
3
|
+
module Metro
|
|
4
|
+
module Game
|
|
5
|
+
class DSL
|
|
6
|
+
|
|
7
|
+
def self.parse(&block)
|
|
8
|
+
config = new
|
|
9
|
+
config.instance_eval(&block)
|
|
10
|
+
config
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def first_scene(scene_name = nil)
|
|
14
|
+
scene_name ? @first_scene = scene_name : @first_scene
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def width(game_width = nil)
|
|
18
|
+
game_width ? @width = game_width : @width
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def height(game_height = nil)
|
|
22
|
+
game_height ? @height = game_height : @height
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def resolution(w,h)
|
|
26
|
+
[ width(w), height(h) ]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def fullscreen(set_fullscreen = nil)
|
|
30
|
+
set_fullscreen.nil? ? @fullscreen : @fullscreen = set_fullscreen
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def debug(set_debug = nil)
|
|
34
|
+
set_debug.nil? ? @debug : @debug = set_debug
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def name(set_name = nil)
|
|
38
|
+
set_name.nil? ? @name : @name = set_name
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def author(name)
|
|
42
|
+
authors.push name
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def authors
|
|
46
|
+
@authors ||= []
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
alias_method :artist, :author
|
|
50
|
+
alias_method :designer, :author
|
|
51
|
+
|
|
52
|
+
def website(game_website = nil)
|
|
53
|
+
game_website ? @website = game_website : @website
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def contact(game_contact = nil)
|
|
57
|
+
game_contact ? @contact = game_contact : @contact
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def controls(&block)
|
|
61
|
+
@controls ||= Controls.new
|
|
62
|
+
@controls.instance_eval(&block) if block
|
|
63
|
+
@controls
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|