yeah 0.3.5 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17da100f4d2feff2cb2eefb5f5f779d56404f044
4
- data.tar.gz: ff877fec7e0cab390ebf0419e4aaf74dc93ae415
3
+ metadata.gz: 9358d3033c95b213ffc6f6b8e34880d247aa8a34
4
+ data.tar.gz: 636ce5c237cc12d40f0f1fc832e5433df6d92182
5
5
  SHA512:
6
- metadata.gz: 255e45b43495db3c4bf644a62b821bd7d8d34067f67f6be77f4bd19515d8b2813bd28e43d9612ae474bc3761f19c59286b7467f5095200e8debb7b844dcfb657
7
- data.tar.gz: 4ad59ff0f089d070c2975a384e81a2124fbd653fb4cdb15a7388cb413fec3590f9162cf33b0ff3272f248df7d4ae11bc36e44202e794f1b59424d8180c42377a
6
+ metadata.gz: 3115c006cadf70c7e3052cb4cb6937e17a3be3b0389791e61ec2103581d73a197fbc4dcfa1e1ebc34501b789ffa2af0914a2e88fc6363db4a45f3697d55a145d
7
+ data.tar.gz: 481caa7ec53564160a1ac3edb80f052a4a115c5b9ff2d83fd13071dbd4cda26bf629600dda30669ab227e824aa521c80e1060e422ad0d03928cf7a95994cdec0
@@ -1,3 +1,32 @@
1
+ 0.4.2 (2014-09-14)
2
+ ------------------
3
+ * Need sleep.
4
+
5
+ 0.4.1 (2014-09-14)
6
+ ------------------
7
+ * Fixed `yeah build`.
8
+
9
+ 0.4.0 (2014-09-14)
10
+ ------------------
11
+ * New `Font` class
12
+ * `Web` runner scales game display to use all available space
13
+ * New configuration system; title and factorial scaling configuration
14
+ * `Display` replaced `#font_family` & `#font_size` with `#text_font` & `#text_size`
15
+ * `Vector` added `#==`, `#add[!]`, `#subtract[!]`, `#multiply[!]`, `#divide[!]`
16
+ * `Vector#toward[!]` works in 3 dimensions
17
+ * `Display#rotate` takes `Vector` instead of `Numeric`
18
+ * `Display#[translate|scale|rotate]_[x|y|z]` added
19
+ * `Display` added `#stroke_curve` and `#stroke_curve2`
20
+ * `Display#transformation` removed
21
+ * `Game::config` removed
22
+ * `yeah build` builds to `builds`
23
+ * Secure Rubygems for Gemfile in game projects (thanks cokernel)
24
+ * Tests made platform-agnostic
25
+ * Interface tests for most classes, some `Display` draw tests, some `Color` initialization tests
26
+ * Benchmarks made more consistent
27
+ * Various bug fixes
28
+ * Documentation cleanup
29
+
1
30
  0.3.5 (2014-08-24)
2
31
  ------------------
3
32
  * Updated project structure; new entrypoint is `code/game.rb`
data/README.md CHANGED
@@ -16,16 +16,15 @@ Practical Ruby video game framework, alpha stage
16
16
 
17
17
  ## Examples
18
18
 
