基于Python的贪吃蛇游戏设计报告的内容及分解 python贪吃蛇毕业设计_文本框

开始界面

128. def showStartScreen():
129. titleFont = pygame.font.Font('freesansbold.ttf', 100)
130. titleSurf1 = titleFont.render('Wormy!', True, WHITE, DARKGREEN)
131. titleSurf2 = titleFont.render('Wormy!', True, GREEN)
132.
133. degrees1 = 0
134. degrees2 = 0
135. while True:
136. DISPLAYSURF.fill(BGCOLOR)

当贪吃蛇游戏开始运行的时候,玩家并不会自动开始游戏。在玩家真正开始游戏之前,会出现一个开始界面告诉玩家他们正在运行什么游戏。开始界面也让玩家做好开始游戏的准备,否则,在他们还没准备好的时候小蛇可能就要撞死了!

代码的第130行和131行创建了两个Surf对象(object)titleSurf1和titleSurf2,两个Surf内分别是两个不同颜色的“Wormy!”文本框。第129行的Font()函数将字体大小设定为100。第一个“Wormy!”文本框由白色文字和绿色背景组成,第二个由绿色文字和透明(transparent)背景组成。第135行的代码让开始动画循环播放。

让文字转起来!

137. rotatedSurf1 = pygame.transform.rotate(titleSurf1, degrees1)
138. rotatedRect1 = rotatedSurf1.get_rect()
139. rotatedRect1.center = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2)
140. DISPLAYSURF.blit(rotatedSurf1, rotatedRect1)
141.
142. rotatedSurf2 = pygame.transform.rotate(titleSurf2, degrees2)
143. rotatedRect2 = rotatedSurf2.get_rect()
144. rotatedRect2.center = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2)
145. DISPLAYSURF.blit(rotatedSurf2, rotatedRect2)
146.
147. drawPressKeyMsg()
148.
149. if checkForKeyPress():
150. pygame.event.get() # 清除事件列表
151. return
152. pygame.display.update()
153. FPSCLOCK.tick(FPS)

在上一段代码中,我们设定了文字的颜色和大小,现在我们要让文字转起来!

Pygame.transform.rotate()将会让写有“Wormy!”字样的Surf旋转起来。括号内有两个参数,第一个是将被旋转的Surf对象,第二个是需要旋转的角度。Pygame.tramsform.rotate()函数不会改变你传递(pass)的Surf参数本身,而是返回一个新的Surf对象,并把旋转过的文本框画在上面。

需要注意的是,新的Surf对象可能会比原来的大,因为最初的Surf对象只需刚好能在装下文本框,新的Surf对象则需装下旋转后的文本框。如下图, 黑色矩形代表原Surf对象/文本框,灰色矩形代表新的Surf对象。

基于Python的贪吃蛇游戏设计报告的内容及分解 python贪吃蛇毕业设计_python贪吃蛇毕业设计_02

旋转的程度是用角度制来表示的。旋转一圈是360度, 不旋转是0度。旋转1/4圈是90度。顺时针旋转用负数表示。由于每旋转360度就又能得到一个一样的图像,每当得到一个大于360的角度,pygame.transform.rotate()就会减去360的倍数,直到旋转角度小于360,如下图:

基于Python的贪吃蛇游戏设计报告的内容及分解 python贪吃蛇毕业设计_python贪吃蛇毕业设计_03

我们在第140行和第145行使用blit将旋转后的“Wormy!”显示在屏幕上。

第147行的drawPressKeyMsg()函数在屏幕右下角显示“Press a key to play”字样。这段动画会不断循环播放,直到玩家按下任意键,这时checkForKeyPress()函数将返回一个不为None的值。在checkForKeyPress()函数返回前,程序调用pygame.event.get()函数来清除无用的事件队列。

基于Python的贪吃蛇游戏设计报告的内容及分解 python贪吃蛇毕业设计_顺时针_04

不完美的旋转

你可能会想,我们为什么要把旋转过的Surf储存在新的变量rotatedSurf1和rotatedSurf2中,而不是直接更新原有的变量titleSurf1和titleSurf2呢?

有两个原因:

首先,我们往往不能够完美地旋转2D图像,我们只能做近似的旋转。如果我们把图像逆时针旋转10度再顺时针旋转10度,我们得到的图像并不能和一开始的完全重合。这就好比复印,如果我们不断对新的复印件进行复印,图像的质量会越来越差。

(这种不完美性只有一个意外:当你将图像旋转90度的倍数,比如90,180,270,360度等,我们得到的图像将是准确的)。

第二,经过旋转的2D图像将会比原来的图像稍大,对旋转过的图像再次进行旋转,旋转过的图像又会更大一些。如果你不断进行旋转,最后图像会变得非常大,以至于PyGame无法处理,然后你的程序就会崩溃,并提示:pygame.error: Width or height is too large.(pygame错误:宽度或高度过大)。

154. degrees1 += 3 # 每帧旋转3度
155. degrees2 += 7 # 每帧旋转7度

我们旋转两个“Wormy!”的角度被储存在degrees1和degrees2中。循环每进行一次,我们就让degrees1增加3,让degress2增加7。也就是每一次循环,让一个文本框旋转3度,另一个文本框旋转7度。这就是为什么一个文本框旋转得比另一个要慢。

158. def terminate():
159. pygame.quit()
160. sys.exit()

terminate()函数调用了pygame.quit()和sys.exit(),因而游戏能够无误关闭。这里的terminate()函数就是之前提到的terminate()函数。

(未完待续)