接下来要进入操作部分了
坚持才能获得最后的成就感噢
用移动变量处理用户输入
216. elif (event.key == K_LEFT or event.key == K_a):
217. movingLeft = False
218. elif (event.key == K_RIGHT or event.key == K_d):
219. movingRight = False
220. elif (event.key == K_DOWN or event.key == K_s):
221. movingDown = False
按下一个方向键(或是WASD键)设置 movingLeft, movingRight, or movingDown 变量反馈为错误,表示玩家不再想沿着这条道路移动积木。代码稍后会根据Boolean值中的移动变量处理要做什么。请注意,向上箭头和W键用于旋转积木,而不是移动积木。 这就是为什么没有moveUp变量。
检验滑动或旋转是否是变量
223. elif event.type == KEYDOWN:
224. # moving the block sideways
225. if (event.key == K_LEFT or event.key == K_a) and isValidPosition(board, fallingPiece, adjX=-1):
226. fallingPiece['x'] -= 1
227. movingLeft = True
228. movingRight = False
229. lastMoveSidewaysTime = time.time()
当按下向左键(向左移动是一个变量,移动着积木,所以决定称为isValidPosition()),那么我们应该通过将dropsPiece ['x']的值减去1来将位置更改为左边的一个空格。isValidPosition()函数具有可选参数,称为adjX和adjY。但有时我们不想检查积木当前的位置,但是宁愿检查一些小空格的位置。
如果我们将-1赋值给adjX(“adjusted X”的缩写),那么就不会检查积木数据结构位置的有效性,而是会检查如果左边有一个空格,积木的位置将会放在那里。1赋值给adjX会检查右边的空间。还有adjY作为可选参数。-1赋值给 adjY 检查积木现在所处位置上面一格,将数值如3赋值给adjY会检查积木所处位置下面3格。
movingLeft变量设置为True,仅是确认掉落的积木既不会向左也不会向右移动,在228行的movingRight变量被设定为False。在229行的lastMoveSidewaysTime 变量会下载当前的时间。
这些变量的设置是为了玩家按下方向键使积木继续移动。如果movingLeft变量设置为 True,程序知道向左键(或A键)按下还未松开。如果时间被存入lastMoveSidewaysTime变量后的0.15秒(数据被存储在MOVESIDEWAYSFREQ中),就在这时程序会再次将积木移到左边。
231. elif (event.key == K_RIGHT or event.key == K_d) and isValidPosition(board, fallingPiece, adjX=1):
232. fallingPiece['x'] += 1
233. movingRight = True
234. movingLeft = False
235. lastMoveSidewaysTime = time.time()
线231至235上的代码几乎与第225至229行完全相同,只是当按下右箭头键(或D键)时,它处理向下移动下降的部分。
237. # rotating the block (if there is room to rotate)
238. elif (event.key == K_UP or event.key == K_w):
239. fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(SHAPES[fallingPiece['shape']])
向上键(或w键)可以多次翻转下落的积木。这里所有代码要做的是将fallingPiece的数据库中翻转键的值加1。然而,如果增加的翻转键的值比翻转总数大,然后通过“修改“形状可能旋转的总数(这就是len(SHAPES[fallingPiece['shape']]),则数值将会变为0,现在举一个J形状的例子,它拥有四种翻转方向组合:
>>> 0 % 4
0
>>> 1 % 4
1
>>> 2 % 4
2
>>> 3 % 4
3
>>> 5 % 4
1
>>> 6 % 4
2
>>> 7 % 4
3
>>> 8 % 4
0
>>>
240. if not isValidPosition(board, fallingPiece):
241. fallingPiece['rotation'] = (fallingPiece['rotation'] - 1) % len(SHAPES[fallingPiece['shape']])
如果新的旋转方向是无效的,那是因为它与底板上的一些方块重叠在一起,那么我们想通过从dropsPiece ['rotation']减去1来将其切换回原来的旋转。我们可以通过len(SHAPES[fallingPiece['shape']])来修改旋转方向,如果新的数值是-1,该修改将会更改为列表中的最后一个旋转。 以下是修改负数的示例:
>>> -1 % 4
3
242. elif (event.key == K_q): # rotate the other direction
243. fallingPiece['rotation'] = (fallingPiece['rotation'] - 1) % len(SHAPES[fallingPiece['shape']])
244. if not isValidPosition(board, fallingPiece):
245. fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(SHAPES[fallingPiece['shape']])
242行到245行与238行到241行做着相同的事,除了处理玩家按下控制相反方向翻转的积木的Q键的情况。在这种情况下,我们从dropsPiece ['rotation']中减去1(在第243行完成),而不是加1。
247. # making the block fall faster with the down key
248. elif (event.key == K_DOWN or event.key == K_s):
249. movingDown = True
250. if isValidPosition(board, fallingPiece, adjY=1):
251. fallingPiece['y'] += 1
252. lastMoveDownTime = time.time()
如果按向下键或S键,那么积木下降的速度比正常的要快。251行是在底板向下移动积木一格(仅仅是有效的空格)。movingDown变量设置为True, lastMoveDownTime重置当前时间。稍后将会检查这些变量,为了按下向下键或S键移动的积木将以更快的速度持续下降。
(未完待续)