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.
Files changed (177) hide show
  1. data/.gitignore +17 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +12 -0
  6. data/Guardfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +189 -0
  9. data/Rakefile +18 -0
  10. data/bin/metro +16 -0
  11. data/changelog.md +157 -0
  12. data/lib/assets/menu-movement.wav +0 -0
  13. data/lib/assets/menu-selection.wav +0 -0
  14. data/lib/assets/missing.ogg +0 -0
  15. data/lib/assets/missing.png +0 -0
  16. data/lib/assets/missing.wav +0 -0
  17. data/lib/assets/missing_animation.png +0 -0
  18. data/lib/commands/generate_game.rb +13 -0
  19. data/lib/commands/generate_model.rb +25 -0
  20. data/lib/commands/generate_scene.rb +36 -0
  21. data/lib/commands/generate_view.rb +21 -0
  22. data/lib/commands/thor.rb +83 -0
  23. data/lib/core_ext/class.rb +14 -0
  24. data/lib/core_ext/numeric.rb +59 -0
  25. data/lib/gosu_ext/color.rb +62 -0
  26. data/lib/gosu_ext/gosu_constants.rb +53 -0
  27. data/lib/locale/en.yml +35 -0
  28. data/lib/locale/locale.rb +1 -0
  29. data/lib/metro.rb +140 -0
  30. data/lib/metro/animation.rb +135 -0
  31. data/lib/metro/animation/after_interval_factory.rb +12 -0
  32. data/lib/metro/animation/animation_factory.rb +15 -0
  33. data/lib/metro/animation/easing/ease_in.rb +15 -0
  34. data/lib/metro/animation/easing/easing.rb +51 -0
  35. data/lib/metro/animation/easing/linear.rb +15 -0
  36. data/lib/metro/animation/has_animations.rb +70 -0
  37. data/lib/metro/animation/implicit_animation.rb +100 -0
  38. data/lib/metro/animation/on_update_operation.rb +96 -0
  39. data/lib/metro/animation/scene_animation.rb +16 -0
  40. data/lib/metro/asset_path.rb +97 -0
  41. data/lib/metro/events/control_definition.rb +11 -0
  42. data/lib/metro/events/controls.rb +42 -0
  43. data/lib/metro/events/event_data.rb +60 -0
  44. data/lib/metro/events/event_dictionary.rb +52 -0
  45. data/lib/metro/events/event_factory.rb +17 -0
  46. data/lib/metro/events/event_relay.rb +300 -0
  47. data/lib/metro/events/event_state_manager.rb +63 -0
  48. data/lib/metro/events/events.rb +3 -0
  49. data/lib/metro/events/has_events.rb +108 -0
  50. data/lib/metro/events/hit_list.rb +75 -0
  51. data/lib/metro/events/unknown_sender.rb +5 -0
  52. data/lib/metro/font.rb +69 -0
  53. data/lib/metro/game.rb +102 -0
  54. data/lib/metro/game/dsl.rb +68 -0
  55. data/lib/metro/image.rb +68 -0
  56. data/lib/metro/logging.rb +33 -0
  57. data/lib/metro/missing_scene.rb +21 -0
  58. data/lib/metro/models/audio/song.rb +33 -0
  59. data/lib/metro/models/draws.rb +86 -0
  60. data/lib/metro/models/key_value_coding.rb +38 -0
  61. data/lib/metro/models/model.rb +236 -0
  62. data/lib/metro/models/model_factory.rb +32 -0
  63. data/lib/metro/models/models.rb +62 -0
  64. data/lib/metro/models/properties/animation_property.rb +115 -0
  65. data/lib/metro/models/properties/array_property.rb +24 -0
  66. data/lib/metro/models/properties/boolean_property.rb +27 -0
  67. data/lib/metro/models/properties/color_property.rb +116 -0
  68. data/lib/metro/models/properties/dimensions_property.rb +84 -0
  69. data/lib/metro/models/properties/font_property.rb +130 -0
  70. data/lib/metro/models/properties/image_property.rb +96 -0
  71. data/lib/metro/models/properties/model_property.rb +84 -0
  72. data/lib/metro/models/properties/numeric_property.rb +29 -0
  73. data/lib/metro/models/properties/options_property/no_option.rb +29 -0
  74. data/lib/metro/models/properties/options_property/options.rb +94 -0
  75. data/lib/metro/models/properties/options_property/options_property.rb +125 -0
  76. data/lib/metro/models/properties/position_property.rb +90 -0
  77. data/lib/metro/models/properties/property.rb +221 -0
  78. data/lib/metro/models/properties/property_owner.rb +137 -0
  79. data/lib/metro/models/properties/sample_property.rb +84 -0
  80. data/lib/metro/models/properties/scale_property.rb +80 -0
  81. data/lib/metro/models/properties/song_property.rb +89 -0
  82. data/lib/metro/models/properties/text_property.rb +75 -0
  83. data/lib/metro/models/ui/animated_sprite.rb +85 -0
  84. data/lib/metro/models/ui/border.rb +95 -0
  85. data/lib/metro/models/ui/fps.rb +54 -0
  86. data/lib/metro/models/ui/generic.rb +66 -0
  87. data/lib/metro/models/ui/grid_drawer.rb +74 -0
  88. data/lib/metro/models/ui/image.rb +87 -0
  89. data/lib/metro/models/ui/label.rb +175 -0
  90. data/lib/metro/models/ui/menu.rb +214 -0
  91. data/lib/metro/models/ui/model_label.rb +65 -0
  92. data/lib/metro/models/ui/model_labeler.rb +79 -0
  93. data/lib/metro/models/ui/rectangle.rb +59 -0
  94. data/lib/metro/models/ui/sprite.rb +79 -0
  95. data/lib/metro/models/ui/tile_map.rb +162 -0
  96. data/lib/metro/models/ui/ui.rb +13 -0
  97. data/lib/metro/parameters/command_line_args_parser.rb +68 -0
  98. data/lib/metro/parameters/options.rb +25 -0
  99. data/lib/metro/parameters/parameters.rb +2 -0
  100. data/lib/metro/sample.rb +40 -0
  101. data/lib/metro/scene.rb +477 -0
  102. data/lib/metro/scenes.rb +154 -0
  103. data/lib/metro/song.rb +56 -0
  104. data/lib/metro/template_message.rb +60 -0
  105. data/lib/metro/transitions/edit_transition_scene.rb +100 -0
  106. data/lib/metro/transitions/fade_transition_scene.rb +66 -0
  107. data/lib/metro/transitions/scene_transitions.rb +44 -0
  108. data/lib/metro/transitions/transition_scene.rb +19 -0
  109. data/lib/metro/units/bounds.rb +8 -0
  110. data/lib/metro/units/calculation_validations.rb +74 -0
  111. data/lib/metro/units/dimensions.rb +60 -0
  112. data/lib/metro/units/point.rb +51 -0
  113. data/lib/metro/units/rectangle_bounds.rb +85 -0
  114. data/lib/metro/units/scale.rb +46 -0
  115. data/lib/metro/units/units.rb +6 -0
  116. data/lib/metro/version.rb +32 -0
  117. data/lib/metro/views/json_view.rb +60 -0
  118. data/lib/metro/views/no_view.rb +34 -0
  119. data/lib/metro/views/parsers.rb +42 -0
  120. data/lib/metro/views/scene_view.rb +107 -0
  121. data/lib/metro/views/view.rb +133 -0
  122. data/lib/metro/views/writers.rb +43 -0
  123. data/lib/metro/views/yaml_view.rb +94 -0
  124. data/lib/metro/window.rb +94 -0
  125. data/lib/setup_handlers/exit_if_dry_run.rb +26 -0
  126. data/lib/setup_handlers/game_execution.rb +65 -0
  127. data/lib/setup_handlers/load_game_configuration.rb +65 -0
  128. data/lib/setup_handlers/load_game_files.rb +101 -0
  129. data/lib/setup_handlers/move_to_game_directory.rb +25 -0
  130. data/lib/setup_handlers/reload_game_on_game_file_changes.rb +79 -0
  131. data/lib/templates/game/README.md.tt +52 -0
  132. data/lib/templates/game/assets/brand.jpg +0 -0
  133. data/lib/templates/game/assets/hero.png +0 -0
  134. data/lib/templates/game/lib/custom_easing.rb +32 -0
  135. data/lib/templates/game/metro.tt +63 -0
  136. data/lib/templates/game/models/hero.rb +62 -0
  137. data/lib/templates/game/scenes/brand_scene.rb +19 -0
  138. data/lib/templates/game/scenes/brand_to_title_scene.rb +13 -0
  139. data/lib/templates/game/scenes/first_scene.rb +28 -0
  140. data/lib/templates/game/scenes/game_scene.rb +43 -0
  141. data/lib/templates/game/scenes/title_scene.rb +15 -0
  142. data/lib/templates/game/views/brand.yaml +4 -0
  143. data/lib/templates/game/views/brand_to_title.yaml +8 -0
  144. data/lib/templates/game/views/first.yaml +26 -0
  145. data/lib/templates/game/views/title.yaml +11 -0
  146. data/lib/templates/message.erb +23 -0
  147. data/lib/templates/model.rb.tt +111 -0
  148. data/lib/templates/scene.rb.tt +140 -0
  149. data/lib/templates/view.yaml.tt +11 -0
  150. data/lib/tmxed_ext/tile_set.rb +34 -0
  151. data/metro.gemspec +56 -0
  152. data/spec/core_ext/numeric_spec.rb +78 -0
  153. data/spec/core_ext/string_spec.rb +33 -0
  154. data/spec/gosu_ext/color_spec.rb +80 -0
  155. data/spec/metro/events/event_state_manager_spec.rb +5 -0
  156. data/spec/metro/models/key_value_coding_spec.rb +61 -0
  157. data/spec/metro/models/properties/array_property_spec.rb +60 -0
  158. data/spec/metro/models/properties/color_property_spec.rb +85 -0
  159. data/spec/metro/models/properties/dimensions_spec.rb +29 -0
  160. data/spec/metro/models/properties/font_property_spec.rb +127 -0
  161. data/spec/metro/models/properties/numeric_property_spec.rb +46 -0
  162. data/spec/metro/models/properties/options_property/no_option_spec.rb +25 -0
  163. data/spec/metro/models/properties/options_property/options_property_spec.rb +133 -0
  164. data/spec/metro/models/properties/options_property/options_spec.rb +125 -0
  165. data/spec/metro/models/properties/position_property_spec.rb +90 -0
  166. data/spec/metro/models/ui/label_spec.rb +259 -0
  167. data/spec/metro/parameters/command_line_args_parser_spec.rb +42 -0
  168. data/spec/metro/scene_spec.rb +15 -0
  169. data/spec/metro/scene_views/json_view_spec.rb +27 -0
  170. data/spec/metro/scene_views/yaml_view_spec.rb +38 -0
  171. data/spec/metro/scenes_spec.rb +77 -0
  172. data/spec/metro/units/point_spec.rb +132 -0
  173. data/spec/metro/views/view_spec.rb +53 -0
  174. data/spec/setup_handlers/exit_if_dry_run_spec.rb +27 -0
  175. data/spec/setup_handlers/reload_game_on_game_file_changes_spec.rb +68 -0
  176. data/spec/spec_helper.rb +20 -0
  177. metadata +374 -0
