Python游戏系列之二_显示飞机
在上一篇文章中,我们介绍了如何编写游戏的框架,这一讲将对游戏的框架加以优化,然后把我们的战斗机搬上屏幕。
一、游戏优化
在上一讲中,我们在游戏的主循环中,不断地绘制背景图片、刷新界面。由于中间没有休息,所以游戏很耗CPU资源。
while True: screen.blit(bg, [0, 0]) pygame.display.update()
实际上,游戏一般每秒有60帧就非常棒了,所以应该在游戏主循环中加入休息机制。
在Java中,游戏主循环一般放在线程中,线程可以休眠一段时间。
而在pygame中,主要采用时钟来控制游戏节奏:
clock = pygame.time.Clock() # 创建一个时钟对象 while True: clock.tick(60) # 通过tick方法控制游戏的帧率 screen.blit(bg, [0, 0]) pygame.display.update()pygame.time.Clock()帮助我们创建一个时钟对象,clock.tick(60)控制游戏的最大帧率为60,tick语句应放在游戏主循环内部。
这样CPU的耗费就降低了。
二、显示飞机
现在,该把我们的战斗机搬上屏幕了。
这个游戏有完整的代码和相关资源,在GitHub上可以下载到:https://github.com/Kill-Console/PythonShootGame
现在的游戏喜欢把所有的资源图片都放在一张大图上:
所以,接下来,我们还要把大图中的飞机图片截取出来。
此外,飞机还要带一点动画特效,即飞机的喷气。飞机的喷气效果是通过两张图片交替显示来达到的,因此需要截取第2行的图片1和第4行的图片2。
在pygame中,把屏幕上所有显示的元素都视为一个surface。载入的图片也是一个surface。
而surface对象有一个subsurface()方法可以截取大图的一部分。
截取时,需要指定一个矩形。
(如何才能知道子图形的坐标位置呢?从GitHub上下载的程序包中,resources/image/shoot.pack文件说明了每个子图形的坐标位置)
下面是完整的源代码:
#!/usr/bin/python # -*- coding: UTF-8 -*- import pygame from sys import exit SCREEN_WIDTH = 480 # 屏幕宽度 SCREEN_HEIGHT = 640 # 屏幕高度 # pygame.init()将会初始化所有导入的pygame模块 pygame.init() # set_mode()函数将会创建一个显示面板(surface),即游戏窗口 # 参数一为surface的分辨率,即窗口的大小 # 参数二为surface的显示模式 # 参数三为surface的位深 screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # set_caption()函数设置窗口的标题 pygame.display.set_caption('飞机游戏') # 载入图片 bg = pygame.image.load('bg1.jpg') # 以下行是新增代码 ticks = 0 # 一个计数器 shoot_img = pygame.image.load('shoot.png') # 载入大图 hero_rect1 = pygame.Rect(0, 99, 102, 126) # 定义矩形1 hero_rect2 = pygame.Rect(165, 360, 102, 126) # 定义矩形2 hero_img1 = shoot_img.subsurface(hero_rect1) # 截取子图形1 hero_img2 = shoot_img.subsurface(hero_rect2) # 截取子图形2 hero_pos = [200, 500] clock = pygame.time.Clock() # 新增代码 while True: clock.tick(60) # 新增代码 # 在surface上绘图,参数一是图像,参数二是左上角的位置 screen.blit(bg, [0, 0]) # 以下行是新增代码 if ticks % 50 < 25: screen.blit(hero_img1, hero_pos) else: screen.blit(hero_img2, hero_pos) ticks += 1 # 更新屏幕 pygame.display.update() # pygame.event.get()方法可以从事件队列得到所有事件的列表 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit()
程序运行结果: