记录分数
记录玩家的得分非常简单:我们只需要一个变量,我们将初始化为 0 并在每次子弹摧毁敌人时添加。 由于我们有不同大小的敌人,而且大的比小的更容易被击中,所以对击中较小的流星给予更多的分数是比较符合游戏逻辑的。
我们将设置变量 score 并在游戏循环之前对其进行初始化:
for i in range(8):
m = Mob()
all_sprites.add(m)
mobs.add(m)
score = 0
# Game loop
running = True
要根据敌人Mob的大小分配得分,我们可以使用之前使用的 radius 属性。 最大的Mob图像宽约 100 像素,其半径为 100 * .85 / 2 = 43 像素,而最小Mob的半径约为 8 像素。 因此,如果我们从一个更大的数字(比如 50)中减去半径,我们将得到大的Mob给出 7 分,而最小的给出 42 分。
# check to see if a bullet hit a mob
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
score += 50 - hit.radius
m = Mob()
all_sprites.add(m)
mobs.add(m)
绘制得分
现在我们有一个变量来保存我们的分数,但我们需要能够在屏幕上绘制它,这有点棘手。 在 Pygame 中绘制文本有点复杂,需要几个步骤。 如果您要多次绘制文本,那么有必要创建一个函数来处理,我们将调用 draw_text 来为处理它。 该函数的参数将是:
- surf - 我们希望在其上绘制文本的表面
- text - 我们要显示的字符串
- x, y - 位置
我们还需要选择一种字体。 如果您选择的字体在您使用的计算机上不存在,这可能会成为问题。 我们可以通过使用 pygame.font.match_font() 来解决这个问题,它会在系统中搜索最接近的匹配字体。
这是 draw_text 函数:
font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):
font = pygame.font.Font(font_name, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect()
text_rect.midtop = (x, y)
surf.blit(text_surface, text_rect)
在屏幕上绘制字体意味着准确计算所需的像素模式——计算机图形学术语是“渲染”。 这就是 font.render() 函数正在做的事情。 它的第二个参数值为True,这个参数用于打开/关闭称为抗锯齿功能的选项。
抗锯齿
如果您曾经尝试使用像素(或 Minecraft 中的块等)手动绘制某些东西,那么您就会知道在方形网格上绘制曲线非常困难——您最终会得到一个锯齿状的形状。 这种锯齿状称为“锯齿”,您可以在此处看到一个示例:
由于计算机屏幕中的显示问题(锯齿),第一个“a”字符看起来非常疙疙瘩瘩。 抗锯齿是现代计算机如何使屏幕上的文本看起来不那么明显锯齿状的一种技术。它通过将形状边缘的像素与背景颜色混合来做到这一点。 在上面的图片中的第二个a中,您可以看到黑色“a”周围有灰色像素。 缩小时,这使字体看起来非常光洁和平滑。
显示分数
现在我们准备好在屏幕上显示分数了。 我们只需要添加下面的代码到我们的绘图部分,在屏幕顶部中心显示分数:
# Draw / render
screen.fill(BLACK)
screen.blit(background, background_rect)
all_sprites.draw(screen)
draw_text(screen, str(score), 18, WIDTH / 2, 10)
搞定! 可以点击这里查看完整代码。在下一部分中,我们将通过添加声音和音乐来给游戏添加效果。