19
- [Code for all examples](https://github.com/yeahrb/examples)
19
+ [Code for all examples][Example code]
20
20
 
21
- [![Asteroids](https://cdn.mediacru.sh/IkYZP46TmCsd.png)](https://yeahrb.github.io/examples/asteroids/runner.html)
21
+ [![Asteroids](https://cdn.mediacru.sh/IkYZP46TmCsd.png)][Asteroids example]
22
22
 
23
- [*Asteroids*](https://yeahrb.github.io/examples/asteroids/runner.html)
23
+ [*Asteroids*][Asteroids example]
24
24
 
25
- [![Random](https://cdn.mediacru.sh/KW9M6TndLry0.png)](https://yeahrb.github.io/examples/random/runner.html)
26
-
27
- [*Random*](https://yeahrb.github.io/examples/random/runner.html)
25
+ [![Random](https://cdn.mediacru.sh/KW9M6TndLry0.png)][Random example]
28
26
 
27
+ [*Random*][Random example]
29
28
 
30
29
  ## Usage
31
30
 
@@ -40,17 +39,26 @@ NOTE: This is alpha-stage software, expect changes!
40
39
  ### Making a game
41
40
 
42
41
  1. In a command line, enter `yeah new` to generate a new game project.
43
- 2. Change into the new `game` directory, then enter `bundle install`.
44
- 3. Add game code to `code/game.rb`. No tutorials yet; please take a look at the [example code](https://github.com/yeahrb/examples) and [API reference](http://rdoc.info/github/yeahrb/yeah/85e75c5/frames).
42
+ 2. Change into the new project directory, then enter `bundle install`.
43
+ 3. Add game code to `code/game.rb`. No tutorials yet; please take a look at the [example code][Example code] and [API reference][0.4.2 API].
45
44
  4. Enter `yeah serve` and visit [http://localhost:1234](http://localhost:1234) to try the game.
46
45
 
47
46
 
48
47
  ## Links
49
48
 
50
- [0.3.4 API reference](http://rdoc.info/github/yeahrb/yeah/85e75c5/frames)
49
+ API reference: [0.4.2][0.4.2 API], [0.3.5][0.3.5 API]
50
+
51
+ [Version upgrade notes](https://github.com/yeahrb/yeah/blob/master/UPGRADING.md)
51
52
 
52
53
  [Issue & feature tracker](https://github.com/yeahrb/yeah/issues)
53
54
 
54
55
  [Discussion via Gitter](https://gitter.im/yeahrb/yeah)
55
56
 
56
57
  [Author's email](mailto:skoofoo@gmail.com)
58
+
59
+
60
+ [0.4.2 API]: http://rdoc.info/github/yeahrb/yeah/32a50f5/frames
61
+ [0.3.5 API]: http://rdoc.info/github/yeahrb/yeah/5efbbc9/frames
62
+ [Example code]: https://github.com/yeahrb/examples
63
+ [Asteroids example]: https://yeahrb.github.io/examples/asteroids/runner.html
64
+ [Random example]: https://yeahrb.github.io/examples/random/runner.html
@@ -0,0 +1,9 @@
1
+ module Yeah
2
+ # @!method self.configure
3
+ # @abstract Provided by a `Platform`.
4
+ # @yield [config] configuration block
5
+ # @yieldparam [Struct] configuration
6
+ # @note Configuration struct attributes: `title` (String),
7
+ # `factorial_scaling` (Boolean)
8
+ # @return [nil]
9
+ end
@@ -7,22 +7,22 @@ class Display
7
7
  # @param [Hash] options for new object
8
8
  # @option options [Vector] :size (V[1280, 720]) of display
9
9
  # @option options [String] :canvas_selector ('canvas') for canvas HTML
10
- # element (applicable only to `Web::Display`)
10
+ # element (applies only to `Web::Display`)
11
11
  def initialize(options = {})
12
12
  raise NotImplementedError
13
13
  end
14
14
 
15
15
  # @!attribute size
16
- # @param [Vector] size to make display
17
- # @return [Vector] size of display
16
+ # @param [Vector] size to make display in pixels
17
+ # @return [Vector] size of display in pixels
18
18
 
19
19
  # @!attribute width
20
- # @param [Vector] width to make display
21
- # @return [Vector] width of display
20
+ # @param [Integer] width to make display in pixels
21
+ # @return [Integer] width of display in pixels
22
22
 
23
23
  # @!attribute height
24
- # @param [Vector] height to make display
25
- # @return [Vector] height of display
24
+ # @param [Integer] height to make display in pixels
25
+ # @return [Integer] height of display in pixels
26
26
 
27
27
  # @!attribute fill_color
28
28
  # @param [Color] color for fill
@@ -33,78 +33,146 @@ class Display
33
33
  # @return [Color] color for stroke
34
34
 
35
35
  # @!attribute stroke_width
36
- # @param [Numeric] width for stroke
37
- # @return [Numeric] width for stroke
36
+ # @param [Numeric] width for stroke in pixels
37
+ # @return [Numeric] width for stroke in pixels
38
38
 
39
- # @!attribute font_family
40
- # @param [String] font family for text
41
- # @return [String] font family for text
39
+ # @!attribute text_font
40
+ # @param [Font] font for text
41
+ # @return [Font] font for text
42
42
 
43
- # @!attribute font_size
44
- # @param [String] font size for text
45
- # @return [String] font size for text
43
+ # @!attribute text_size
44
+ # @param [Integer] size for text in pixels
45
+ # @return [Integer] size for text in pixels
46
46
 
47
47
  # @!method color_at(position)
48
48
  # @param [Vector] position of pixel from which to get color
49
49
  # @return [Color] color of pixel
50
50
 
51
- # @!attribute [r] transformation
52
- # @return [Array] transformation matrix
53
-
54
51
  # @!method translate(displacement)
55
- # @param [Vector] displacement in 2D
52
+ # @param [Vector] displacement
53
+ # @return [nil]
54
+ # @note `Web::Display#translate` is currently 2D (only X and Y apply).
55
+ # Move the transformation by a vector displacement.
56
+
57
+ # @!method translate_x(displacement)
58
+ # @param [Numeric] displacement
59
+ # @return [nil]
60
+ # Move the transformation by a displacement on the X axis.
61
+
62
+ # @!method translate_y(displacement)
63
+ # @param [Numeric] displacement
64
+ # @return [nil]
65
+ # Move the transformation by a displacement on the Y axis.
66
+
67
+ # @!method translate_z(displacement)
68
+ # @param [Numeric] displacement
56
69
  # @return [nil]
57
- # @todo Make this work in 3D.
58
- # Move the transformation by a 2D displacement.
70
+ # @note No-op in `Web::Display`, which is currently 2D.
71
+ # Move the transformation by a displacement on the Z axis.
59
72
 
60
73
  # @!method scale(multiplier)
61
- # @param [Vector] multiplier in 2D
74
+ # @param [Vector] multiplier
62
75
  # @return [nil]
63
- # @todo Make this work in 3D.
64
- # Scale the transformation by a 2D multiplier.
76
+ # @note `Web::Display#scale` is currently 2D (only X and Y apply).
77
+ # Scale the transformation by a vector multiplier.
78
+
79
+ # @!method scale_x(multiplier)
80
+ # @param [Numeric] multiplier
81
+ # @return [nil]
82
+ # Scale the transformation by a multiplier on the X axis.
83
+
84
+ # @!method scale_y(multiplier)
85
+ # @param [Numeric] multiplier
86
+ # @return [nil]
87
+ # Scale the transformation by a multiplier on the Y axis.
88
+
89
+ # @!method scale_z(multiplier)
90
+ # @param [Numeric] multiplier
91
+ # @return [nil]
92
+ # @note No-op in `Web::Display`, which is currently 2D.
93
+ # Scale the transformation by a multiplier on the Z axis.
65
94
 
66
95
  # @!method rotate(radians)
67
- # @param [Numeric] radians in 2D
96
+ # @param [Vector] radians
97
+ # @return [nil]
98
+ # @note `Web::Display#rotate` is currently 2D (only Z applies).
99
+ # Rotate the transformation by vector radians.
100
+
101
+ # @!method rotate_x(radians)
102
+ # @param [Numeric] radians
103
+ # @return [nil]
104
+ # @note No-op in `Web::Display`, which is currently 2D.
105
+ # Rotate the transformation by radians on the X axis.
106
+
107
+ # @!method rotate_y(radians)
108
+ # @param [Numeric] radians
68
109
  # @return [nil]
69
- # @todo Make this work in 3D.
70
- # Rotate the transformation by radians.
110
+ # @note No-op in `Web::Display`, which is currently 2D.
111
+ # Rotate the transformation by radians on the Y axis.
112
+
113
+ # @!method rotate_z(radians)
114
+ # @param [Numeric] radians
115
+ # @return [nil]
116
+ # Rotate the transformation by radians on the Z axis.
71
117
 
72
118
  # @!method push
73
119
  # @return [nil]
74
- # Push transformation to the transformation stack.
120
+ # Push current transformation to the transformation stack.
75
121
 
76
122
  # @!method pop
77
123
  # @return [nil]
78
- # Pop a transformation off the transformation stack.
124
+ # Pop a transformation off the transformation stack and use it.
79
125
 
80
126
  # @!method stroke_line(start_pos, end_pos)
81
- # @param [Vector] start position in 2D
82
- # @param [Vector] end position in 2D
127
+ # @param [Vector] start position
128
+ # @param [Vector] end position
83
129
  # @return [nil]
130
+ # @note `Web::Display#stroke_line` is currently 2D (only X and Y apply).
84
131
  # Stroke a line between two positions.
85
132
 
133
+ # @!method stroke_curve(start_pos, end_pos, control)
134
+ # @param [Vector] start position
135
+ # @param [Vector] end position
136
+ # @param [Vector] control point position
137
+ # @return [nil]
138
+ # @note `Web::Display#stroke_curve` is currently 2D (only X and Y apply).
139
+ # Stroke curve with a control point between two positions.
140
+
141
+ # @!method stroke_curve2(start_pos, end_pos, control1, control2)
142
+ # @param [Vector] start position
143
+ # @param [Vector] end position
144
+ # @param [Vector] first control point position
145
+ # @param [Vector] second control point position
146
+ # @return [nil]
147
+ # @note `Web::Display#stroke_curve2` is currently 2D (only X and Y apply).
148
+ # Stroke curve with 2 control points between two positions.
149
+
86
150
  # @!method stroke_rectangle(position, size)
87
- # @param [Vector] position in 2D
88
- # @param [Vector] size in 2D
151
+ # @param [Vector] position
152
+ # @param [Vector] size
89
153
  # @return [nil]
154
+ # @note `Web::Display#stroke_rectangle` is currently 2D (only X and Y apply).
90
155
  # Stroke a rectangle at a position and size.
91
156
 
92
157
  # @!method fill_rectangle(position, size)
93
- # @param [Vector] position in 2D
94
- # @param [Vector] size in 2D
158
+ # @param [Vector] position
159
+ # @param [Vector] size
95
160
  # @return [nil]
161
+ # @note `Web::Display#fill_rectangle` is currently 2D (only X and Y apply).
96
162
  # Fill a rectangle at a position and size.
97
163
 
98
164
  # @!method stroke_ellipse(center, radius)
99
- # @param [Vector] center position in 2D
100
- # @param [Vector] radius in 2D
165
+ # @param [Vector] center position
166
+ # @param [Vector] radius in pixels in 2D
101
167
  # @return [nil]
168
+ # @note `Web::Display#stroke_ellipse` is currently 2D (only X and Y apply).
102
169
  # Stroke an ellipse at a center position and 2D radius.
103
170
 
104
171
  # @!method fill_ellipse(center, radius)
105
- # @param [Vector] center position in 2D
106
- # @param [Vector] radius in 2D
172
+ # @param [Vector] center position
173
+ # @param [Vector] radius in pixels in 2D
107
174
  # @return [nil]
175
+ # @note `Web::Display#fill_ellipse` is currently 2D (only X and Y apply).
108
176
  # Fill an ellipse at a center position and 2D radius.
109
177
 
110
178
  # @!method clear
@@ -127,20 +195,20 @@ class Display
127
195
  # @!method line_to(position)
128
196
  # @param [Vector] position
129
197
  # @return [nil]
130
- # Draw line to position as part of shape.
198
+ # Trace line to position as part of shape.
131
199
 
132
200
  # @!method curve_to(position, control)
133
201
  # @param [Vector] position
134
202
  # @param [Vector] control point position
135
203
  # @return [nil]
136
- # Draw curve with a control point to position as part of shape.
204
+ # Trace curve with a control point to position as part of shape.
137
205
 
138
206
  # @!method curve2_to(position, control1, control2)
139
207
  # @param [Vector] position
140
208
  # @param [Vector] first control point position
141
209
  # @param [Vector] second control point position
142
210
  # @return [nil]
143
- # Draw curve with 2 control points to position as part of shape.
211
+ # Trace curve with 2 control points to position as part of shape.
144
212
 
145
213
  # @!method stroke_shape
146
214
  # @return [nil]
@@ -155,13 +223,13 @@ class Display
155
223
  # @param [Vector] position
156
224
  # @return [nil]
157
225
  # @example Draw a duck within a game
158
- # display.image Image['images/duck.png'], V[80, 80]
226
+ # display.image(Image['images/duck.png'], V[80, 80])
159
227
  # Draw an image at a position.
160
228
 
161
229
  # @!method image_cropped(image, position, crop_position, crop_size)
162
230
  # @param [Image] image to draw
163
231
  # @param [Vector] position
164
- # @param [Vector] start point of crop
232
+ # @param [Vector] start position of crop
165
233
  # @param [Vector] size of crop
166
234
  # @return [nil]
167
235
  # Draw a cropped image at a position.
@@ -0,0 +1,10 @@
1
+ module Yeah
2
+
3
+ # A `Font` is an asset that is used to set `Display#text_font` in order to be
4
+ # drawn using `Display#fill_text` and `Display#stroke_text`.
5
+ # @abstract Provided by a `Platform`.
6
+ # @see Yeah::Display#text_font
7
+ class Font < Asset
8
+ end
9
+
10
+ end
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'yeah', '~> 0.3.5'
4
- gem 'opal', github: 'opal/opal', ref: '7e843b0'
3
+ gem 'yeah', '~> 0.4.2'
4
+ gem 'opal', github: 'opal/opal', ref: '78b4fb9'
@@ -0,0 +1,4 @@
1
+ Yeah.configure do |c|
2
+ c.title = "Game"
3
+ c.factorial_scaling = false
4
+ end
@@ -1,6 +1,5 @@
1
1
  module Yeah
2
2
  DEFAULT_DISPLAY_SIZE = V[1280, 720]
3
- DEFAULT_DISPLAY_FONT_FAMILY = 'DejaVu Serif'
4
- DEFAULT_DISPLAY_FONT_SIZE = 36
3
+ DEFAULT_DISPLAY_TEXT_SIZE = 36
5
4
  DEFAULT_TICKER_RATE = 60
6
5
  end
@@ -9,21 +9,6 @@ module Yeah
9
9
  # @abstract Subclass this to make a game.
10
10
  class Game
11
11
  class << self
12
- # @param [Hash] configuration used for new game instances
13
- # @option configuration [Hash] :ticker options
14
- # @option configuration [Hash] :display options
15
- # @option configuration [Hash] :keyboard options
16
- # @option configuration [Hash] :mouse options
17
- # @return [Hash] configuration for new game instances
18
- def config
19
- @config ||= {
20
- ticker: {},
21
- display: {},
22
- keyboard: {},
23
- mouse: {}
24
- }
25
- end
26
-
27
12
  # @return [Game] default subclass (i.e. project game)
28
13
  def default
29
14
  subclasses.last
@@ -84,18 +69,14 @@ class Game
84
69
 
85
70
  private
86
71
 
87
- def config
88
- self.class.config
89
- end
90
-
91
72
  def defaults
92
- ticker = Ticker.new(config[:ticker])
73
+ ticker = Ticker.new
93
74
 
94
75
  {
95
76
  ticker: ticker,
96
- display: Display.new(config[:display]),
97
- keyboard: Keyboard.new({ ticker: ticker }.merge(config[:keyboard])),
98
- mouse: Mouse.new({ ticker: ticker }.merge(config[:mouse]))
77
+ display: Display.new,
78
+ keyboard: Keyboard.new(ticker: ticker),
79
+ mouse: Mouse.new(ticker: ticker)
99
80
  }
100
81
  end
101
82
  end
@@ -74,6 +74,12 @@ class Vector
74
74
 
75
75
  alias :unit :normalize
76
76
 
77
+ # @param [Vector] vector to equate
78
+ # @return [Boolean] whether self equals vector
79
+ def ==(other)
80
+ @components == other.components
81
+ end
82
+
77
83
  # @param [Vector] vector to add
78
84
  # @return [Vector] vector sum
79
85
  def +(vector)
@@ -106,11 +112,56 @@ class Vector
106
112
  @components[2] / numeric)
107
113
  end
108
114
 
109
- # @return [Vector] identical vector
110
- def +@
111
- self.class.new(*@components)
115
+ alias :add :+
116
+
117
+ alias :subtract :-
118
+
119
+ alias :multiply :*
120
+
121
+ alias :divide :/
122
+
123
+ # @param (see #add)
124
+ # @return [Vector] self after adding vector
125
+ def add!(vector)
126
+ @components[0] += vector.components[0]
127
+ @components[1] += vector.components[1]
128
+ @components[2] += vector.components[2]
129
+
130
+ self
112
131
  end
113
132
 
133
+ # @param (see #subtract)
134
+ # @return [Vector] self after subtracting vector
135
+ def subtract!(vector)
136
+ @components[0] -= vector.components[0]
137
+ @components[1] -= vector.components[1]
138
+ @components[2] -= vector.components[2]
139
+
140
+ self
141
+ end
142
+
143
+ # @param (see #multiply)
144
+ # @return [Vector] self after multiplying by numeric
145
+ def multiply!(numeric)
146
+ @components[0] *= numeric
147
+ @components[1] *= numeric
148
+ @components[2] *= numeric
149
+
150
+ self
151
+ end
152
+
153
+ # @param (see #divide)
154
+ # @return [Vector] self after dividing by numeric
155
+ def divide!(numeric)
156
+ @components[0] /= numeric
157
+ @components[1] /= numeric
158
+ @components[2] /= numeric
159
+
160
+ self
161
+ end
162
+
163
+ alias :+@ :dup
164
+
114
165
  # @return [Vector] negative vector
115
166
  def -@
116
167
  self.class.new(-@components[0],
@@ -138,7 +189,8 @@ class Vector
138
189
  # @return [Vector] position moved along an angle for a distance in 2D
139
190
  def along(angle, distance)
140
191
  self.class.new(@components[0] + Math.cos(angle) * distance,
141
- @components[1] + Math.sin(angle) * distance)
192
+ @components[1] + Math.sin(angle) * distance,
193
+ @components[2])
142
194
  end
143
195
 
144
196
  # @param (see #along)
@@ -152,18 +204,15 @@ class Vector
152
204
 
153
205
  # @param [Vector] position to move to
154
206
  # @param [Vector] distance to move
155
- # @return [Vector] position moved toward other position for a distance in 2D
156
- # @todo Make work in 3D.
207
+ # @return [Vector] position moved toward other position for a distance
157
208
  def toward(position, distance)
158
- along angle_to(position), amount
209
+ self + (position - self).unit * distance
159
210
  end
160
211
 
161
212
  # @param (see #toward)
162
- # @return [Vector] self after moving toward other position for a distance in
163
- # 2D
164
- # @todo Make work in 3D.
165
- def toward!(position, amount)
166
- along! angle_to(position), amount
213
+ # @return [Vector] self after moving toward other position for a distance
214
+ def toward!(position, distance)
215
+ self.add! (position - self).unit * distance
167
216
  end
168
217
  end
169
218
  end
@@ -1,3 +1,3 @@
1
1
  module Yeah
2
- VERSION = '0.3.5'
2
+ VERSION = '0.4.2'
3
3
  end
@@ -18,14 +18,14 @@ class Builder
18
18
  setup_compiler
19
19
  compile
20
20
 
21
- puts "Built game package to `build/web/`."
21
+ puts "Built game package to `builds/web`."
22
22
  end
23
23
 
24
24
  private
25
25
 
26
26
  def make_build_dirs
27
27
  # Make build directories.
28
- FileUtils.mkpath 'build/web/assets/yeah/web'
28
+ FileUtils.mkpath 'builds/web/assets/yeah/web'
29
29
  end
30
30
 
31
31
  def setup_compiler
@@ -46,7 +46,7 @@ class Builder
46
46
  def compile
47
47
  runner_path = Pathname.new(__FILE__).join('..', 'runner.html.erb')
48
48
  html = ERB.new(File.read(runner_path)).result(binding)
49
- File.write('build/web/runner.html', html)
49
+ File.write('builds/web/runner.html', html)
50
50
  end
51
51
 
52
52
  def asset_include_tags
@@ -58,6 +58,10 @@ class Builder
58
58
  case path
59
59
  when /\.(ogg|wav|mp3)$/
60
60
  "<audio src=\"./#{path}\"></audio>"
61
+ when /\.(otf|ttf|woff)$/
62
+ "<style>" +
63
+ "@font-face { font-family: \"#{path[7..-1]}\"; src: url(#{path}) }" +
64
+ "</style>"
61
65
  else
62
66
  "<img src=\"./#{path}\" />"
63
67
  end
@@ -81,7 +85,7 @@ class Builder
81
85
  end
82
86
 
83
87
  def build_path
84
- @build_path ||= Pathname.new("build/web")
88
+ @build_path ||= Pathname.new("builds/web")
85
89
  end
86
90
 
87
91
  def gem_path
@@ -1,49 +1,62 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>Game</title>
4
+ <title>Game</title>
5
5
 
6
6
  <style>
7
+ html, body {
8
+ overflow: hidden;
9
+ height: 100%;
10
+ margin: 0;
11
+ }
12
+
7
13
  body {
8
14
  background: black;
9
- margin: 0;
10
15
  }
11
16
 
12
17
  .center-content {
13
- /* Internet Explorer 10 */
14
18
  display: -ms-flexbox;
15
19
  -ms-flex-pack: center;
16
20
  -ms-flex-align: center;
17
- /* Firefox */
18
21
  display: -moz-box;
19
22
  -moz-box-pack: center;
20
23
  -moz-box-align: center;
21
- /* Safari, Opera, and Chrome */
22
24
  display: -webkit-box;
23
25
  -webkit-box-pack: center;
24
26
  -webkit-box-align: center;
25
- /* W3C */
26
27
  display: box;
27
28
  box-pack: center;
28
29
  box-align: center;
29
30
  }
30
31
 
31
- html, body{
32
- width: 100%;
33
- height: 100%;
34
- }
35
-
36
- canvas {
37
- max-width: 100%;
38
- max-height: 100%;
39
- }
40
-
41
32
  .hidden {
42
33
  display: none;
43
34
  }
44
35
  </style>
36
+
37
+ <script>
38
+ function scaleDisplay() {
39
+ var canvas = document.getElementsByTagName('canvas')[0],
40
+
41
+ width_scale = window.innerWidth / canvas.width,
42
+ height_scale = window.innerHeight / canvas.height,
43
+
44
+ scale = Math.min(width_scale, height_scale);
45
+
46
+ if (FACTORIAL_SCALING && scale >= 1) {
47
+ scale = Math.floor(scale);
48
+ }
49
+
50
+ var width = canvas.width * scale,
51
+ height = canvas.height * scale,
52
+
53
+ sizeStyle = "width:"+width+"px; height:"+height+"px";
54
+
55
+ canvas.setAttribute('style', sizeStyle);
56
+ }
57
+ </script>
45
58
  </head>
46
- <body class="center-content">
59
+ <body class="center-content" onresize="scaleDisplay()">
47
60
  <canvas></canvas>
48
61
 
49
62
  <div class="hidden">
@@ -54,8 +67,11 @@
54
67
  <%= script_include_tag 'yeah/web' %>
55
68
  <%= script_include_tag 'yeah/web/setup' %>
56
69
 
70
+ <%= script_include_tag 'config' %>
57
71
  <%= script_include_tag 'game' %>
58
72
 
59
73
  <%= script_include_tag 'yeah/web/start' %>
74
+
75
+ <script>scaleDisplay()</script>
60
76
  </body>
61
77
  </html>
@@ -69,6 +69,10 @@ class Server
69
69
  case path
70
70
  when /\.(ogg|wav|mp3)$/
71
71
  "<audio src=\"/#{path}\"></audio>"
72
+ when /\.(otf|ttf|woff)$/
73
+ "<style>" +
74
+ "@font-face { font-family: \"#{path[7..-1]}\"; src: url(#{path}) }" +
75
+ "</style>"
72
76
  else
73
77
  "<img src=\"/#{path}\" />"
74
78
  end
@@ -1,5 +1,6 @@
1
1
  module Yeah
2
2
  include Web
3
+ extend Web::ClassMethods
3
4
  end
4
5
 
5
6
  include Yeah
@@ -1,7 +1,11 @@
1
+ require 'math'
2
+
1
3
  require 'yeah/web/constants'
4
+ require 'yeah/web/class_methods'
2
5
  require 'yeah/web/asset'
3
6
  require 'yeah/web/image'
4
7
  require 'yeah/web/sound'
8
+ require 'yeah/web/font'
5
9
  require 'yeah/web/display'
6
10
  require 'yeah/web/keyboard'
7
11
  require 'yeah/web/mouse'
@@ -0,0 +1,14 @@
1
+ module Yeah
2
+ module Web
3
+ module ClassMethods
4
+ def configure(&block)
5
+ config = Struct.new(:title, :factorial_scaling).new
6
+
7
+ yield config
8
+
9
+ `window.document.title = #{config.title}` unless config.title.nil?
10
+ `FACTORIAL_SCALING = #{config.factorial_scaling}`
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,7 @@
1
1
  module Yeah
2
2
  module Web
3
3
  class Display
4
- attr_reader :font_family, :font_size
4
+ attr_reader :text_font, :text_size
5
5
 
6
6
  def initialize(options = {})
7
7
  canvas_selector = options.fetch(:canvas_selector, DEFAULT_CANVAS_SELECTOR)
@@ -9,8 +9,8 @@ class Display
9
9
  @canvas = `document.querySelectorAll(#{canvas_selector})[0]`
10
10
  @context = `#@canvas.getContext('2d')`
11
11
  self.size = options.fetch(:size, DEFAULT_DISPLAY_SIZE)
12
- self.font_family = DEFAULT_DISPLAY_FONT_FAMILY
13
- self.font_size = DEFAULT_DISPLAY_FONT_SIZE
12
+ self.text_font = Font['']
13
+ self.text_size = DEFAULT_DISPLAY_TEXT_SIZE
14
14
  @transform = [1, 0, 0, 1, 0, 0]
15
15
  @transforms = []
16
16
  end
@@ -27,14 +27,14 @@ class Display
27
27
  `#@canvas.width`
28
28
  end
29
29
  def width=(value)
30
- `#@canvas.width = #{value.x}`
30
+ `#@canvas.width = #{value}`
31
31
  end
32
32
 
33
33
  def height
34
34
  `#@canvas.height`
35
35
  end
36
36
  def height=(value)
37
- `#@canvas.height = #{value.x}`
37
+ `#@canvas.height = #{value}`
38
38
  end
39
39
 
40
40
  def fill_color
@@ -58,17 +58,17 @@ class Display
58
58
  `#@context.lineWidth = #{numeric}`
59
59
  end
60
60
 
61
- def font_family=(type)
62
- @font_family= type
61
+ def text_font=(font)
62
+ @text_font = font
63
63
 
64
- font = "#{@font_size}px #{@font_family}"
64
+ font = "#{@text_size}px \"#{@text_font.path}\""
65
65
  `#@context.font = #{font}`
66
66
  end
67
67
 
68
- def font_size=(size)
69
- @font_size = size
68
+ def text_size=(size)
69
+ @text_size = size
70
70
 
71
- font = "#{@font_size}px #{@font_family}"
71
+ font = "#{@text_size}px \"#{@text_font.path}\""
72
72
  `#@context.font = #{font}`
73
73
  end
74
74
 
@@ -77,10 +77,6 @@ class Display
77
77
  C[`data[0]`, `data[1]`, `data[2]`]
78
78
  end
79
79
 
80
- def transformation
81
- @transform + [0, 0, 1] # appendage to fulfill signature
82
- end
83
-
84
80
  def translate(displacement)
85
81
  @transform[4] += `#{@transform[0]} * #{displacement.x} +
86
82
  #{@transform[2]} * #{displacement.y}`
@@ -93,6 +89,29 @@ class Display
93
89
  #{@transform[4]}, #{@transform[5]}); }
94
90
  end
95
91
 
92
+ def translate_x(displacement)
93
+ @transform[4] += `#{@transform[0]} * #{displacement} + #{@transform[2]}`
94
+ @transform[5] += `#{@transform[1]} * #{displacement} + #{@transform[3]}`
95
+
96
+ %x{
97
+ #@context.setTransform(#{@transform[0]}, #{@transform[1]},
98
+ #{@transform[2]}, #{@transform[3]},
99
+ #{@transform[4]}, #{@transform[5]}); }
100
+ end
101
+
102
+ def translate_y(displacement)
103
+ @transform[4] += `#{@transform[0]} + #{@transform[2]} * #{displacement}`
104
+ @transform[5] += `#{@transform[1]} + #{@transform[3]} * #{displacement}`
105
+
106
+ %x{
107
+ #@context.setTransform(#{@transform[0]}, #{@transform[1]},
108
+ #{@transform[2]}, #{@transform[3]},
109
+ #{@transform[4]}, #{@transform[5]}); }
110
+ end
111
+
112
+ def translate_z(displacement)
113
+ end
114
+
96
115
  def scale(multiplier)
97
116
  %x{
98
117
  #{@transform} = [#{@transform[0]} * #{multiplier.x},
@@ -106,7 +125,44 @@ class Display
106
125
  #{@transform[4]}, #{@transform[5]}); }
107
126
  end
108
127
 
128
+ def scale_x(multiplier)
129
+ %x{
130
+ #{@transform} = [#{@transform[0]} * #{multiplier},
131
+ #{@transform[1]} * #{multiplier},
132
+ #{@transform[2]}, #{@transform[3]},
133
+ #{@transform[4]}, #{@transform[5]}];
134
+
135
+ #@context.setTransform(#{@transform[0]}, #{@transform[1]},
136
+ #{@transform[2]}, #{@transform[3]},
137
+ #{@transform[4]}, #{@transform[5]}); }
138
+ end
139
+
140
+ def scale_y(multiplier)
141
+ %x{
142
+ #{@transform} = [#{@transform[0]}, #{@transform[1]},
143
+ #{@transform[2]} * #{multiplier},
144
+ #{@transform[3]} * #{multiplier},
145
+ #{@transform[4]}, #{@transform[5]}];
146
+
147
+ #@context.setTransform(#{@transform[0]}, #{@transform[1]},
148
+ #{@transform[2]}, #{@transform[3]},
149
+ #{@transform[4]}, #{@transform[5]}); }
150
+ end
151
+
152
+ def scale_z(multiplier)
153
+ end
154
+
109
155
  def rotate(radians)
156
+ rotate_z(radians.z)
157
+ end
158
+
159
+ def rotate_x(radians)
160
+ end
161
+
162
+ def rotate_y(radians)
163
+ end
164
+
165
+ def rotate_z(radians)
110
166
  %x{
111
167
  var cos = Math.cos(#{radians}),
112
168
  sin = Math.sin(#{radians}),
@@ -145,6 +201,29 @@ class Display
145
201
  }
146
202
  end
147
203
 
204
+ def stroke_curve(start_pos, end_pos, control)
205
+ %x{
206
+ #@context.beginPath();
207
+ #@context.moveTo(#{start_pos.x}, #{start_pos.y});
208
+ #@context.quadraticCurveTo(#{control.x}, #{control.y},
209
+ #{end_pos.x}, #{end_pos.y});
210
+ #@context.closePath();
211
+ #@context.stroke();
212
+ }
213
+ end
214
+
215
+ def stroke_curve2(start_pos, end_pos, control1, control2)
216
+ %x{
217
+ #@context.beginPath();
218
+ #@context.moveTo(#{start_pos.x}, #{start_pos.y});
219
+ #@context.bezierCurveTo(#{control1.x}, #{control1.y},
220
+ #{control2.x}, #{control2.y},
221
+ #{end_pos.x}, #{end_pos.y});
222
+ #@context.closePath();
223
+ #@context.stroke();
224
+ }
225
+ end
226
+
148
227
  def stroke_rectangle(position, size)
149
228
  `#@context.strokeRect(#{position.x}, #{position.y}, #{size.x}, #{size.y})`
150
229
  end
@@ -0,0 +1,6 @@
1
+ module Yeah
2
+ module Web
3
+ class Font < Asset
4
+ end
5
+ end
6
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yeah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Ostrega
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-24 00:00:00.000000000 Z
11
+ date: 2014-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 0.0.3
47
+ version: 0.0.4
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.0.3
54
+ version: 0.0.4
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: yard
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,13 +94,16 @@ files:
94
94
  - bin/yeah
95
95
  - lib/yeah.rb
96
96
  - lib/yeah/_platform/asset.rb
97
+ - lib/yeah/_platform/class_methods.rb
97
98
  - lib/yeah/_platform/display.rb
99
+ - lib/yeah/_platform/font.rb
98
100
  - lib/yeah/_platform/image.rb
99
101
  - lib/yeah/_platform/keyboard.rb
100
102
  - lib/yeah/_platform/mouse.rb
101
103
  - lib/yeah/_platform/sound.rb
102
104
  - lib/yeah/_platform/ticker.rb
103
105
  - lib/yeah/_template/Gemfile
106
+ - lib/yeah/_template/code/config.rb
104
107
  - lib/yeah/_template/code/game.rb
105
108
  - lib/yeah/_web.rb
106
109
  - lib/yeah/color.rb
@@ -116,8 +119,10 @@ files:
116
119
  - lib/yeah/web/start.rb
117
120
  - opal/yeah/web.rb
118
121
  - opal/yeah/web/asset.opal
122
+ - opal/yeah/web/class_methods.opal
119
123
  - opal/yeah/web/constants.opal
120
124
  - opal/yeah/web/display.opal
125
+ - opal/yeah/web/font.opal
121
126
  - opal/yeah/web/image.opal
122
127
  - opal/yeah/web/keyboard.opal
123
128
  - opal/yeah/web/mouse.opal