今天正式学习Pygame


学习环境


  • Python版本3.7
  • pygame版本2.0.1
  • Pycharm社区版
  • windowns10 64位

适合人群


  • 本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉Python基础知识加深巩固。
  • 如果不懂Python, ​点击学习Python基础视频​

跳跃的小球

目标:


  • 创建一个游戏窗口,然后在窗口内创建一个小球,以一定的速度移动小球
  • 当小球碰到游戏窗口的边缘时,小球弹回,继续运动按照
    效果图
    ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_pygame

实现步骤说明

创建游戏窗口

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口

代码解析:


  • 首先导入pygame模块
  • 调用init()方法初始化pygame模块
  • 接下来,设置窗口的宽和高,最后使用display模块显示窗体

display模块的常用方法

❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_窗口大小_02

窗口显示

运行第一步的代码后会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,​会自动关闭

如果想要让窗口一直显示,需要使用while True让程序一直执行,此外,还需要设置关闭按钮。具体代码如下:

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口

while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()

pygame.quit() # 退出pygame

代码解析:


  • 代码中添加了轮询事件检测。pygame.event.get()能够获取事件队列
  • 使用for…in遍历事件,然后根据type属性判断事件类型。这里的事件处理方式与GUI类似,如event.type等于pygame.QUIT表示检测到关闭pygame窗口事件,pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件等。

加载游戏图片


  • 在窗口添加小球。我们先准备好一张ball.png
  • 加载该图片,最后将图片显示在窗口中

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.png') # 加载图片
ballrect = ball.get_rect() # 获取矩形区域

while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()
screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
screen.blit(ball, ballrect) # 将图片画到窗口上
pygame.display.flip() # 更新全部显示

pygame.quit() # 退出pygame

❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_python_03


  • 代码中使用iamge模块的load()方法加载图片,返回值ball是一个Surface对象。
  • Surface是用来代表图片的pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。
  • 事实上,屏幕也只是一个Surface,pygame.display.set_mode()就返回了一个屏幕Surface对象。
  • 如果将ball这个Surface对象画到screen Surface 对象,需要使用blit()方法,最后使用display模块的flip()方法更新整个待显示的Surface对象到屏幕上。

Surface对象的常用方法

❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_窗口大小_04

移动图片


  • 让小球动起来,ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以用于移动矩形。
  • move(x, y)函数有两个参数

  • 第一个参数是 X 轴移动的距离,
  • 第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。

  • 为实现小球不停移动,将move()函数添加到while循环内,

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.png') # 加载图片
ballrect = ball.get_rect() # 获取矩形区域

speed = [5, 5] # 设置移动的X轴、Y轴
while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()
ballrect = ballrect.move(speed) # 移动小球
screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
screen.blit(ball, ballrect) # 将图片画到窗口上
pygame.display.flip() # 更新全部显示

pygame.quit() # 退出pygame

碰撞检测


  • 上述代码,发现小球在屏幕中一闪而过,小球并没有真正消失,而是移动到窗体之外,
  • 此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.png') # 加载图片
ballrect = ball.get_rect() # 获取矩形区域
speed = [5, 5] # 设置移动的X轴、Y轴

while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()

ballrect = ballrect.move(speed) # 移动小球
# 碰到左右边缘
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
# 碰到上下边缘
if < 0 or ballrect.bottom > height:
speed[1] = -speed[1]

screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
screen.blit(ball, ballrect) # 将图片画到窗口上
pygame.display.flip() # 更新全部显示

pygame.quit() # 退出pygame

❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_初始化_05

限制小球移动速度


  • 代码看似有很多球,这是因为运行上述代码的时间非常短,运行快的错觉
  • 使用pygame的time模块,使用pygame时钟之前,必须先创建Clock对象的一个实例,然后在while循环中设置多长时间运行一次

# -*- coding: utf-8 -*-
# @Author : 一凡

# 导入模块
import pygame
import sys

pygame.init() # 初始化pygame
pygame.display.set_caption("小游戏")# 设置窗口标题
size = width, height = 900, 600 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (0, 0, 0) # 设置颜色
ball = pygame.image.load('ball.png') # 加载图片
ballrect = ball.get_rect() # 获取矩形区域
speed = [5, 5] # 设置移动的X轴、Y轴
clock = pygame.time.Clock() # 设置时钟

while True: # 死循环确保窗口一直显示
clock.tick(60) # 每秒执行60次
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()

ballrect = ballrect.move(speed) # 移动小球
# 碰到左右边缘
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
# 碰到上下边缘
if < 0 or ballrect.bottom > height:
speed[1] = -speed[1]

screen.fill(color) # 填充颜色(设置为0,执不执行这行代码都一样)
screen.blit(ball, ballrect) # 将图片画到窗口上
pygame.display.flip() # 更新全部显示

pygame.quit() # 退出pygame

总结

❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码_窗口大小_06

如果想学习交流,就快加入:893694563,群内学软件测试,分享技术和学习资料,陪你一起成长和学习。那就:码上开始