Pygame教程

Python中的pygame游戏模块的使用

Pygame 是一组用来开发游戏软件的 Python 程序模块,Pygame 在 SDL(Simple DirectMedia Layer) 的基础上开发而成。它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块,擅长开发 2D 游戏,Python 也提供了开发 3D 游戏的软件包,比如 Pyglet、Panda3D、PyOgre 等。Pygame 是一个高可移植性的模块可以支持多个操作系统。用它来开发小游戏非常适合。官网https://www.pygame.org/news

pygame模块的安装

若使用pygame模块(python的2D游戏开发库),这是第三方(扩展)模块,若未预先装,需要在CMD中,使用 pip install pygame 先装入,可能需要花点时间。

查看是否电脑上是否有pygame,在CMD中,使用pip list命令,参见下图
在这里插入图片描述

若没有 pygame,需要在CMD中,使用 pip install pygame 命令安装,参见下图:
在这里插入图片描述

验证是否成功安装

法一、在CMD中,使用python -m pygame.examples.aliens命令验证,参见下图:
在这里插入图片描述

法二、进入Python的交互界面,输入以下命令验证是否成功安装,参见下图:
在这里插入图片描述

不报错,则说明安装成功。

pygame快速入门

Pygame的坐标原点(0,0)点位于左上角,X轴自左向右,Y轴自上向下,单位为像素,参见下图:
在这里插入图片描述

在游戏中,所有可见的元素都是以矩形区域来描述位置的;

pygame专门提供了一个类Rect 用于 描述矩形区域,格式:

Rect(x,y,width,height)

Pygame的Rect对象,表示的区域必须位于一个 Surface 对象之上,比如游戏的主窗口(screen)。上述方法由四个关键参数值构成,分别是 left、top、width、height

pygame. Rect(left, top, width, height)

display 用于创建、管理游戏窗口

pygame.display.set_mode() #初始化游戏显示窗口

pygame.dispaly.update() #刷新屏幕内容显示,稍后使用

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

pygame开发游戏的大体框架结构如下:

import pygame
 
# 初始化pygame
pygame.init()
 
# 创建游戏的窗口  350 * 573(宽,高);注意:此窗口的大小是依据游戏的背景图片而设定的
screen=pygame.display.set_mode((350,600))
 
# 游戏循环
while True:
    pass
 

示例代码如下:

# 导入所需的模块
import pygame
import sys
# 导入所有pygame.locals里的变量(比如下面大写的QUIT变量)
from pygame.locals import *
 
# 初始化pygame
pygame.init()
 
# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((450, 300))
 
# 设置窗口标题
pygame.display.set_caption('Hello World')
 
# 程序主循环
while True:
 
  # 获取事件
  for event in pygame.event.get():
    # 判断事件是否为退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()
 
  # 绘制屏幕内容
  pygame.display.update()
 

运行之,显示如下:

Pygame设置窗口图标和设置窗口背景图片

#设置窗口图标,下面两句
icon = pygame.image.load(“./images/xyicon.png”) # 加载图像数据
pygame.display.set_icon(icon) #设置图标

#设置窗口背景图片,下面三两句
bg = pygame.image.load(“./images/background.png”) # 加载图像数据
screen.blit(bg,(0,0)) #绘制图像 blit(图像,位置);
pygame.display.update() #更新屏幕显示

在前面示例代码,设置窗口标题之后,添加设置窗口图标和设置窗口背景图片:

运行之,如下图所示:

Pygame播放音频

有两个方法:

☆播放特效声音:

pygame.mixer.Sound(filename)

该方法返回一个Sound对象,调用它的.play( )方法,即可播放较短的音频文件(如游戏中的枪炮声等);

☆播放背景音乐:

pygame.mixer.music.load(filename)

该方法用来加载背景音乐,之后调用pygame.mixer.music.play( )方法就可以播放背景音乐(在同一个时刻只允许加载一个背景音乐)

#加载并播放一个特效音频文件)

sound = pygame.mixer.Sound(‘./music/alter.mp3’)

sound.play()

#加载背景音乐文件

pygame.mixer.music.load(‘./music/bgmusic.mp3’)

#播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒)

pygame.mixer.music.play(-1, 0.0)

可以在适当的地方,作为测试在背景图片之后插入播放音频代码段,当然音频文件需要准备好。

Pygame绘制图形

Pygame绘制图形的常用的方法:

☆ pygame.draw.line(Surface, color, start_pos, end_pos, width)此方法用于绘制一条线段

