python之pygame模块实现飞机大战(一)

一、安装pygame

1.1 安装方法:

pip install pygame

1.2 查看是否安装成功:

import pygame
pygame.ver

1.3 参考文档

pygame模块的官方说明网站:https://www.pygame.org/docs/

二、飞机大战中需要用到的模块

pygame模块 功能 该模块下用到的方法
pygame.display 创建、管理游戏窗口 set_mode(); update()
pygame.draw 绘制形状、点、线
pygame.event 管理事件 get()
pygame.image 加载和存储图片 load()
pygame.key 读取键盘按键
pygame.Rect 管理矩形区域
pygame.sprite 操作、移动图像
pygame.time 管理时间和帧信息 Clock(); set_timer()
pygame.Surface 管理图像和屏幕 blit(),get_rect()

三、模块方法介绍

3.1 set_mode()方法,创建游戏窗口(屏幕)

set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
resolution表示制定屏幕(窗口)的大小,(width,height
flag, depth 默认,不改变

# 创建游戏窗口
screen = pygame.display.set_mode(400,700)

3.2 load()方法,加载图像数据

load(filename) -> Surface
filename表示图片的路径

# 加载图像  
bg = pygame.image.load("./images/background.png")
#./表示在当前工程文件下,也可以写完整的路径,python读取路径用正(左)斜杠
bg = pygame.image.load("D:/images/background.png")

3.3 blit()方法,把图像加载到屏幕上

blit(source, dest, area=None, special_flags = 0) -> Rect
例如:blit(image,(x, y))

# 把图像加载到屏幕上,在画布上绘制图像
screen.blit(bg, (0, 0))

3.4 update()方法

display.update()会将画布上的最终结果显示在屏幕上。

3.5 应用——绘制背景、英雄、敌机并且显示在屏幕上

# 1> 创建游戏主窗口--屏幕(屏幕的width*height一般由背景图片的尺寸决定)
screen = pygame.display.set_mode(400,700)

# 2> 加载背景图像
bg = pygame.image.load("./images/background.png")
# 3> 将背景图像绘制到屏幕上
screen.blit(bg,(0,0))
# 4> 加载英雄图像
hero = pygame.image.load("./images/hero1.png")
# 5> 绘制英雄在屏幕的相对位置上
screen.blit(hero,(150,500))
# 6> 加载敌机图像
enemy = pygame.image.load("./images/enemy.png")
# 7> 绘制敌机在屏幕的位置上
screen.blit(enemy,(20,0))

# 8> 更新屏幕显示,非常重要
pygame.display.update() 

四、游戏初步理解

4.1 游戏坐标系

原点在左上角(0,0),x轴向右递增,y轴向下递增
python之pygame模块实现飞机大战(一)_第1张图片

4.2 描绘矩形区域的类pygame.Rect

Rect(x, y, width, height) -> Rect

python之pygame模块实现飞机大战(一)_第2张图片
x,y表示原点,left,top,bottom,right代表左,上,下,右四个矩形区域边界,center,centerx,centery分别表示矩形的正中心、矩形横向中心和矩形纵向中心,size,width,height分别表示矩形的尺寸(weidth*height)、矩形的宽和矩形的高

4.3 游戏的初始化和退出

pygame提供了两个方法进行游戏的初始化和退出

方法 说明
pygame.init() 导入并初始化所有 pygame 模块,使用其他模块之前,必须先调用 init 方法
pygame.quit() 卸载所有 pygame 模块,在游戏结束之前调用!

飞机大战游戏初始化示例

import pygame

pygame.init()

# 创建游戏的窗口 480 * 700
screen = pygame.display.set_mode((400, 700))

# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))

# 绘制英雄的飞机
hero = pygame.image.load("./images/hero1.png")
screen.blit(hero, (150, 400))

# 可以在所有绘制工作完成之后,统一调用update方法
pygame.display.update()

while True:
    pass   #函数内部没有代码可以用pass来保证代码的完整性

pygame.quit()

五、游戏循环和游戏时钟

基于前四步,已经把背景图像、英雄和敌机绘制到屏幕上了,那如何让其动起来呢?

5.1 游戏中的动画原理

首先来看一下下面这个动图,当我们快速翻书的时候,可以看到画中的图片就像动起来了一样。

  • 游戏中的动画原理——快速地在屏幕上绘制图像
  • 当每秒绘制60次,就能够达到非常连续、高品质的动画效果
    • 每次绘制的结果就叫做帧frame
    • 上面提到的update()方法每调用一次就是实现一次

5.2 游戏的循环

游戏的循环才意味着游戏的真正开始

游戏一般由以下两个部分组成
python之pygame模块实现飞机大战(一)_第3张图片
变化图像位置 —— 动画效果

  • 每隔 1 / 60 秒 移动一下所有图像的位置
  • 调用 pygame.display.update() 更新屏幕显示

5.3 游戏时钟

Clock() -> Clock

  • pygame 专门提供了一个类 pygame.time.Clock
    • 可以非常方便的设置屏幕绘制速度 —— 刷新帧率
  • 要使用 时钟对象 需要两步:
    • 1)在 游戏初始化 创建一个 时钟对象
    • 2)在 游戏循环 中让时钟对象调用 tick(帧率) 方法
#创建游戏时钟对象
clock = pygame.time.Clock()
i = 0
#游戏循环
while True:

    # 设置屏幕刷新帧率
    clock.tick(60)
   # 这里的 print 将会每1/60秒输出一个数字
    print(i)
    i += 1

5.4 飞机循环飞行

import pygame

#游戏的初始化
pygame.init()

#创建游戏窗口  338*600
screen = pygame.display.set_mode((338, 600),0,0)

#加载图像数据
bg = pygame.image.load("./images/background.png")
screen.blit(bg,(0,0))
hero1 = pygame.image.load("./images/hero1.png")
screen.blit(hero1,(120,400))

#创建游戏时钟
clock = pygame.time.Clock()

#1.记录飞机的初始位置
hero_rect = pygame.Rect(120,400,100,124)

#游戏循环,意味着游戏的正式开始
while True:
   clock.tick(60)  # 1s 执行一次循环体
   # 2. 更改飞机位置
   hero_rect.y -= 1

   # 判断飞机是否飞出屏幕上方
   if hero_rect.y <= 0:
       hero_rect.y = 600

   # 3.利用blit方法绘制图像
   screen.blit(bg, (0, 0))  #先绘制背景图 可以消除飞机的残影
   screen.blit(hero1, hero_rect)
   # 4.update更新图像
   pygame.display.update()

pygame.quit()

六、游戏的监听事件

6.1 事件

事件event:就是指用户在游戏操作过程中的认为操作,比如鼠标、键盘的操作

6.2 监听

监听就是在游戏循环中捕获用户的具体操作,然后进行相应的响应操作

6.3 代码实现

get() -> Eventlist
pygame.event.get() 可以获得 用户当前所做动作 的 事件列表

** 判断用户是否点击了关闭按钮

# 游戏循环
while True:

    # 设置屏幕刷新帧率
    clock.tick(60)

    # 事件监听
    for event in pygame.event.get():

        # 判断用户是否点击了关闭按钮
        if event.type == pygame.QUIT:
            print("退出游戏...")

            pygame.quit()

            # 直接退出系统
            exit()

你可能感兴趣的:(Python)