飞机大战

可以将图片素材绘制到游戏的窗口上,开发游戏之前需要先知道如何建立游戏窗口!

游戏的初始化和退出

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

游戏中的坐标系

坐标系

  • 原点在左上角(0, 0)
  • x轴水平方向向右,逐渐增加
  • y轴垂直方向向下,逐渐增加
  • 在游戏中,所有可见的元素都是以矩形区域来描述位置的
    • 要描述一个矩形区域有四个要素:(x, y)(width, height)
  • pygame专门提供了一个类 pygame.Rect 用于描述矩形区域
    Rect(x, y, width, height) -> Rect
    pygame.Rect是一个比较特殊的类,内部知识封装了一些数字计算,不执行pygame.init()方法同样能够直接使用

创建游戏主窗口

pygame 专门提供了一个模块 pygame.display用于创建、管理游戏窗口

方法 说明
pygame.display.set_modle() 初始化游戏显示窗口
pygame.display.update() 刷新屏幕内容显示,稍后使用

set_mode 方法
set_mode(resolution(0, 0), flags=0,depth=0)->Surface

  • 作用–创建游戏显示窗口
  • 参数
    • resolution指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
    • flags参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
    • depth 参数表示颜色的数位,默认自动匹配
  • 返回值
    • 暂时可以理解为游戏的屏幕,游戏的元素都需要被会知道游戏的屏幕上
  • 注意:必须使用变量记录set_mode方法的返回结果!因为:后续的图像都基于这个返回结果

简单的游戏循环

  • 为了做到游戏程序启动后,不会立即退出,通常会在游戏程序中增加一个游戏循环

  • 所谓游戏循环就是一个无限循环

  • 在创建游戏窗口代码下方,增加一个无限循环

    • 注意:游戏窗口不需要重复创建
  • 游戏由两个部分组成
    游戏初始化:
    1,设置游戏窗口。
    2,绘制图像初始位置。
    3,设置游戏时钟
    游戏循环:
    1,设置刷新帧率。
    2,检测用户交互。
    3,更新所有图像位置。
    4,更新屏幕显示

理解图像并实现图片绘制

  • 在游戏中,能看到的游戏元素大多都是图像
    • 图像文件时保存在磁盘上的,如果需要使用,第一步就需要被加载到内存
  • 要在屏幕上看到某一图像内容,需要按照三个步骤:
    1. 使用 pygame.image.load() 加载图像的数据
    2. 使用游戏屏幕对象,调用 blit(图像,位置) 方法将图像绘制到指定位置
    3. 调用 pygame.display.update() 方法更新整个屏幕的显示1.

提示:先要在屏幕上看到绘制的结果,就一定要调用 pygame.display.update( ) 方法

理解update() 方法的作用

可以在 screen 对象完成所有 blit 方法治好,统一调用一次 display.update 方法,统一可以在屏幕上看到最终的绘制结果

  • 使用display.set_mode()创建的 screen 对象时一个内存中的屏幕数据对象
    • 可以理解成是油画中的画布
  • screen.blit 方法可以在画布上绘制很多图像
    • 这些图像有可能会彼此重叠或者覆盖
  • display.update() 会将画布的最终结果绘制在屏幕上,这样可以提高屏幕的绘制效率,增加游戏的流畅度

每一次调用update()方法之前,需要把所有的游戏图像都重新绘制一遍,而且应该最先重新绘制背景图像

游戏时钟

  • pygame专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度——刷新帧率
  • 要使用时钟对象需要两步:
    • 1,在游戏内初始化创建一个时钟对象
    • 2,在游戏循环中让时钟对象调用 tick(帧率) 方法
  • tick 方法会根据上次被调用的时间,自动设置游戏循环中的延时

在游戏循环中监听事件

代码实现

  • pygame 中通过pygame.event.get() 可以获得用户当前所做动作的事件列表
    • 用户可以同一时间做很多事情
  • 提示:这段代码非常的固定,几乎所有的pygame游戏都大同小异
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while True:
# 可以指定循环体内代码执行的帧率
clock.tick(60)

# 捕获对象,事件监听
even_list = pygame.event.get()
for event in even_list:
if event.type == pygame.QUIT:
print("退出游戏。。")
# 卸载所有模块
pygame.quit()

# 直接退出系统
exit()

title: 飞机大战续
date: 2019-08-08 15:34:01

tags:

精灵和精灵组

为了简化开法步骤,pygame提供了两个类
pygame.sprite.Sprite ——存储图像数据image和位置rect的对象
pygame.sprite.Group

精灵(需要派生子类)

1
2
3
4
image 记录图像数据
rect 记录在屏幕上的位置
update(*arge):更新精灵位置
kill():从所有组中删除

精灵组

1
2
3
4
5
__init__(self, * 精灵):
add(*spriites) :向组中增加精灵
sprites():返回所有精灵列表
update(*args ):让组中所有精灵调用 update方法
draw(Surface):将组中所有精灵的 image,绘制到 Surface的 rect 位置

游戏

  • 游戏初始化:

    1. 创建精灵
    2. 创建精灵组
  • 游戏循环

    1. 精灵组.update()
    2. 精灵组.draw(screen)
    3. pygame.display.update()
派生精灵子类

1,新建 plane_sprites.py 文件
2,定义 GameSpriiite 继承自 pygame.sprite.Sprite
注意

  • 如果一个类的父类不是object
  • 在重写初始化方法时,一定要先 super() 一下父类的__init__方法
  • 保证父类中实现的__init__代码能够正常执行
1
2
3
4
5
6
GameSprite:
image
rect
speed
__init__(self, image_name, speed=1):
update(self):

属性

  • image 精灵图像,使用 image_name 加载
  • rect 精灵大小,默认使用图像大小
  • speed 精灵移动速度,默认为1

方法

  • update 每次更新屏幕时在游戏循环内调用
  • 让精灵的 self.rect.y += self.speed

提示

  • image 的 get_rect() 方法,可以返回 pygame.Rect(0,0,图像宽, 图像高)的对象

使用游戏精灵和精灵组创建敌机

步骤
1,使用 from 导入 plane_sprites模块

  • from 导入的模块可以直接使用
  • import导入的模块需要通过 模块名. 来使用

2,在游戏初始化创建精灵对象的精灵组对象
3,在游戏循环中,让经理组分别调用 update() 和 draw(screen)方法

职责

  • 精灵
    • 封装图像 image、位置rect 和速度 speed
    • 提供 update() 方法,根据游戏需求,更新位置 rect
  • 精灵族
    • 包含多个精灵对象
    • update方法,让精灵中的所有精灵调用update方法更新位置
    • draw(screen) 方法,在 screen 上绘制精灵组中的所有精灵

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至gxnucgb@qq.com

文章标题:飞机大战

文章字数:1.8k

本文作者:陈桂彬

发布时间:2019-08-07, 22:32:56

最后更新:2019-08-08, 16:13:23

原始链接:https://github.com/gxnucgb/gxnucgb.github.io/2019/08/07/飞机大战/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github