☆ pygame.draw.aaline(Surface, color, start_pos, end_pos, blend)此方法用于绘制一条抗锯齿的线

☆ pygame.draw.lines(Surface, color, closed, pointlist, width)此方法用于绘制一条折线

☆ pygame.draw.rect(Surface, color, Rect)此方法用于绘制一个矩形

☆ pygame.draw.rect(Surface, color, Rect, width)此方法用于绘制一个矩形框

☆ pygame.draw.ellipse(Surface, color, Rect)此方法用于绘制一个椭圆

☆ pygame.draw.ellipse(Surface, color, Rect, width)此方法用于绘制一个椭圆框

☆ pygame.draw.polygon(Surface, color, pointlist, width)此方法用于绘制一个多边形

☆ pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)此方法用于绘制一条弧线

☆ pygame.draw.circle(Surface, color, Rect, radius)此方法用于绘制一个圆

示例代码

# 导入需要的模块
import pygame, sys
from pygame.locals import *
from math import pi
 
# 初始化pygame
pygame.init()
 
# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((400,300))
 
# 设置窗口标题
pygame.display.set_caption('Drawing')
 
# 定义颜色
BLACK = ( 0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 255)
 
# 设置背景颜色
screen.fill(WHITE)
 
# 绘制一条线
pygame.draw.line(screen, GREEN, [10, 10], [50,30], 5)
 
# 绘制一条抗锯齿的线
pygame.draw.aaline(screen, GREEN, [10, 50],[50, 80],True)
 
# 绘制一条折线
pygame.draw.lines(screen, BLACK, False,[[10, 80], [50, 90], [200, 80], [220, 30]], 5)
 
# 绘制一个空心矩形
pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2)
 
# 绘制一个矩形
pygame.draw.rect(screen, BLACK, [150, 10, 50, 20])
 
# 绘制一个空心椭圆
pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2)
 
# 绘制一个椭圆
pygame.draw.ellipse(screen, RED, [300, 10, 50, 20])
 
# 绘制多边形
pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5)
 
# 绘制多条弧线
pygame.draw.arc(screen, BLACK,[210, 75, 150, 125], 0, pi/2, 2)
pygame.draw.arc(screen, GREEN,[210, 75, 150, 125], pi/2, pi, 2)
pygame.draw.arc(screen, BLUE, [210, 75, 150, 125], pi,3*pi/2, 2)
pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2)
 
# 绘制一个圆
pygame.draw.circle(screen, BLUE, [60, 250], 40)
 
# 程序主循环
while True:
 
  # 获取事件
  for event in pygame.event.get():
    # 判断事件是否为退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()
 
  # 绘制屏幕内容
  pygame.display.update()
 

运行之,显示如下:

Pygame绘制文字

Pygame不仅可以在屏幕上绘制形状,还可以将文本绘制到屏幕上。Pygame 提供了一些非常简单易用的函数,可以创建字体和文本。字体(font)是字体类型的一种描述,表示按照统一风格绘制的一整套的字母、数字、符号和字符,例如 宋体 和 Times New Roman 都是字体。

☆font.SysFont()函数来创建一个 Font 对象,这个函数有两个参数,第 1 个参数是字体名称,第 2 个参数是字体大小(以像素点为单位)

☆font.render()函数的参数:第 1 个参数是要绘制的文本的字符串;第 2 个参数指定是否想要抗锯齿的一个 Boolean 值,如果是 True,文本看上去更加平滑一些;第 3 个参数是用来渲染文本的颜色,这个例子中使用的是白色。

☆blit() 函数,将像素从一个 Surface 复制到另一个 Surface 之上。常用两个参数:第一个参数是某矩形图像(Surface实例),第二个参数用于指定绘制的位置。

示例代码

import pygame
import sys
from pygame.locals import *
 
pygame.init()
wS=pygame.display.set_mode((400,300)) #创建画布名称wS
WHITE=(255,255,255)
myString="Hello World!"
font = pygame.font.SysFont("Times New Roman", 48) #来创建 Font对象
text = font.render(myString, True, WHITE)
wS.blit(text, (100,150))  #将text复制到指定位置(100,150)
 
# 程序主循环
while True:
 
  # 获取事件
  for event in pygame.event.get():
    # 判断事件是否为退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()
 
  # 绘制屏幕内容
  pygame.display.update()
 

运行之,显示如下:

Pygame实现动画

由于人类眼睛的特殊生理结构,当所看画面的帧率高于24的时候,就会认为是连贯的。

帧率(Frame rate)是用于测量显示帧数的量度,所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)。

