gosu_wrapper 0.0.2 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 917ff2ab23c3b32591b9ca6e6cb81b60e88aaf13
4
- data.tar.gz: 96a2c3dd86049eef3b8b00c2d620e9d435154d75
3
+ metadata.gz: 4714b462fb1c471cf994ff6dc847b3e7b1685b44
4
+ data.tar.gz: 06dbe58ba8eb7d0a895a05e2f33927f5fc37a6b1
5
5
  SHA512:
6
- metadata.gz: 64d1346282045251db6f4de0300f6701087643d85e9a9bf875c415b77c77f34960b8b75f61c3cd8f4040bf08ce3054781b8d6ac38a1eced95657b4c3de26d835
7
- data.tar.gz: d67cc8edbee1b432e7a61682f85dec118fc20193919a6f9cdf55cb9503ceb3b471f1fea5f6f9f1cad08d74bc4ba87beeb53caa97d48a9e094f7ff390dcd80c92
6
+ metadata.gz: ed5952d37fd52deff3aa3136469684b71b2737e61c1976a29d7105b6c79192ecc946fd93754dfa0ab16f1fb8b5fad43010a57e27f4289c225aec24ee8563c3f9
7
+ data.tar.gz: 8e1744ea198b03d390025a3970551903e5b80ddbcc15ebb1e42c040c55bb444b62551a7541d0da8503d14adea3b24d9ff53e875deff9c0cebe284bb49fc1a7d0
data/README.md ADDED
@@ -0,0 +1,182 @@
1
+ ### Installing
2
+
3
+ _gosu and activesupport will be loaded as dependencies_
4
+
5
+ `gem install gosu_wrapper` or in a gemfile: `gem 'gosu_wrapper'`
6
+
7
+ ### Usage
8
+
9
+ One public class is exposed, `GosuWrapper`. It's essentially a wrapper over an
10
+ anonymous `Gosu::Window` class that gets functionality added through metaprogramming.
11
+
12
+ In lieue of a "getting started" snippet, I'm going to delegate that to the
13
+ [gosu_wrapper_snake_example](http://github.com/maxpleaner/gosu_wrapper_snake_example)
14
+ codebase and run through the API step-by-step here.
15
+
16
+ ---
17
+
18
+ **`#initialize(width:, height:, attributes:)`**
19
+
20
+ - This defines `#window` which is an instance of `Gosu::Window`.
21
+
22
+ - width & height are num pixels (of the total window).
23
+
24
+ - attributes is an array of symbols.
25
+ - It must at least include `:window_height` and `:window_width`.
26
+ - All of the keys in your app's state hash should be given here.
27
+ - Each of them get attr_accessors defined on `#window` and shorthand accessors
28
+ using `method_missing` (see next section).
29
+
30
+ ---
31
+
32
+ **There are four instance methods added using `method_missing`**
33
+
34
+ 1. `#get_<attr>`
35
+ delegates the getter to `window`
36
+
37
+ 2. `#set_<attr>(val)`
38
+ delegates the setter to `window`
39
+
40
+ 3. `#change_<attr>(sym, arg)`
41
+ a shorthand for some update operations on non-mutable objects.
42
+ For example `change_score(:+, 1)`
43
+
44
+ 4. `#get_or_set_<attr>(&blk)`
45
+ returns the val if it's truthy, and otherwise sets the val equal to the
46
+ block result (returning it as well).
47
+
48
+ ---
49
+
50
+ **`#define_method_on_window(name, &blk)`**
51
+
52
+ - this should be a private method, but is used by `#add_hook/#add_helper` so
53
+ it's worth explaining.
54
+
55
+ - It defines the method named `name` on `window` with `blk` as its body.
56
+
57
+ - Arguments are determined by the given block
58
+
59
+ - The block is always invoked with the `GosuWrapper` instance as the value of `self`
60
+
61
+ ---
62
+
63
+ **`#scope(*args, **keywords, &blk)`**
64
+
65
+ - another method that should be private; this is what handles calling a proc
66
+ with the `GosuWrapper` instance as the value of `self`.
67
+
68
+ ---
69
+
70
+ **`#config(&blk)`**
71
+
72
+ - mostly the same thing as `#scope` but is meant to be used publically.
73
+
74
+ - the only functional difference is this always returns `self`
75
+ (the `GosuWrapper` instance) whereas `#scope` returns the result of the
76
+ block.
77
+
78
+ - Like `#scope`, this is a classic DSL-style method which exists for the
79
+ sole purpose of saving keystrokes (using `instance_exec`)
80
+
81
+ ---
82
+
83
+ **`#add_hook(name, &blk)`**
84
+
85
+ - a "hook" conceptually is a method internally defined by `Gosu::Window`
86
+ that we're tapping into by overriding. Hooking into events `update`,
87
+ `button_down`, and `draw` are how the app works fundamentally.
88
+
89
+ - the `button_down` proc is passed an `id` which can be checked against
90
+ the values in `#buttons` to determine which key was pressed.
91
+
92
+ - `update` and `draw` are run every tick. Conceptually, `update`
93
+ is used to change the state and `draw` to represent it.
94
+
95
+ ---
96
+
97
+ **`#add_helper(name, &blk)`**
98
+
99
+ - functionally speaking this is the exact same thing as `add_hook` -
100
+ it defines a method on `Gosu::Window`.
101
+
102
+ - It exists to distinguish between built-in hooks like `update` from
103
+ custom methods.
104
+
105
+ - These can be called with `#invoke` or its alias `#call_helper`.
106
+
107
+ ---
108
+
109
+ **`#show`**
110
+
111
+ - Starts the game. Needs to be called only once.
112
+
113
+ ---
114
+
115
+ **`#draw_rect(start_x:, start_y:, end_x:, end_y:, color)`**
116
+
117
+ - Should be called from `draw` only. Fills the rectangle with `color`
118
+ - Needs to run every `draw` tick.
119
+
120
+ ---
121
+
122
+ **`#colors`**
123
+
124
+ - a hash of name => color object pairs
125
+ - e.g. `colors[:red]`
126
+ - it's also possible to make hexademical colors with Gosu
127
+
128
+ ---
129
+
130
+ **`#buttons`**
131
+
132
+ - a hash of name => button id pairs
133
+ - e.g. `buttons[:right]` or `buttons[:escape]`
134
+ - not all the gosu buttons are mapped here but I'd welcome a PR to add more.
135
+
136
+ ---
137
+
138
+ **`#invoke/#call_helper/#dispatch/#call_hook`**
139
+
140
+ - all aliases for the same simple thing: calling a function on
141
+ `window` (the `Gosu::Window instance`).
142
+
143
+ ---
144
+
145
+ **default helpers**
146
+
147
+ There are a few predefined helpers.
148
+
149
+ They can be called with `#call_helper(name_sym, *args, **keywords, &blk)`
150
+
151
+ The required parameters differ between the helpers.
152
+
153
+ 1. `div_window_into(num_cols:, num_rows:, margin:)`
154
+ - splits the window into a grid but doesn't draw it
155
+ - returns a matrix-like hash which can be passed to `draw_grid`
156
+ as the `sections` argument
157
+ - uses `div_section_into` internally
158
+
159
+ 2. `div_setion_into(start_x: start_y:, end_x:, end_y:, num_cols:, num_rows:, margin:)`
160
+ - splits a rectangle into a grid but doesn't draw it
161
+ - returns a matrix-like hash which can be passed to `draw_grid`
162
+ - `margin` is an optional reduction of the size of each column.
163
+ It's passed as `1` in `div_window_into` and the columns won't be
164
+ distinguishable (there will be no visible border) unless this is positive.
165
+ - specifically, the return value looks like this:
166
+
167
+ # many rows and columns can be stored in this structure
168
+ {
169
+ <row_idx> => {
170
+ start_x: <num>, start_y: <num>, end_x: <num>, end_y: <num>,
171
+ cols: {
172
+ <col_idx> => {
173
+ start_x: <num>, start_y: <num>, end_x: <num>, end_y: <num>
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ 3. `draw_grid(sections:, row_color:, col_color:)`
180
+ - The result of `div_window_into` can be passed to this.
181
+ - Internally it uses `GridHelpers#draw_rect`
182
+
@@ -0,0 +1,63 @@
1
+ class GosuWrapper
2
+ class GridHelpers
3
+
4
+ def self.div_windo_into
5
+ Proc.new do |num_cols:, num_rows:, margin:|
6
+ call_helper :div_section_into, {
7
+ start_x: 0,
8
+ start_y: 0,
9
+ end_x: get_window_width,
10
+ end_y: get_window_height,
11
+ margin: margin,
12
+ num_rows: num_rows,
13
+ num_cols: num_cols
14
+ }
15
+ end
16
+ end
17
+
18
+ def self.div_section_into
19
+ Proc.new do |
20
+ start_x:, start_y:, end_x:, end_y:, num_cols:, num_rows:, margin:
21
+ |
22
+ total_height = end_y - start_y
23
+ total_width = end_x - start_x
24
+ row_height = total_height / num_rows
25
+ col_width = total_width / num_cols
26
+ (num_rows).times.reduce({}) do |rows, row_idx|
27
+ row_start_y = (row_height * row_idx)
28
+ row_end_y = (row_start_y + row_height)
29
+ rows[row_idx] = {
30
+ start_y: row_start_y,
31
+ end_y: row_end_y,
32
+ start_x: start_x,
33
+ end_x: end_x,
34
+ cols: (num_cols).times.reduce({}) do |cols, col_idx|
35
+ col_start_x = col_width * col_idx
36
+ col_end_x = col_start_x + col_width
37
+ cols[col_idx] = {
38
+ start_x: col_start_x + margin,
39
+ end_x: col_end_x - margin,
40
+ start_y: row_start_y + margin,
41
+ end_y: row_end_y - margin,
42
+ }
43
+ cols
44
+ end
45
+ }
46
+ rows
47
+ end
48
+ end
49
+ end
50
+
51
+ def self.draw_grid
52
+ Proc.new do |sections:, row_color:, col_color:|
53
+ sections.each do |row_num, row|
54
+ draw_rect row.merge(color: row_color)
55
+ row[:cols].each do |col_num, col|
56
+ draw_rect col.merge(color: col_color)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -1,32 +1,7 @@
1
1
  class GosuWrapper
2
2
  module Util
3
-
4
- # ================================================
3
+
5
4
  def method_missing_for(regex, type:, &definition_blk)
6
- # Regex should include a match group
7
- # type should be either :instance or :class
8
- # Definition blk is run unless there's an existing method with the same name.
9
- # if caller_blk is provided, it will be passed to definition_blk's invocation
10
- #
11
- # Example:
12
- #
13
- # class Animal
14
- # extend Util
15
- # attr_reader :noises
16
- # def initialize
17
- # @noises = { cat: "meow" }
18
- # end
19
- # method_missing_for /^(.+)_goes$/ do |match, arg|
20
- # puts @noises[match]
21
- # end
22
- # end
23
- #
24
- # Animal.new.cat_goes # => "meow"
25
- #
26
- # Through the use of an anonymous modules (adding method_missing to the
27
- # inheritance chain vs overwriting it with define_method), this can be
28
- # used multiple times.
29
- #
30
5
  anon_module = Module.new do |mod|
31
6
  define_method(:method_missing) do |name, *args, **keywords, &caller_blk|
32
7
  match = name.to_s.scan(regex).flatten[0]
@@ -59,7 +34,6 @@ class GosuWrapper
59
34
  base.prepend anon_module
60
35
 
61
36
  end
62
- # ================================================
63
37
 
64
38
  end
65
39
  end
data/lib/gosu_wrapper.rb CHANGED
@@ -21,6 +21,13 @@ class GosuWrapper
21
21
  @window.window_width = width
22
22
  @hooks = []
23
23
  @helpers = []
24
+ add_default_helpers
25
+ end
26
+
27
+ def add_default_helpers
28
+ add_helper :div_window_into, GridHelpers.div_window_into
29
+ add_helper :div_section_into, GridHelpers.div_section_into
30
+ add_helper :draw_grid, GridHelpers.draw_grid
24
31
  end
25
32
 
26
33
  # Delegate "set_<attr>" setters to window
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GosuWrapper
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gosu_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - maxpleaner
@@ -45,13 +45,14 @@ executables:
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - README.md
48
49
  - bin/gosu_wrapper
49
50
  - lib/gosu_wrapper.rb
50
51
  - lib/gosu_wrapper/buttons.rb
51
52
  - lib/gosu_wrapper/colors.rb
53
+ - lib/gosu_wrapper/grid_helpers.rb
52
54
  - lib/gosu_wrapper/util.rb
53
55
  - lib/version.rb
54
- - readme.md
55
56
  homepage: http://github.com/maxpleaner/gosu_wrapper
56
57
  licenses:
57
58
  - MIT
data/readme.md DELETED
@@ -1,126 +0,0 @@
1
- ### Installing
2
-
3
- _gosu and activesupport will be loaded as dependencies_
4
-
5
- `gem install gosu_wrapper`
6
-
7
- or in a gemfile: `gem 'gosu_wrapper'`
8
-
9
- ### Usage
10
-
11
- One public class is exposed, `GosuWrapper`. It's essentially a wrapper
12
- over an anonymous `Gosu::Window` class that gets functionality added through
13
- metaprogramming.
14
-
15
- In lieue of a "getting started" snippet, I'm going to delegate that to the
16
- [gosu_wrapper_snake_example](http://github.com/maxpleaner/gosu_wrapper_snake_example)
17
- codebase and run through the API step-by-step here.
18
-
19
- ---
20
-
21
- **`#initialize(width:, height:, attributes:)`**
22
-
23
- - This defines `#window` which is an instance of `Gosu::Window`.
24
- - width & height are num pixels (of the total window).
25
- - attributes is an array of symbols.
26
- It must at least include `:window_height` and `:window_width`.
27
- All of the keys in your app's state hash should be given here.
28
- Each of them get attr_accessors defined on `#window` and shorthand
29
- accessors using `method_missing` (see next section).
30
-
31
- ---
32
-
33
- **There are four instance methods added using `method_missing`**
34
-
35
- 1. `#get_<attr>`
36
- - delegates the getter to `window`
37
- 2. `#set_<attr>(val)`
38
- - delegates the setter to `window`
39
- 3. `#change_<attr>(sym, arg)`
40
- - a shorthand for some update operations
41
- on non-mutable objects. For example `change_score(:+, 1)`
42
- 4. `#get_or_set_<attr>(&blk)`
43
- - returns the val if it's truthy, and otherwise sets the val equal
44
- to the block result (returning it as well).
45
-
46
- ---
47
-
48
- **`#define_method_on_window(name, &blk)`**
49
-
50
- - this should be a private method, but is used by a number of others so
51
- it's worth explaing.
52
- - It defines the method named `name` on `window` with `blk` as its body.
53
- - Arguments are determined by the block
54
- - The block is always invoked with the `GosuWrapper` instance as
55
- the value of `self`
56
-
57
- ---
58
-
59
- **`#scope(*args, **keywords, &blk)`**
60
-
61
- - another method that should be private; this is what handles
62
- calling a proc with the `GosuWrapper` instance as the value of `self`.
63
-
64
- ---
65
-
66
- **`#config(&blk)`**
67
-
68
- - mostly the same thing as `#scope` but is meant to be used publically.
69
- - the only functional difference is this always returns `self`
70
- (the `GosuWrapper` instance) whereas `#scope` returns the result of the
71
- block.
72
- - Like `#scope`, this is a classic DSL-style method which exists for the
73
- sole purpose of saving keystrokes (using `instance_exec`)
74
-
75
- ---
76
-
77
- **`#add_hook(name, &blk)`**
78
-
79
- - a "hook" conceptually is a method internally defined by `Gosu::Window`
80
- that we're tapping into by overriding. Hooking into events `update`,
81
- `button_down`, and `draw` are how the app works at a basic level.
82
- - the `button_down` proc is passed an `id` which can be checked against
83
- the values in `#buttons` to determine which key was pressed.
84
- - `update` and `draw` are run every tick. Conceptually, `update`
85
- is used to change the state and `draw` to represent it.
86
-
87
- ---
88
-
89
- **`#add_helper(name, &blk)`**
90
-
91
- - functionally speaking this is the exact same thing as `add_hook` -
92
- it defines a method on `Gosu::Window`.
93
- - It exists to distinguish between built-in hooks like `update` from
94
- custom methods.
95
- - These can be called with `#invoke` or its alias `#call_helper`.
96
-
97
- ---
98
-
99
- **`#show`**
100
-
101
- - Starts the game. Needs to be called only once.
102
-
103
- ---
104
-
105
- **`#draw_rect(start_x:, start_y:, end_x:, end_y:, color)`**
106
-
107
- - Can be called from `draw` only. Fills the rectangle with `color`
108
-
109
- ---
110
-
111
- **`#colors`**
112
-
113
- - a hash of name => color object pairs
114
-
115
- ---
116
-
117
- **`#buttons`**
118
-
119
- - a hash of name => button id pairs
120
-
121
- ---
122
-
123
- **`#invoke/#call_helper/#dispatch/#call_hook`**
124
-
125
- - all aliases for the same simple thing: calling a function on
126
- `window` (the `Gosu::Window instance`).