@@ -0,0 +1,140 @@
1
+ class <%= scene_class_name %> < GameScene
2
+ # By default the Scene Name is based on the class name
3
+ # but that can be overridden with the scene_name class method
4
+ # scene_name "credits"
5
+
6
+ draw :title
7
+
8
+ #
9
+ # DRAWING and ACTORS
10
+ #
11
+ # @example Explicitly drawing a text label in the scene
12
+ #
13
+ # draw :title, model: 'metro::ui::label',
14
+ # text: 'Title Screen',
15
+ # position: '20,20,0',
16
+ # font: { size: 60 },
17
+ # color: 'rgba(255,255,255,1.0)',
18
+ # align: 'center',
19
+ # vertical_align: 'center'
20
+ #
21
+ #
22
+ # The draw method can be simpler for models that have content defined
23
+ # for them in the view or the models themselves define the appropriate
24
+ # fields.
25
+ #
26
+ # @example defining multiple things to draw; their visual data would be
27
+ # stored within the respective view file
28
+ #
29
+ # draws :title, :hero, :enemy
30
+ #
31
+
32
+ #
33
+ # ANIMATIONS
34
+ #
35
+ # @example of the title being moved to a new y position and the alpha level
36
+ #
37
+ # animate :title, to: { y: 80, alpha: 50 }, interval: 120.ticks do
38
+ # puts "Done Animating!"
39
+ # end
40
+ #
41
+ # @example of using nested animations and after blocks to generate a fade in
42
+ # and fade out effect.
43
+ #
44
+ # after 2.seconds do
45
+ # animate :title, to: { alpha: 255 }, interval: 1.second do
46
+ # after 1.second do
47
+ # animate :title, to: { alpha: 0 }, interval: 1.second
48
+ # end
49
+ # end
50
+ # end
51
+ #
52
+ # @note the interval can be specified in game ticks ( 1.tick, 23.ticks ) or
53
+ # in seconds ( 1.second, 23.seconds ). 60 game times are roughly equivalent
54
+ # to 1 second, however you should not use Metro for monitoring a nuclear
55
+ # reactor.
56
+ #
57
+
58
+ #
59
+ # Example Event Handling Definitions
60
+ #
61
+ # @example Registering the keyboard down event to execute a block of code
62
+ #
63
+ # event :on_down, GpLeft, GpUp, do
64
+ # transition_to :next_scene
65
+ # end
66
+ #
67
+ # @example Registering the keyboard up key to execute the method `leave_scene`
68
+ #
69
+ # event :on_up, KbEscape, do: :leave_scene
70
+ #
71
+ # @example Registering for button held events that would move an actor named `player`
72
+ #
73
+ # event :on_hold, KbRight, GpRight do
74
+ # title.alpha = title.alpha - 1
75
+ # end
76
+ # Keystroke and Game Event Reference
77
+ #
78
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsMac.hpp
79
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsX.hpp
80
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsWin.hpp
81
+ #
82
+ #
83
+ # @example Registering for an event called 'save_complete' event that anyone
84
+ # can generate and this scene block will execute this code.
85
+ #
86
+ # event :notification, :save_complete do
87
+ # puts "Save Complete!"
88
+ # end
89
+ #
90
+ # Within the scene or in the models you could use the method `notification`
91
+ # to generate the notification
92
+ #
93
+ # def update
94
+ # if player.x > 600 and player.y > 440
95
+ # notification :player_wins
96
+ # end
97
+ # end
98
+ #
99
+
100
+ #
101
+ # As Scene does a lot of work for you with regarding to setting up content, it is
102
+ # best not to override #initialize and instead define an #after_initialize method
103
+ # within the subclasses of Scene.
104
+ #
105
+ def after_initialize ; end
106
+
107
+ #
108
+ # This method is called right after the scene has been adopted by the window.
109
+ # This is a great place to make changes to the scene before the update methods
110
+ # or draw methods have ever been called.
111
+ #
112
+ def show ; end
113
+
114
+ #
115
+ # This is called every update interval while the scene is being shown in the
116
+ # window.
117
+ #
118
+ def update ; end
119
+
120
+ #
121
+ # This is called after every #update and when the OS wants the window to
122
+ # repaint itself.
123
+ #
124
+ def draw ; end
125
+
126
+ #
127
+ # Before a scene is transitioned away from to a new scene, this method is called
128
+ # to allow for the scene to complete any tasks, stop any actions, or pass any
129
+ # information from the existing scene to the scene that is about to replace it.
130
+ #
131
+ def prepare_transition_to(new_scene) ; end
132
+
133
+ #
134
+ # Before a scene is transitioned to it is called with the previous scene. This
135
+ # allows for the new scene to retrieve any data from the previous scene to assist
136
+ # with the layout of the current scene.
137
+ #
138
+ def prepare_transition_from(old_scene) ; end
139
+
140
+ end
@@ -0,0 +1,11 @@
1
+ # http://www.yaml.org/YAML_for_ruby.html
2
+ ---
3
+ title:
4
+ model: "metro::ui::label"
5
+ text: "Your Scene"
6
+ align: center
7
+ vertical_align: center
8
+ position: "190,200,4"
9
+ font:
10
+ size: 60
11
+ color: "rgba(255,255,0,1.0)"
@@ -0,0 +1,34 @@
1
+ module Tmxed
2
+ class TileSet
3
+ attr_accessor :window
4
+
5
+ def full_width
6
+ tilewidth + spacing
7
+ end
8
+
9
+ def full_height
10
+ tileheight + spacing
11
+ end
12
+
13
+ def crop_bounds
14
+ [ margin, margin, tilewidth - spacing, tileheight - spacing ]
15
+ end
16
+
17
+ def image_path
18
+ Metro::AssetPath.with(image).filepath
19
+ end
20
+
21
+ def images
22
+ @images ||= begin
23
+ original_images = Gosu::Image.load_tiles window, image_path, full_width,full_height, true
24
+ crop_images original_images
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def crop_images(images)
31
+ images
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'metro/version'
5
+
6
+ Struct.new("Changes",:date,:changes)
7
+
8
+ Gem::Specification.new do |gem|
9
+ gem.name = "metro-ld25"
10
+ gem.version = Metro::VERSION
11
+ gem.authors = ["Franklin Webber"]
12
+ gem.email = Metro::CONTACT_EMAILS
13
+ gem.license = "MIT"
14
+ gem.summary = <<-EOS
15
+ Metro is a 2D Gaming framework built around gosu (game development library).
16
+ Metro makes it easy to create games by enforcing common conceptual structures
17
+ and conventions.
18
+ EOS
19
+ gem.description = <<-EOS
20
+ Metro is a 2D Gaming framework built around gosu (game development library).
21
+ Metro makes it easy to create games by enforcing common conceptual structures
22
+ and conventions.
23
+ EOS
24
+
25
+ gem.homepage = Metro::WEBSITE
26
+
27
+ gem.add_dependency 'gosu', '~> 0.7'
28
+ gem.add_dependency 'thor', '~> 0.16.0'
29
+ gem.add_dependency 'i18n', '~> 0.6.1'
30
+ gem.add_dependency 'active_support', '~> 3.0.0'
31
+ gem.add_dependency 'listen', '~> 0.6.0'
32
+ gem.add_dependency 'tmxed', '~> 0.0.1'
33
+ gem.add_development_dependency 'rspec', '~> 2.11'
34
+
35
+ gem.files = `git ls-files`.split($/)
36
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
37
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
38
+ gem.require_paths = ["lib"]
39
+
40
+ changes = Metro.changes_for_version(::Metro::VERSION)
41
+
42
+ gem.post_install_message = <<-EOM
43
+ ______ ___ _____
44
+ ___ |/ /_____ __ /_______________
45
+ __ /|_/ / _ _ \\_ __/__ ___/_ __ \\
46
+ _ / / / / __// /_ _ / / /_/ /
47
+ /_/ /_/ \\___/ \\__/ /_/ \\____/
48
+
49
+ Thank you for installing metro #{::Metro::VERSION} / #{changes.date}.
50
+ ---------------------------------------------------------------------
51
+ Changes:
52
+ #{changes.changes.map{|change| " #{change}"}.join("")}
53
+ ---------------------------------------------------------------------
54
+ EOM
55
+
56
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Numeric do
4
+
5
+ before :each do
6
+ Numeric.tick_interval = 16.666666
7
+ end
8
+
9
+ describe "#tick(s)" do
10
+ context "when using an Integer" do
11
+ subject { 60 }
12
+ let(:expected_value) { 60 }
13
+
14
+ its(:tick) { should eq expected_value }
15
+ its(:ticks) { should eq expected_value }
16
+ end
17
+
18
+ context "when using a Float" do
19
+ subject { 70.1 }
20
+ let(:expected_value) { 70.1 }
21
+
22
+ its(:tick) { should eq expected_value }
23
+ its(:ticks) { should eq expected_value }
24
+ end
25
+ end
26
+
27
+ describe "#second(s)" do
28
+
29
+ context "when using an Integer" do
30
+ context "when the tick interval has not been set" do
31
+ subject { 2 }
32
+ let(:expected_value) { 120 }
33
+
34
+ its(:second) { should eq expected_value }
35
+ its(:seconds) { should eq expected_value }
36
+ its(:sec) { should eq expected_value }
37
+ its(:secs) { should eq expected_value }
38
+ end
39
+
40
+ context "when the tick interval has been set to 33.3333" do
41
+ before :each do
42
+ Numeric.tick_interval = 33.333333
43
+ end
44
+
45
+ subject { 2 }
46
+ let(:expected_value) { 60 }
47
+
48
+ its(:second) { should eq expected_value }
49
+ its(:seconds) { should eq expected_value }
50
+ end
51
+ end
52
+
53
+ context "when using a Float" do
54
+ context "when the tick interval has not been set" do
55
+ subject { 2.5 }
56
+ let(:expected_value) { 150 }
57
+
58
+ its(:second) { should eq expected_value }
59
+ its(:seconds) { should eq expected_value }
60
+ its(:sec) { should eq expected_value }
61
+ its(:secs) { should eq expected_value }
62
+ end
63
+
64
+ context "when the tick interval has been set" do
65
+ before :each do
66
+ Numeric.tick_interval = 33.333333
67
+ end
68
+
69
+ subject { 3.5 }
70
+ let(:expected_value) { 105 }
71
+
72
+ its(:second) { should eq expected_value }
73
+ its(:seconds) { should eq expected_value }
74
+ end
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+
5
+ describe "#underscore" do
6
+ context "when given a regular string" do
7
+ subject { "String" }
8
+ let(:expected_value) { "string" }
9
+
10
+ its(:underscore) { should eq expected_value }
11
+ end
12
+
13
+ context "when given an already snake cased string" do
14
+ subject { "underscored" }
15
+ let(:expected_value) { "underscored" }
16
+
17
+ its(:underscore) { should eq expected_value }
18
+ end
19
+
20
+ context "when given a camelCased string" do
21
+ subject { "SnakeCased" }
22
+ let(:expected_value) { "snake_cased" }
23
+
24
+ its(:underscore) { should eq expected_value }
25
+ end
26
+
27
+ context "when given a partial camel_Cased string" do
28
+ subject { "snake_Cased" }
29
+ let(:expected_value) { "snake_cased" }
30
+ its(:underscore) { should eq expected_value }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gosu::Color do
4
+
5
+ shared_examples "a correctly defined color" do
6
+
7
+ let(:expected_red_value) { expected_color_values[0] }
8
+ let(:expected_green_value) { expected_color_values[1] }
9
+ let(:expected_blue_value) { expected_color_values[2] }
10
+ let(:expected_alpha_value) { expected_color_values[3] }
11
+
12
+ it "should have the correct red color" do
13
+ subject.red.should eq expected_red_value
14
+ end
15
+
16
+ it "should have the correct green color" do
17
+ subject.green.should eq expected_green_value
18
+ end
19
+
20
+ it "should have the correct blue color" do
21
+ subject.blue.should eq expected_blue_value
22
+ end
23
+
24
+ it "should have the correct alpha value" do
25
+ subject.alpha.should eq expected_alpha_value
26
+ end
27
+ end
28
+
29
+ shared_examples "a color defined as white" do
30
+ let(:expected_color_values) { [ 255, 255, 255, 255 ] }
31
+ it_behaves_like "a correctly defined color"
32
+ end
33
+
34
+ describe "#initialize" do
35
+
36
+ context "when defined with an existing Gosu Color" do
37
+ subject { described_class.new color }
38
+ let(:color) { described_class.new 123, 123, 123, 0 }
39
+ let(:expected_color_values) { [ 123, 123, 0, 123 ] }
40
+ it_behaves_like "a correctly defined color"
41
+ end
42
+
43
+ context "when defined with a hexadecimal value" do
44
+ subject { described_class.new hex }
45
+ let(:hex) { 0xFF777777 }
46
+ let(:expected_color_values) { [ 119, 119, 119, 255 ] }
47
+ it_behaves_like "a correctly defined color"
48
+ end
49
+
50
+ context "when defined with a gosu color hex string" do
51
+ subject { described_class.new hex }
52
+ let(:hex) { "0xFF777777" }
53
+ let(:expected_color_values) { [ 119, 119, 119, 255 ] }
54
+ it_behaves_like "a correctly defined color"
55
+ end
56
+
57
+ context "when defined with a hex string" do
58
+ subject { described_class.new hex }
59
+ let(:hex) { "#777777" }
60
+ let(:expected_color_values) { [ 119, 119, 119, 255 ] }
61
+ it_behaves_like "a correctly defined color"
62
+ end
63
+
64
+ context "when defined with a rgb string" do
65
+ subject { described_class.new rgb }
66
+ let(:rgb) { "rgb(127,127,127)" }
67
+ let(:expected_color_values) { [ 127, 127, 127, 255 ] }
68
+ it_behaves_like "a correctly defined color"
69
+ end
70
+
71
+ context "when defined with a rgba color" do
72
+ subject { described_class.new rgba }
73
+ let(:rgba) { "rgba(127,127,127,0.5)" }
74
+ let(:expected_color_values) { [ 127, 127, 127, 127 ] }
75
+ it_behaves_like "a correctly defined color"
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metro::EventStateManager do
4
+
5
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metro::KeyValueCoding do
4
+
5
+ class KeyValueCodingObject
6
+ include Metro::KeyValueCoding
7
+ attr_accessor :description, :properties
8
+ end
9
+
10
+ subject do
11
+ object = KeyValueCodingObject.new
12
+
13
+ object.description = "Describe Yourself"
14
+ object.properties = { height: 100, width: 50 }
15
+
16
+ object
17
+ end
18
+
19
+ describe "#get" do
20
+ context "when given a key with a single attribute" do
21
+ let(:key) { :description }
22
+ let(:expected_value) { "Describe Yourself" }
23
+
24
+ it "should return the value" do
25
+ subject.get(key).should eq expected_value
26
+ end
27
+ end
28
+
29
+ context "when given a key with multiple attributes" do
30
+ let(:key) { "properties.keys" }
31
+ let(:expected_value) { [ :height, :width ] }
32
+
33
+ it "should return the expected value" do
34
+ subject.get(key).should eq expected_value
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "#set" do
40
+ context "when given a key with a single attribute" do
41
+ let(:key) { :description }
42
+ let(:expected_value) { "New Description" }
43
+
44
+ it "should set the value" do
45
+ subject.set(key,expected_value)
46
+ subject.get(key).should eq expected_value
47
+ end
48
+ end
49
+
50
+ context "when given a key with multiple attributes" do
51
+ let(:key) { "properties.default" }
52
+ let(:expected_value) { 0 }
53
+
54
+ it "should set the value" do
55
+ subject.set(key,expected_value)
56
+ subject.get(key).should eq expected_value
57
+ end
58
+ end
59
+ end
60
+
61
+ end