/ld27

To get this branch, use:
bzr branch /bzr/ld27

« back to all changes in this revision

Viewing changes to zoetrope/core/keys.lua

  • Committer: Josh C
  • Date: 2013-08-25 02:04:52 UTC
  • Revision ID: josh@9ix.org-20130825020452-py8fijli8m5te5gv
improve performance with (sketchy, experimental) sprite batches

Show diffs side-by-side

added added

removed removed

1
 
--
2
 
--
3
 
--
4
 
--              <Sprite>
5
 
 
6
 
Keys = Sprite:extend{
7
 
        visible = false,
8
 
 
9
 
        -- Property: typed
10
 
        -- This is literally what is being typed during the current frame.
11
 
        -- e.g. if the user holds the shift key and presses the 'a' key,
12
 
        -- this will be set to 'A'. Consult <allPressed()> if you
13
 
        -- want to know what specific keys are being pressed.
14
 
 
15
 
        typed = '',
16
 
 
17
 
        -- private property: _thisFrame
18
 
        -- what keys are pressed this frame
19
 
        -- if you are interested in this, use allPressed() instead
20
 
 
21
 
        _thisFrame = {},
22
 
 
23
 
        -- private property: _lastFrame
24
 
        -- what keys were pressed last frame
25
 
        
26
 
        _lastFrame = {},
27
 
        
28
 
        new = function (self, obj)
29
 
                obj = self:extend(obj)
30
 
                the.keys = obj
31
 
                love.keypressed = function (key, unicode) obj:keyPressed(key, unicode) end
32
 
                love.keyreleased = function (key, unicode) obj:keyReleased(key, unicode) end
33
 
                if obj.onNew then obj:onNew() end
34
 
                return obj
35
 
        end,
36
 
        
37
 
        -- Method: pressed
38
 
        -- Are *any* of the keys passed held down this frame?
39
 
        --
40
 
        -- Arguments:
41
 
        --              string key descriptions passed as individual arguments
42
 
        --
43
 
        -- Returns:
44
 
        --              boolean
45
 
 
46
 
        pressed = function (self, ...)
47
 
                local keys = {...}
48
 
                for _, value in pairs(keys) do
49
 
                        if STRICT then
50
 
                                assert(type(value) == 'string', 'all keys are strings; asked to check a ' .. type(value))
51
 
                        end
52
 
 
53
 
                        if self._thisFrame[value] then
54
 
                                return true
55
 
                        end
56
 
                end
57
 
                
58
 
                return false
59
 
        end,
60
 
 
61
 
        -- Method: justPressed
62
 
        -- Are *any* of the keys passed pressed for the first time this frame?
63
 
        --
64
 
        -- Arguments:
65
 
        --              string key descriptions passed as individual arguments
66
 
        --
67
 
        -- Returns:
68
 
        --              boolean
69
 
 
70
 
        justPressed = function (self, ...)
71
 
                local keys = {...}
72
 
 
73
 
                for _, value in pairs(keys) do
74
 
                        if STRICT then
75
 
                                assert(type(value) == 'string', 'all keys are strings; asked to check a ' .. type(value))
76
 
                        end
77
 
 
78
 
                        if self._thisFrame[value] and not self._lastFrame[value] then
79
 
                                return true
80
 
                        end
81
 
                end
82
 
                
83
 
                return false
84
 
        end,
85
 
 
86
 
        -- Method: released
87
 
        -- Are *all* of the keys passed not held down this frame?
88
 
        -- 
89
 
        -- Arguments:
90
 
        --              string key descriptions passed as individual arguments
91
 
        --
92
 
        -- Returns:
93
 
        --              boolean
94
 
 
95
 
        released = function (self, ...)
96
 
                local keys = {...}
97
 
 
98
 
                for _, value in pairs(keys) do
99
 
                        if STRICT then
100
 
                                assert(type(value) == 'string', 'all keys are strings; asked to check a ' .. type(value))
101
 
                        end
102
 
 
103
 
                        if self._thisFrame[value] then
104
 
                                return false
105
 
                        end
106
 
                end
107
 
                
108
 
                return true
109
 
        end,
110
 
 
111
 
        -- Method: justReleased
112
 
        -- Are *any* of the keys passed released after being held last frame?
113
 
        --
114
 
        -- Arguments:
115
 
        --              string key descriptions passed as individual arguments
116
 
        --
117
 
        -- Returns:
118
 
        --              boolean
119
 
 
120
 
        justReleased = function (self, ...)
121
 
                local keys = {...}
122
 
 
123
 
                for _, value in pairs(keys) do
124
 
                        if STRICT then
125
 
                                assert(type(value) == 'string', 'all keys are strings; asked to check a ' .. type(value))
126
 
                        end
127
 
 
128
 
                        if self._lastFrame[value] and not self._thisFrame[value] then
129
 
                                return true
130
 
                        end
131
 
                end
132
 
                
133
 
                return false
134
 
        end,
135
 
 
136
 
        -- Method: allPressed
137
 
        -- Returns all buttons currently pressed this frame.
138
 
        --
139
 
        -- Arguments:
140
 
        --              none
141
 
        --
142
 
        -- Returns:
143
 
        --              string key descriptions; if nothing is pressed, nil
144
 
 
145
 
        allPressed = function (self)
146
 
                local result = {}
147
 
 
148
 
                for key, value in pairs(self._thisFrame) do
149
 
                        if value then table.insert(result, key) end
150
 
                end
151
 
                
152
 
                return unpack(result)
153
 
        end,
154
 
 
155
 
        -- Method: allJustPressed
156
 
        -- Returns all keys just pressed this frame.
157
 
        --
158
 
        -- Arguments:
159
 
        --              none
160
 
        --
161
 
        -- Returns:
162
 
        --              string key descriptions; if nothing is just pressed, nil
163
 
 
164
 
        allJustPressed = function (self)
165
 
                local result = {}
166
 
 
167
 
                for key, value in pairs(self._thisFrame) do
168
 
                        if value and not self._lastFrame[key] then table.insert(result, key) end
169
 
                end
170
 
                
171
 
                return unpack(result)
172
 
        end,
173
 
 
174
 
        -- Method: allJustReleased
175
 
        -- Returns all keys just released this frame.
176
 
        --
177
 
        -- Arguments:
178
 
        --              none
179
 
        --
180
 
        -- Returns:
181
 
        --              string key descriptions; if nothing is just pressed, nil
182
 
 
183
 
        allJustReleased = function (self)
184
 
                local result = {}
185
 
 
186
 
                for key, value in pairs(self._thisFrame) do
187
 
                        if not value and self._lastFrame[key] then table.insert(result, key) end
188
 
                end
189
 
                
190
 
                return unpack(result)
191
 
        end,
192
 
 
193
 
        -- Connects to the love.keypressed callback
194
 
 
195
 
        keyPressed = function (self, key, unicode)
196
 
                self._thisFrame[key] = true
197
 
                if unicode and unicode >= 0x20 and unicode ~= 127 and unicode < 0x3000 then
198
 
                        self.typed = self.typed .. string.char(unicode)
199
 
                end
200
 
 
201
 
                -- aliases for modifiers
202
 
 
203
 
                if key == 'rshift' or key == 'lshift' or
204
 
                   key == 'rctrl' or key == 'lctrl' or
205
 
                   key == 'ralt' or key == 'lalt' or
206
 
                   key == 'rmeta' or key == 'lmeta' or
207
 
                   key == 'rsuper' or key == 'lsuper' then
208
 
                        self._thisFrame[string.sub(key, 2)] = true
209
 
                end
210
 
        end,
211
 
 
212
 
        -- Connects to the love.keyreleased callback
213
 
 
214
 
        keyReleased = function (self, key, unicode)
215
 
                self._thisFrame[key] = false
216
 
 
217
 
                -- aliases for modifiers
218
 
 
219
 
                if key == 'rshift' or key == 'lshift' or
220
 
                   key == 'rctrl' or key == 'lctrl' or
221
 
                   key == 'ralt' or key == 'lalt' or
222
 
                   key == 'rmeta' or key == 'lmeta' or
223
 
                   key == 'rsuper' or key == 'lsuper' then
224
 
                        self._thisFrame[string.sub(key, 2)] = false
225
 
                end
226
 
        end,
227
 
 
228
 
        endFrame = function (self, elapsed)
229
 
                for key, value in pairs(self._thisFrame) do
230
 
                        self._lastFrame[key] = value
231
 
                end
232
 
 
233
 
                self.typed = ''
234
 
                Sprite.endFrame(self, elapsed)
235
 
        end,
236
 
 
237
 
        update = function() end
238
 
}