Python游戏系列之七_显示得分


  这个游戏的玩法就是击落尽量多的敌方飞机,同时自己不被敌人撞到。

  这个小节将介绍得分的显示。


  一、pygame字体原理

  pygame.font库中有字体相关的类。

  pygame编程时可以调用系统中已经安装的字体,也可以使用自己的ttf字体文件,这样做的好处是可以将字体文件与游戏一起打包分发,避免玩家电脑没有这个字体的问题。

  1. 使用系统字体

font1 = pygame.font.SysFont('宋体', 16, True)

  这句代码使用系统字体创建一个Font对象,3个参数分别是字体名、字体大小、是否粗体,还可以有第4个参数,是否斜体。一般只要前两个参数即可。

font_list = pygame.font.get_fonts()

  get_fonts()函数可以得到系统中已安装的字体的列表。


  2. 使用ttf字体文件

my_font = pygame.font.Font('my_font.ttf', 16)

  这句代码使用自己的ttf字体文件创建一个Font对象。


  3. 在屏幕上打印文字

  通过字体对象,可以生成一个surface,然后再调用blit()将surface显示出来。

  这里主要用到字体对象的render()方法,方法原型如下:

render(text, antialias, color, background=None) -> Surface

  参数说明:

  参数1:要打印的文字。

  参数2:抗锯齿(True/False)。

  参数3:文字的颜色。颜色使用一个列表,提供rgb三个值。

  参数4:背景颜色。如果使用透明背景,这个参数可以不写。


  示例:

surface1 = font1.render(u'当前得分', True, [255, 0, 0])

  注意,要打印汉字,需要加一个u,表示unicode编码。



  最后,将这个surface显示在屏幕上即可:

screen.blit(surface1, [20, 20])

  将刚才的文字显示在x、y坐标分别为20、20的位置上。


  二、计算得分

  上一讲我们分析过,可以使用pygame.sprite库中的groupcollide()函数来进行碰撞检测,代码如下:

pygame.sprite.groupcollide(enemy_group, hero.bullets, True, True)

  这个函数返回一个字典,字典的键是第1个精灵组中发生碰撞的精灵。

  既然这样,只要知道这个字典中的元素个数,就可以知道击落了几架飞机。而len()函数可以获知字典的元素个数。


  1. 添加变量

  在程序的变量定义部分,增加一个变量定义:

# 被击中的敌方飞机字典
enemy_hit_dict = dict()


  再增加一个变量定义,用于保存得分:

score = 0  # 得分


  增加一个常量,表示每击落一架飞机的得分:

# 击落敌方飞机得分
ENEMY_SCORE = 100



  还要增加一个字体的变量:

game_font = pygame.font.SysFont('宋体', 16, True)  # 字体



  2. 碰撞检测部分


  将原有的碰撞检测部分的代码修改为:

# 检测我方子弹是否击中敌方飞机
    enemy_hit_dict = pygame.sprite.groupcollide(enemy_group, hero.bullets, True, True)
    score += len(enemy_hit_dict) * ENEMY_SCORE;  # 计算得分
    enemy_hit_group.add(enemy_hit_dict)



  3. 界面显示部分

  在更新屏幕之前,显示得分:

# 绘制游戏得分
    screen.blit(game_font.render(u'当前得分:%d' % score, True, [255, 0, 0]), [20, 20])
    # 更新屏幕
    pygame.display.update()



  下面是运行界面:

python 计算游戏角色与怪物坐标 用python设计游戏得分_pycharm