参数的调试是游戏关键的部分
直接决定了游戏的可玩性噢
324. def showTextScreen(text):
325. # This function displays large text in the
326. # center of the screen until a key is pressed.
327. # Draw the text drop shadow
328. titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTSHADOWCOLOR)
329. titleRect.center = (int(WINDOWWIDTH / 2), int(WINDOWHEIGHT / 2))
330. DISPLAYSURF.blit(titleSurf, titleRect)
331.
332. # Draw the text
333. titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTCOLOR)
334. titleRect.center = (int(WINDOWWIDTH / 2) - 3, int(WINDOWHEIGHT / 2) - 3)
335. DISPLAYSURF.blit(titleSurf, titleRect)
336.
337. # Draw the additional "Press a key to play." text.
338. pressKeySurf, pressKeyRect = makeTextObjs('Press a key to play.', BASICFONT, TEXTCOLOR)
339. pressKeyRect.center = (int(WINDOWWIDTH / 2), int(WINDOWHEIGHT / 2) 100)
340. DISPLAYSURF.blit(pressKeySurf, pressKeyRect)
我们将创建一个名为showTextScreen()的通用函数,来代替游戏开始和结束界面的分开的函数。TheshowTextScreen()函数将绘制我们传递给文本参数的任何文本。还将显示“Press a key to play.”的文本。
请注意,第328到330行首先以较深的阴影颜色绘制文本,然后第333至335行将再次绘制相同的文本,除了抵消向左偏移3个像素,向上3像素。这将创建一个“阴影”效果,使文本看起来有点漂亮。您可以通过第328行到第330行注解来比较差异,以检查没有阴影的文本。
showTextScreen()将用于开始界面,游戏结束界面上以及暂停界面。
342. while checkForKeyPress() == None:
343. pygame.display.update()
344. FPSCLOCK.tick()
我们希望这个文本停留在界面,直到玩家按下一个键。这个小循环将不断调取pygame.display.update() 和FPSCLOCK.tick()直到反馈值取代None。当用户按下键时就会发生。
347. def checkForQuit():
348. for event in pygame.event.get(QUIT): # get all the QUIT events
349. terminate() # terminate if any QUIT events are present
350. for event in pygame.event.get(KEYUP): # get all the KEYUP events
351. if event.key == K_ESCAPE:
352. terminate() # terminate if the KEYUP event was for the Esc key
353. pygame.event.post(event) # put the other KEYUP event objects back
checkForQuit()函数能调取处理将导致程序终止的任何事件。如果在事件队列中有QUIT事件(由348和349行处理),或有Esc键KEYUP事件,那么checkForQuit()函数能调取处理将导致程序终止的任何事件。
因为第350行的pygame.event.get()调用会拉出所有的KEYUP事件(包括除Esc键以外的键的事件),如果事件不是Esc键,我们想把它通过调用pygame.event.post()函数。放回事件队列中。
356. def calculateLevelAndFallFreq(score):
357. # Based on the score, return the level the player is on and
358. # how many seconds pass until a falling piece falls one space.
359. level = int(score / 10) 1
360. fallFreq = 0.27 - (level * 0.02)
361. return level, fallFreq
每当玩家消除一行,分数就增加一分。每增加十分,游戏会提升一个等级,积木掉落速度加快。等级和降落的频率会通过该函数得出的分数中计算得到。
为了计算等级,我们用int()函数将一轮游戏的分数除以10.所以如果有任何数字在0-9之间,int()将会舍入到0.代码 1的部分是因为初始级是1级,而不是0级。当分数达到10, int(10 / 10)会得到1,那么 1就会得到等级2.这张图展示当分数从1到34时所对应的的等级。
为了计算下降频率,我们从0.27的基准时间开始(意思是积木自然会每0.27秒落下一次)。 然后我们将等级乘以0.02,并将其从0.27基准时间中减去。 所以在1级,我们将0.02 * 1(即0.02)从0.27减去0.25。 在2级,我们减去0.02 * 2(即0.04)得到0.23。 你可以将等级为0.02的方程式视为“对于每个级别,该积木将比以前的级别快0.02秒。”
我们还可以制作一个图表,显示在每个级别的游戏中,积木的速度有多快:
你可以看到,在14级,下降的频率将小于0。这不会导致我们的代码的任何错误,因为第277行只是检查自从下降的积木最后一个空间之后的经过时间大于计算的下降频率 ,所以如果下降的频率是负的,那么第277行的条件将永远是True,并且该积木将落在游戏循环的每次重复中。 从14级以上,这积木的速度保持不变。
如果FPS设定在25,这意味着在达到14级时,落下的积木每秒会下降25个空格。 考虑到板子只有20个高的空格,这意味着玩家将有不到一秒的时间来设置每一块积木!
如果你想要这积木开始(如果你能看明白我说什么)以较慢的频率中下降得更快,你可以改变计算方式和方法(FFA)使用的方程式。 例如,如第360行这样的:
360. fallFreq = 0.27 - (level * 0.01)
在上述情况下,这些积木在每个级别上只能下降0.01秒,而不是快0.02秒。 该图将如下(原始行在图表中是浅灰色):
正如你所看到的,使用这个新的方程式,14级只会和原来的级别相同。你可以通过改变calculateLevelAndFallFreq()中的方程式来改变游戏的难度或容易程度。
Generating Pieces with the getNewPiece()Function用getNewPiece()函数制造积木
(未完待续)
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved