pygame安装

1
2
3
4
# 安装
sudo pip3 install pygame
# 验证安装是否成功s
python3 -m pygame.examples.aliens

pygame使用

1
2
3
4
5
# 先init初始化,然后编写pygame代码,之后quit释放内存
import pygame
pygame.init()
# 功能代码区域
pygame.quit()

pygame.Rect:绘制矩形

1
2
3
4
5
6
7
8
9
# (x,y)是绘制矩形的起始点,(width,heigh)是绘制矩形的大小
# Rect提供多种参数:x,y,top,right,bottom,left,center,centerx,centery,size,width,height
ob = pygame.Rect(x, y, width, height)
# 打印矩形的尺寸
print(ob.size)
# 打印矩形的详细尺寸
print(ob.x)
# bottom = y + height,设置bottom为0相当于将图像置于屏幕的外边
ob.bottom = 0

pygame.display:绘制游戏主窗口

pygame.display.set_mode():初始化(创建)游戏显示窗口

  • 语法:

    set_mode(resolution=(0,0), flags=0, depth=0) –> Surface

  • 作用:

    创建游戏显示窗口

  • 参数:

    • resolution:指定的是屏幕的宽高,默认创建的窗口大小和屏幕一致
    • flags:指定屏幕的附加选项,例如是否全屏,默认不需要传递
    • depth:标识颜色的位数,默认自动匹配
  • 返回值:

    可以理解为绘制游戏的屏幕

  • 注意:

    使用set_mode()方法必须要用变量记录返回结果,因为所有的对象都是基于这个返回结果

pygame.image.load():加载图像数据

  • 背景:

    图像文件初始是保存在磁盘上的,如果要使用,第一步需要将其加载到内存中

  • 设计思路:

    1. 使用pygame.image.load()加载图像数据,

      file_path:是图片的路径

    2. 使用游戏屏幕对象,调用blit方法将图像绘制到指定位置

      图像对象:是第一步返回的对象

      (x, y):是图片放置的位置,当然也可以直接接受Rect方法绘制的对象

    3. 调用pygame.display.update()方法更新整个屏幕的显示,不调用则无法展示绘制的图像

      pygame.display.update():一次将之前所有的绘制结果更新到屏幕上

      img

  • 小知识:

    1. 动画本质上是多张静态图片连续、快速播放的结果,游戏画面也是

    2. 利用get_rect()方法可以获得图片的属性

      1
      2
      image = pygame.image.load(file_path)
      image.get_rect() # 该方法可以返回pygame.Rect(0, 0, 图像宽, 图像高)中的对象

pygame.time:设置屏幕更新

pygame.time.Clock():设置屏幕的绘制速度

  • 背景:

    希望将屏幕的绘制速度设定在每秒60帧左右

  • 设计思路;

    1. 在游戏初始化时创建一个时钟对象

      1
      2
      # 游戏初始化时生成时钟对象
      clock = pygame.time.Clock()
    2. 在游戏循环中让时钟对象调用**tick(帧率)**方法

      1
      2
      # 循环体内部执行更新频率为60
      clock.tick(60)
    3. tick方法会根据上次被调用的时间,自动设置游戏循环中的延时

pygame.time.set_timer(eventid, milliseconds):设置定时任务

  • 作用

    1. 程序每隔一段时间,都需要去执行一些动作,这时就引入了定时器,它可以创建一个事件
    2. 可以在游戏循环中使用事件监听的方法捕获到该事件
  • 参数:

    1. eventid:事件代号,需要基于常量event.USEREVENT来指定(USEREVENT是一个整数,再增加的事件可以使用USEREVENT+1指定,以此类推)
    2. milliseconds:事件触发的间隔毫秒值
  • 返回值

    None

  • 设计思路:

    1. 使用USEREVENT创建事件
      • 定义定时器常量 –> eventid
      • 初始化方法中,调用set_timer方法设定定时器事件
    2. 通过pygame.event.get()获取当前时刻所有的事件列表
    3. 通过遍历事件列表,判断event.type是否等于eventid,若相等,表示定时器事件发生

pygame.event:监听、处理用户的事件

pygame.event.get():获取用户当前所做动作的列表

  • 背景:

    事件event: 用户针对游戏所做的操作

    监听:在游戏循环中,判断用户的具体操作。只有捕获到用户具体的操作,才能有针对性的做出响应

  • 返回值:

    返回当前时刻,用户所有的操作事件。结果是一个列表

  • 设计思路

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 以监听事件终止为例
    while True:
    clock.tick(60)

    event_list = pygame.event.get()
    for event in event_list:
    if event.type == pygame.QUIT:
    print("游戏退出")
    pygame.quit()
    exit() # python中直接终止当前程序,可以直接使用exit()

pygame.sprite:封装类

注意

1
2
3
# 如果一个类的父类不是object,则在重写初始化方法时,一定要先super()一下父类的__init__方法
def __init__(self):
super().__init__()

pygame.sprite.Sprite():存储图像数据image和位置rect的对象

1
2
3
4
5
6
7
8
9
10
11
# 需要自定义创建精灵,本质上是将精灵的速度、图形进行同意管理
class Signal(pygame.sprite.Sprite):

def __init__(self, image, speed=1):
super().__init__() # 继承的类不是object类,所以一定要用super()初始化
self.image = pygame.image.load(image) # 图片加载只能用self.image,图片属性只能用self.rect
self.rect = self.image.get_rect() # 返回pygame.Rect(0, 0, 图像宽, 图像高)中的对象
self.speed = speed

def update(self, *args):
self.rect.y += self.speed

pygame.sprite.Group:统一管理Sprite创建的对象们

1
2
3
4
# 精灵组用于添加精灵类,便于界面图形绘制,切记需要用变量记录其返回值
group_list = pygame.sprite.Group(sprite1, sprite2) # 添加精灵组
group_list.update() # 用于更新每个精灵在界面中的位置
group_list.draw(screen) # 用于绘制屏幕的元素信息

pygame.sprite.groupcollide():检测精灵组们的碰撞

1
2
3
4
5
6
7
8
# 检测group1、group2中精灵们是否发生碰撞,发生碰撞后是否销毁碰撞的精灵
# group1:精灵组1
# group2:精灵组2
# dokill1:碰撞后,group1中碰撞的精灵是否销毁,True表示销毁,False表示不销毁
# dokill2:碰撞后,group2中碰撞的精灵是否销毁,True表示销毁,False表示不销毁
# collided:计算碰撞的回调函数,若没有指定,则每个精灵必须有rect属性
# 返回值:返回一个精灵字典
pygame.sprite.groupcollide(group1, group2, dokill1, dokill2, collided=None) --> sprite_dict

pygame.sprite.spritecollide():检测某个精灵与精灵组的碰撞

1
2
3
4
5
6
# 检测精灵sprite和精灵组group2中元素是否发生碰撞,
# sprite:精灵
# dokill:碰撞后,group中碰撞的精灵是否销毁,True表示销毁,False表示不销毁
# collided:计算碰撞的回调函数,若没有指定,则每个精灵必须有rect属性
# 返回值:返回精灵组中跟精灵发生碰撞的精灵列表
pygame.sprite.groupcollide(sprite, group, dokill, collided=None) --> sprite_list

pygame.key:监控用户事件

event_type:判断用户是否按下具体的按键

备注:该类方法每按一次只能触发一次事件

1
2
3
4
5
# 通过遍历事件列表,判断用户是否有按下某个按键
for event in pygame.event.get():
# 判断用户是否按下按键,并判断用户按下的是什么按键
if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
print("向右移动")

pygame.key.get_pressed():获取用户键盘的事件

备注:可以一直安装某个按键,并持续触发该方法

1
2
3
4
5
# 返回所有按键的元组。如果某个键被按下,对应的值为1
keys_pressed = pygame.key.get_pressed()
# 判断是否按下了方向键
if keys_pressed[pygame.K_RIGHT] == 1:
print("向右移动")

游戏初始化

image-20200627194223359

作业

  1. (问答)如何安装pygame模块,并验证安装结果是否成功
  2. (问答)简述pygame代码整体代码结构
  3. (问答)如何使用pygame绘制一个(200,600)的屏幕对象,绘制的对象含有哪些属性
  4. (问答)使用Rect绘制时是否需要实例化对象
  5. (问答)set_mode(resolution=(0,0), flags=0, depth=0) 中参数表示什么含义
  6. (问答)使用set_mode()方法时有哪些需要注意的地方
  7. (问答)如何使用一张图片作为游戏的背景,其具体的操作步骤是什么样的
  8. (问答)在pygame中当加载一张图片到内存中后,我们如何获取它的图片属性
  9. (问答)如何设置屏幕的刷新帧率,请描述它的实现方式
  10. (问答)如何设置定时器任务,请简述其实现方式
  11. (问答)如何监听用户结束任务的操作,请描述其实现方式
  12. (问答)当继承的类不是object时,其是否需要super().__init__()
  13. (问答)在pygame中有精灵这一说,试问pygame中精灵主要有什么作用
  14. (问答)在pygame中有精灵组这一说,试问pygame中精灵组主要有什么作用,并描述一下精灵组在使用过程中的方式
  15. (问答)描述一下精灵和精灵组的工作流程
  16. (问答)如何监控精灵组的碰撞
  17. (问答)如何监控精灵和精灵组的碰撞,且如何针对碰撞做出对精灵的反馈