在原有坐标系的基础上添加偏移量,再重新绘制,依次一张一张的循环绘制下去,就会得到我们想要的物体移动的效果。

Pygame实现动画主要用到的方法:

☆ pygame.image.load(filename) 加载一张图片

☆pygame.Surface.blit(source, dest, area=None, special_flags = 0) 将图片绘制到屏幕相应坐标上(后面两个参数默认,可以不传)

☆pygame.time.Clock() 获得pygame的时钟

☆pygame.time.Clock.tick(FPS) 设置pygame时钟的间隔时间

示例代码如下:

# 导入需要的模块
import pygame, sys
from pygame.locals import *
 
# 初始化pygame
pygame.init()
 
# 设置帧率(屏幕每秒刷新的次数)
FPS = 30
 
# 获得pygame的时钟
fpsClock = pygame.time.Clock()
 
# 设置窗口大小
screen = pygame.display.set_mode((500, 400), 0, 32)
 
# 设置标题
pygame.display.set_caption('Animation')
 
# 定义颜色
WHITE = (255, 255, 255)
 
# 加载一张图片
img = pygame.image.load('./images/bird.png')
 
# 初始化图片的位置
imgx = 10
imgy = 10
 
# 初始化图片的移动方向
direction = 'right'
 
# 程序主循环
while True:
 
  # 每次都要重新绘制背景白色
  screen.fill(WHITE)
 
  # 判断移动的方向,并对相应的坐标做加减
  if direction == 'right':
    imgx += 5
    if imgx == 380:
      direction = 'down'
  elif direction == 'down':
    imgy += 5
    if imgy == 300:
      direction = 'left'
  elif direction == 'left':
    imgx -= 5
    if imgx == 10:
      direction = 'up'
  elif direction == 'up':
    imgy -= 5
    if imgy == 10:
      direction = 'right'
 
  # 该方法将用于图片绘制到相应的坐标中
  screen.blit(img, (imgx, imgy))
 
  for event in pygame.event.get():
    if event.type == QUIT:
      pygame.quit()
      sys.exit()
 
  # 刷新屏幕
  pygame.display.update()
 
  # 设置pygame时钟的间隔时间
  fpsClock.tick(FPS)

Pygame事件简介

pygame事件可以处理游戏中的各种事情,事件是一个概念,比如点击鼠标左键,按下一个键盘的按键,关闭窗口等等都是一个事件,pygame提供了一个函数来获取游戏的事件,并把他们存放在一个队列中,程序通过读取整个事件队列,来获取当前发生的时间,并作出响应。

Pygame常用的事件如下表:

示例代码:

# 导入需要的模块
import pygame, sys
from pygame.locals import *
 
# 定义颜色
WHITE = (255, 255, 255)
 
# 初始化pygame
pygame.init()
 
# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((500,400), 0, 32)
 
# 设置窗口的标题
pygame.display.set_caption('Event')
 
# 设置背景
screen.fill(WHITE)
 
# 程序主循环
while True:
 
  # 获取事件
  for event in pygame.event.get():
    # 判断事件是否为退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()
 
     
    # 获得鼠标按下的位置
    if event.type ==MOUSEBUTTONDOWN:
      print("鼠标按下:",event.pos)
 
    # 获得鼠标抬起的位置
    if event.type ==MOUSEBUTTONUP:
      print("鼠标抬起:",event.pos) 
 
    # 获得键盘方向键按下的事件  
    if event.type == KEYDOWN:
      if(event.key==K_UP or event.key==K_w):
        print("上")
      if(event.key==K_DOWN or event.key==K_s):
        print("下")
      if(event.key==K_LEFT or event.key==K_a):
        print("左")
      if(event.key==K_RIGHT or event.key==K_d):
        print("右")
      # 按下键盘的Esc键退出
      if(event.key==K_ESCAPE):
        # 退出pygame
        pygame.quit()
        # 退出系统
        sys.exit()
 
  # 绘制屏幕内容
  pygame.display.update()
  

效果图如下:

综合例子
下面给出综合例子

1、画一个小房子,房前有树,树顶上有太阳

先给出效果图:

源码如下:

import pygame
import sys
 
# 初始化pygame
pygame.init()
 
# 设置窗口尺寸
width, height = 861, 594
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('画图')
 
# 定义颜色
WHITE = (255, 255, 255)
ORANGE = (255, 165, 0)
BROWN = (165, 42, 42)
GREEN = (0, 128, 0)
RED = (255, 0, 0)
GRAY = (128, 128, 128)
 
