Python游戏系列之二

    xiaoxiao2021-03-25  29

      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()

      程序运行结果:

    转载请注明原文地址: https://ju.6miu.com/read-149620.html

    最新回复(0)