Python的Pygame游戏框架(汇总)


一、前言

  • 个人主页: ζ小菜鸡
  • 大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Python的Pygame游戏框架。
  • 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)

二、初识pygame

  pygame是跨平台Python模块,专为电子游戏设置,包含图像、声音。创建在SDL(Simple Direct Medica Layer)基础上,允许实时电子游戏研发而无须被如C语言或汇编语言约束,基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)完全简化为游戏逻辑本身,所有的资源结构都可以由Python提供。

1.安装pygame

  pygame的官方网址是www.pygame.org。在该网址中可以查找pygame的相关文档。pygame的安装非常简单,只需要如下一行命令:

pip install pygame

  运行结果如下所示:

在这里插入图片描述

  接下来,检测一下pygame是否安装成功。打开IDLE,输入如下命令:

import pygame
pygame.ver

  如果运行如下图示,则说明安装成功了。

在这里插入图片描述


2.pygame 常用模块

  用pygame做游戏开发的优势在于不需要过多地考虑底层相关的内容,而可以把工作的重心放在游戏逻辑上。例如,pygame中集成了很多和底层相关的模块,如访问显示设备、管理事件、使用字体等。pygame的常用模块如下表所示:

模块名称 功能
pygame.cdrom 访问光驱
pygame.cursors 加载光标
pygame.display 访问显示设备
pygame.draw 绘制形状、线和点
pygame.event 管理事件
pygame.font 使用字体
pygame.image 加和存储图片
pygame.joystick 使用游戏手柄或类似的东西
pygame.key 读取键盘按键
pygame.mixer 声音
pygame.mouse 鼠标
pygame.movie 播放视频
pygame.overlay 访问高级视频叠加
pygame.rect 管理矩形区域
pygame.sndarray 操作声音数据
pygame.sprite 操作移动图像
pygame.surface 管理图像和屏幕
pygame.surfarray 管理点阵图像数据
pygame.time 管理时间和帧信息
pygame.transform 缩放和移动图像

  下面,使用pygame的display模块和event模块创建一个pygame窗口,代码如下:

# -*- coding: utf-8 -*-
import sys  # 导入sys模块
import pygame  # 导入pygame模块

pygame.init()  # 初始化pygame模块
size = width, height = 320, 240  # 设置窗口
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 的基础使用

  pygame 有很多模块,每个模块又有很多方法,在此不能逐一讲解,所以,我们通过一个实例来学习pygame,然后再分解代码,讲解代码中的模块。

  示例:制作一个跳跃的兔子游戏

  创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动。可以按照如下步骤实现该功能:

  (1)创建一个游戏窗口,宽和高设置为640*480。代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口

  上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块。接下来,设置窗口的宽和高,最后使用display模块的常用方法如下表所示:

方法名称 功能
pygame.display.init 初始化display模块
pygame.display.quit 结束display模块
pygame.display.get_init 如果display模块已经被初始化,则返回True
pygame.display.set_mode 初始化一个准备显示的界面
pygame.display.get_surface 获取当前的surface对象
pygame.display.flip 更新整个待显示的surface对象到屏幕上
pygame.display.update 更新部分内容显示到屏幕上,如果没有参数则与flip功能相同

  (2)运行上述代码,会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果让窗口一直显示,需要使用while True语句让程序一直执行,此外,还需要设置关闭按钮,具体代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
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表示鼠标按下事件。


  (3)在窗口中添加小兔子。先准备好一张ball.png图片,然后加载该图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame
from pygame.locals import *

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色

ball = pygame.image.load("ball.png")  # 加载图片
space = pygame.transform.smoothscale(ball, (100, 100))
ballrect = space.get_rect()  # 获取矩形区域

myfont = pygame.font.Font(None, 60)
textImage = myfont.render("小兔子游戏", True, color)

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

pygame.quit()  # 退出pygame

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

方法名称 功能
pygame.Surface.blit 将一个图像画到另外一个图像上
pygame.Surface.convent 转换图像的像素格式
pygame.Surface.convent_alpha 转化图像的像素格式,包含alpha通道的转换
pygame.Surface.fill 使颜色填充Surface
pygame.Surface.get_rect 获取Surface的矩形区域

  运行上述代码,结果如下图所示:

在这里插入图片描述


  (4)下面该让小兔子动起来了。ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以使用移动矩形。move(x,y)函数有两个参数:第一参数是x轴移动距离;第二个参数是y轴移动距离。窗口左上角坐标为(0,0),如果使用move(100,50),如图所示:

在这里插入图片描述
  为了实现小兔子不停的移动,将move()函数加到while循环中,具体代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame
from pygame.locals import *

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色

ball = pygame.image.load("ball.png")  # 加载图片
space = pygame.transform.smoothscale(ball, (100, 100))
ballrect = space.get_rect()  # 获取矩形区域

myfont = pygame.font.Font(None, 60)
textImage = myfont.render("小兔子游戏", True, color)
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)  # 填充颜色
    screen.blit(space, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部窗口

pygame.quit()  # 退出pygame


  (5)运行上述代码,发现小兔子在屏幕中一闪而过,此时,小兔子并没有消失,而是移动到窗口之外,此时添加碰撞检测功能。当小兔子与窗体任何一边缘发生碰撞,则更改小兔子的移动方向。具体代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame
from pygame.locals import *

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色

ball = pygame.image.load("ball.png")  # 加载图片
space = pygame.transform.smoothscale(ball, (100, 100))
ballrect = space.get_rect()  # 获取矩形区域

myfont = pygame.font.Font(None, 60)
textImage = myfont.render("小兔子游戏", True, color)
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 ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]
        
    screen.fill(color)  # 填充颜色
    screen.blit(space, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部窗口

pygame.quit()  # 退出pygame

  上述代码中,添加了碰撞检测功能。如果碰撞到左右边缘,更改x轴数据为负数;如果碰撞到上下边缘,更改y轴数据为负数,则运行结果如下图:

在这里插入图片描述


  (6)运行上述代码,发现好像有多个小兔子在飞快的移动,这是因为代码事件非常短,导致肉眼观察出现错觉,因此需要添加一个“时钟”来控制运行的时间。这时需要使用pygame的time模块。使用pygame时钟之前,必须创建Clock对象的一个实例,然后在While循环中设置多长时间运行一次。具体代码如下:

'''
csdn作者:ζ小菜鸡
'''

# _*_ coding:utf-8 _*_

import sys  # 导入模块sys
import pygame  # 导入模块pygame


pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色

ball = pygame.image.load("ball.png")  # 加载图片
space = pygame.transform.smoothscale(ball, (100, 100))

ballrect = space.get_rect()  # 获取矩形区域

myfont = pygame.font.Font(None, 60)
textImage = myfont.render("小兔子游戏", True, color)
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 ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色
    screen.blit(space, ballrect)  # 将图片画到窗口上
    pygame.display.flip()  # 更新全部窗口

pygame.quit()  # 退出pygame


  Python的Pygame游戏框架(汇总),到此就结束了,感谢大家阅读,如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)


猜你喜欢

转载自blog.csdn.net/weixin_45191386/article/details/129869342