# 绘制背景
screen.fill(WHITE)
 
# 画房子
pygame.draw.polygon(screen, GRAY, [(150, 300), (350, 300), (250, 200)])  # 房子的屋顶
pygame.draw.polygon(screen, ORANGE, [(150, 400), (350, 400), (350, 300), (150, 300)])  # 房子的底部
 
# 画房子的门和窗户
pygame.draw.rect(screen, WHITE, (180, 350, 30, 30))  # 窗户1
pygame.draw.rect(screen, WHITE, (230, 350, 40, 50))  # 门
pygame.draw.rect(screen, WHITE, (290, 350, 30, 30))  # 窗户2
 
# 画树1
pygame.draw.rect(screen, BROWN, (400, 300, 20, 100))  # 树干
pygame.draw.circle(screen, GREEN, (410, 250), 50)  # 树冠
 
# 画树2 
pygame.draw.rect(screen, BROWN, (560, 300, 40, 150)) # 绘制树干
# 绘制树冠
pygame.draw.circle(screen, GREEN, (550, 250), 50)
pygame.draw.circle(screen, GREEN, (620, 250), 50)
pygame.draw.circle(screen, GREEN, (590, 220), 50)
pygame.draw.circle(screen, GREEN, (560, 280), 50)
pygame.draw.circle(screen, GREEN, (610, 280), 50)
 
# 画太阳
pygame.draw.circle(screen, RED, (650, 50), 25)  # 太阳
 
# 刷新屏幕
pygame.display.flip()
 
# 保持窗口打开
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

2、用方向键控制小猫移动示例

需要两个素材文件:小猫图片 cat.png 和背景图片bg1.jpg,为简便将它们 和源码程序文件,放在同一文件夹中。

源码如下:

import sys
import pygame
from pygame.locals import *
 
def control_ball(event):
    speed = [x,y] =[0,0]# 设置相对位移
    speed_offset = 1 #小球的速度
 
# 如果事件的类型是 键盘输入,就根据方向键来求出速度的方向(默认是从左往右为1,从上往下为1)
    if event.type == KEYDOWN:
        if event.key == pygame.K_LEFT:
            speed[0] -= speed_offset
            event.key
 
        if event.key == pygame.K_RIGHT:
            speed[0] = speed_offset
            event.key
 
        if event.key == pygame.K_UP:
            speed[1] -= speed_offset
            event.key
 
        if event.key == pygame.K_DOWN:
            speed[1] = speed_offset
            event.key
 
    #如果没有方向键的输入,则速度为0,小球不动
    if event.type in (pygame.K_UP, pygame.K_LEFT, pygame.K_RIGHT, pygame.K_DOWN):
        speed = [0,0]
 
    return speed
    
#定义函数
def play_ball():
    pygame.init()#初始化
    window_size = Rect(0,0,600,440)#设置窗口的大小
    
    screen = pygame.display.set_mode(window_size.size)#设置窗口模式
    pygame.display.set_caption('hello  cat')#设置窗口标题
    ball_image = pygame.image.load('cat.png')#载入小球图片
    back_image = pygame.image.load('bg1.jpg')#载入背景图片
    ball_rect = ball_image.get_rect()# 获取小球图片所在的区域
 
    while True:
        #退出事件的处理
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
                
        control_speed = control_ball(event)#获取到小球的方向
        ball_rect = ball_rect.move(control_speed).clamp(window_size)#小球按照方向移动,并且不会移出窗口。
 
        screen.blit(back_image,(0,0))#设置窗口背景,位于(0,0)处,窗口左上角。
        screen.blit(ball_image, ball_rect)#把小球绘制到背景surface上。
 
        pygame.display.flip()#更新窗口内容       
 
#调用函数
play_ball()
 

3、拼图游戏

两种实现:点击交换式和拖动交换式

★拼图游戏之点击交换式

加载一张图片分块打乱,用户用鼠标单击两块图片则两块图片交换位置,拼图完成后提示成功。确保图像文件存在并与代码中指定的路径相匹配——我这里图片名是player.png,和源码文件放在同一文件夹中。

源码如下:

效果示意图如下:

★拼图游戏之拖动交换式

下面给出拼图游戏的另一种实现

功能:窗体上有两个按钮,单击"open"按钮加载的游戏图片,单击"start"按钮将加载的游戏图片分割成9小块打乱排列。游戏规则:将一个小块拖动到另一小块时,两小块图片将交换位置,当恢复原样时,提示"success!"。

源码如下:

在此就不给出效果示意图了,你可以试试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值