当前位置:   article > 正文

Pygame教程(非常详细),鬼知道我经历了啥

pygame

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

参数函数如下:

  • size:表示 Surface 对象的矩形区域大小;
  • flags:功能标志位,有两个可选参数值 HWSURFACE 和 SPCALPHA,前者代表将创建的 Surface 对象存放于显存中,后者表示让图像的每一个像素都包含一个 alpha 通道
  • depth:指定像素的颜色深度,默认为自适应模式,由 Pygame 自动调节。

下面看一组简单的使用示例,如下所示:

import sys
import pygame
#使用pygame之前必须初始化
pygame.init()
#设置主屏窗口 ;设置全屏格式:flags=pygame.FULLSCREEN
screen = pygame.display.set_mode((400,400))
#设置窗口标题
pygame.display.set_caption(‘c语言中文网’)
screen.fill(‘white’)
#创建一个 50*50 的图像,并优化显示
face = pygame.Surface((50,50),flags=pygame.HWSURFACE)
#填充颜色
face.fill(color=‘pink’)
while True:

循环获取事件,监听事件

for event in pygame.event.get():

判断用户是否点了关闭按钮

if event.type == pygame.QUIT:
#卸载所有模块
pygame.quit()
#终止程序
sys.exit()

将绘制的图像添加到主屏幕上,(100,100)是位置坐标,显示屏的左上角为坐标系的(0,0)原点

screen.blit(face, (100, 100))
pygame.display.flip() #更新屏幕内容

最终的显示结果如下:

pygame surface对象
图1:程序运行结果

从上述运行结果可以看出,通过 Surface 模块,我们成功的在主屏幕上绘制一个 50 * 50 的矩形区域。注意,如果不设置尺寸,Surface 默认创建一个和主游戏屏幕同样大小的区域。

Surface 模块还提供了处理图像的其他方法,下表对它们做了简单的介绍。

方法说明
pygame.Surface.blit()将一个图像(Surface 对象)绘制到另一个图像上
pygame.Surface.convert()修改图像(Surface 对象)的像素格式
pygame.Surface.fill()使用纯色填充 Surface 对象
pygame.Surface.scroll()复制并移动 Surface 对象
pygame.Surface.set_alpha()设置整个图像的透明度
pygame.Surface.get_at()获取一个像素的颜色值
pygame.Surface.set_at()设置一个像素的颜色值
pygame.Surface.get_palette()获取 Surface 对象 8 位索引的调色板
pygame.Surface.map_rgb()将一个 RGBA 颜色转换为映射的颜色值
pygame.Surface.set_clip()设置该 Surface 对象的当前剪切区域
pygame.Surface.subsurface()根据父对象创建一个新的子 Surface 对象
pygame.Surface.get_offset()获取子 Surface 对象在父对象中的偏移位置
pygame.Surface.get_size()获取 Surface 对象的尺寸

除了使用 Surface 模块新建图像外,我们还可以使用另外一种方法从外部加载图像,如下所示:

pygame.image.load(“图片路径”).convert()

上述方法将被加载的图像作为 Surface 对象来使用,因此它可以调用上述表格中所有方法。注意,此处之所以使用 convert()来转换被加载图片的像素格式,是为了提升 Pygame 对图片的处理速度,该操作能够保证图像的像素格式与图片的显示格式是相同的。

通过 image.load() 方法可以加载游戏的背景图,或者游戏中使用的其他元素,比如的人物、道具等等。

下面看一组简单的示例:

import pygame
#引入pygame中所有常量,比如 QUIT
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500,250))
pygame.display.set_caption(‘c语言中文网’)
#加载一张图片
image_surface = pygame.image.load(“C:/Users/Administrator/Desktop/c-net.png”).convert()

rect(left,top,width,height)指定图片上某个区域

special_flags功能标志位,指定颜色混合模式,默认为 0 表示用纯色填充

image_surface.fill((0,0,255),rect=(100,100,100,50),special_flags=0)

200,100 表示图像在水平、垂直方向上的偏移量,以左上角为坐标原点

image_surface.scroll(100,50)

无限循环,让窗口停留

while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()

将图像放置在主屏幕上

screen.blit(image_surface,(0,0))
pygame.display.update()

程序运行结果如下所示:

pygame运行程序
图2:程序运行结果

Pygame Transform图像变形

pygame.transform 模块允许您对加载、创建后的图像进行一系列操作,比如调整图像大小、旋转图片等操作,常用方法如下所示:

方法说明
pygame.transform.scale()将图片缩放至指定的大小,并返回一个新的 Surface 对象。
pygame.transform.rotate()将图片旋转至指定的角度。
pygame.transform.rotozoom()以角度旋转图像,同时将图像缩小或放大至指定的倍数。

下面看一组简单的演示示例:

import pygame
#引入pygame中所有常量,比如 QUIT
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500,250))
pygame.display.set_caption(‘c语言中文网’)
#加载一张图片(455*191)
image_surface = pygame.image.load(“C:/Users/Administrator/Desktop/c-net.png”).convert()
image_new = pygame.transform.scale(image_surface,(300,300))

查看新生成的图片的对象类型

#print(type(image_new))

对新生成的图像进行旋转至45度

image_1 =pygame.transform.rotate(image_new,45)

使用rotozoom() 旋转 0 度,将图像缩小0.5倍

image_2 = pygame.transform.rotozoom(image_1,0,0.5)
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()

将最后生成的image_2添加到显示屏幕上

screen.blit(image_2,(0,0))
pygame.display.update()

程序的运行结果如下:

pygame程序运行结果
图1:程序运行结果

Pygame Time时间控制详解

pygame.time 时间控制模块,是 Pygame 中使用频率较高的模块,其主要功能是管理时间和游戏帧数率(即 FPS)。

时间在游戏开发中承担着非常重要的作用,比如释放某个技能所消耗的时间,或者播放动画、声音的持续时间,这些都需要时间来管理。time 模块另外一个重要作用是控制游戏帧数率(即 FPS),它是评价游戏画面是否流畅的关键指标。在一般情况下,计算机的 FPS 都能达到 60帧/s 的速度,这足够我们使用,如果当帧数小于 30 的时候,游戏画面就会变得卡顿。

注意,在 Pygame 中时间以毫秒为单位(1秒=1000毫秒),这样会使游戏的设计更为精细。

1) 游戏暂停

Pygame.time 模块提供了以下常用方法,如下表所示:

方法说明
pygame.time.get_ticks()以毫秒为单位获取时间
pygame.time.wait()使程序暂停一段时间
pygame.time.set_timer()创建一个定时器,即每隔一段时间,去执行一些动作
pygame.time.Clock()创建一个时钟对象来帮我们确定游戏要以多大的帧数运行

下面看一组简单的示例:

import pygame
pygame.init()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption(‘c语言中文网’)

获取以毫秒为单位的时间

t = pygame.time.get_ticks() #该时间指的从pygame初始化后开始计算,到调用该函数为止
t1 =pygame.time.wait(3000) #暂停游戏3000毫秒
print(t1)
#暂停t1时间后,加载图片
image_surface = pygame.image.load(“C:/Users/Administrator/Desktop/c-net.png”)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
screen.blit(image_surface,(0,0))
pygame.display.update()

上述程序在暂停 3 秒后才会加载图片,运行结果如下:

pygame程序
图1:程序运行结果

2) 设置游戏FPS

若想设置游戏的帧数率(FPS)可以通过 Clock() 方法来实现,该对象提供了以下常用方法:

方法说明
pygame.time.Clock.tick()更新clock对象
pygame.time.Clock.get_time()获取上一个tick中的时间
pygame.time.Clock.get_fps()计算clock对象的帧率

下面看一组简单的应用示例:

import pygame
pygame.init()
screen = pygame.display.set_mode((500,300))
pygame.display.set_caption(‘c语言中文网’)

获取以毫秒为单位的时间

t = pygame.time.get_ticks() #该时间指的从pygame初始化后开始计算,到调用该函数为止
t1 =pygame.time.delay(3000) #暂停游戏3000毫秒
print(t1)
#暂停t1时间后,加载图片
image_surface = pygame.image.load(“C:/Users/Administrator/Desktop/c-net.png”)
#创建时钟对象(控制游戏的FPS)
clock = pygame.time.Clock()
while True:
#通过时钟对象,指定循环频率,每秒循环60次
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
screen.blit(image_surface,(0,0))
pygame.display.update()

注意:FPS(游戏帧率)影响效果只有在动态图时才能显现出来,不过无论静态图还是动态图,它们的使用规则都是一样的。

Pygame Rect区域位置(图解)

Rect(rectangle)指的是矩形,或者长方形,在 Pygame 中我们使用 Rect() 方法来创建一个指定位置,大小的矩形区域。函数的语法格式如下:

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

Rect 表示的区域必须位于一个 Surface 对象之上,比如游戏的主窗口(screen)。上述方法由四个关键参数值构成,分别是 left、top、width、height,为了方便大家理解这些距离的含义,下面给出了一张示意图:

pygame Rect区域

注意:在 Pygame 中以游戏主窗口的左上角为坐标原点。

下面看一组简单的使用示例,如下所示:

import pygame
pygame.init()
screen = pygame.display.set_mode((500,300))
pygame.display.set_caption(‘c语言中文网’)
image_surface = pygame.image.load(“C:/Users/Administrator/Desktop/c-net.png”)
rect1 = pygame.Rect(50,50,100,100)

在原图的基础上创建一个新的子图(surface对象)

image_child= image_surface.subsurface(rect1)
rect2 = image_child.get_rect()
#输出的矩形大小为 100*100
print(rect2)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
#在屏幕上显示子图的区域
screen.blit(image_child,rect1)
pygame.display.update()

程序的运行结果如下:

pygame游戏程序
图1:程序运行结果

从上述运行结果可以看出,我们在图片上截取了一个和 rect1 同样大小的矩形区域(100*100)。

Rect(矩形区域)对象还提供了一些常用方法。如下表所示:

方法说明
pygame.Rect.copy()复制矩形
pygame.Rect.move()移动矩形区域,接受一个列表参数
pygame.Rect.move_ip()移动矩形(无返回)
pygame.Rect.inflate()增大或缩小矩形大小
pygame.Rect.clamp()将矩形移到另一个矩形内
pygame.Rect.union()返回一个两个矩形合并后的矩形。
pygame.Rect.fit()按纵横比调整矩形的大小或移动矩形。
pygame.Rect.contains()测试一个矩形是否在另一个矩形内
pygame.Rect.collidepoint()测试点是否在矩形内
pygame.Rect.colliderect()测试两个矩形是否重叠

同时 Rect 对象也提供了一些关于矩形大小的常用的属性,如下所示:

x,y 表示矩形距离 x、y 轴的距离
top, left, bottom, right #在坐标系内描述矩形的大小
topleft, bottomleft, topright, bottomright #返回一个描述矩形大小的元组
midtop, midleft, midbottom, midright #返回一个描述矩形大小的元组
center, centerx, centery #(centerx,centery)表示矩形中央坐标(x,y)的值
size, width, height
w,h #用于描述矩形的width、height

下面看一组简单的示例演示,如下所示:

import pygame

对应left/top/width/height

rect1 = pygame.Rect(0,0,100,100)
print(‘x的值是{};y的值是{}’.format(rect1.x,rect1.y))
print(‘bottom的值是{};right的值是{}’.format(rect1.bottom,rect1.right))

设置居中的距离

print(rect1.center,rect1.centerx,rect1.centery)

返回值为 (centerx,top)

print(rect1.midtop)

返回值为 (right,centery)的元组

print(rect1.midright)

返回值为(left,bottom)

print(rect1.bottomleft)

返回矩形区域大小,元组格式

print(rect1.size)

输出结果如下:

x的值是0;y的值是0
bottom的值是100;right的值是100
#设置中心努力
(50, 50) 50 50
(50, 0)
#midright
(100, 50)
#bottomleft
(0, 100)
#size
(100, 100)

我们还可以通过属性对来设置,或者者更改矩形区域的大小,如下所示:

rect1.left = 30
rect1.center = (70,70)

除了通过 Rect 对象来构造一个矩形区域之外,我们还可以使用rect属性来构建一个矩形区域。在 Pygame 中有许多函数都提供了rect属性,比如有下列函数:

surface.fill((0,0,255),rect=(100,100,100,50))

上述代码会在 surface 对象的区域内选定一个 rect 区域,并将该区域填充为蓝色(RGB(0,0,255))。

Pygame Event事件模块(详细示例)

事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等等,这些都可以看做是“事件”,Pygame 会接受用户产生的各种操作(或事件),这些操作随时产生,并且操作量可大可小,那么 Pygame 是如何处理这些事件的呢?

事件类型

Pygame 定义了一个专门用来处理事件的结构,即事件队列,该结构遵循遵循队列“先到先处理”的基本原则,通过事件队列,我们可以有序的、逐一的处理用户的操作(触发事件)。下述表格列出了 Pygame 中常用的游戏事件:

事件类型描述成员属性
QUIT用户按下窗口的关闭按钮none
ATIVEEVENTPygame被激活或者隐藏gain,state
KEYDOWN键盘按下unicode、key、mod
KEYUP键盘放开key、mod
MOUSEMOTION鼠标移动pos, rel, buttons
MOUSEBUTTONDOWN鼠标按下pos, button
MOUSEBUTTONUP鼠标放开pos, button
JOYAXISMOTION游戏手柄(Joystick or pad) 移动joy, axis, value
JOYBALLMOTION游戏球(Joy ball) 移动joy, axis, value
JOYHATMOTION游戏手柄(Joystick) 移动joy, axis, value
JOYBUTTONDOWN游戏手柄按下joy, button
JOYBUTTONUP游戏手柄放开joy, button
VIDEORESIZEPygame窗口缩放size, w, h
VIDEOEXPOSEPygame窗口部分公开(expose)none
USEREVENT触发一个用户事件事件代码

注意,当使用 Pygame 做游戏开发时,上述事件并非都会应用的到,因此在学习的过程中,我们要懂得触类旁通、举一反三。

事件处理方法

Pygame.event 模块提供了处理事件队列的常用方法,如下表所示:

方法说明
pygame.event.get()从事件队列中获取一个事件,并从队列中删除该事件
pygame.event.wait()阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态
pygame.event.set_blocked()控制哪些事件禁止进入队列,如果参数值为None,则表示禁止所有事件进入
pygame.event.set_allowed()控制哪些事件允许进入队列
pygame.event.pump()调用该方法后,Pygame 会自动处理事件队列
pygame.event.poll()会根据实际情形返回一个真实的事件,或者一个None
pygame.event.peek()检测某类型事件是否在队列中
pygame.event.clear()从队列中清除所有的事件
pygame.event.get_blocked()检测某一类型的事件是否被禁止进入队列
pygame.event.post()放置一个新的事件到队列中
pygame.event.Event()创建一个用户自定义的新事件

当我们使用 Pygame 处理事件时,逻辑一般都是相似的。首先是判断事件的类型,然后根据不同的事件操作,执行不同的游戏操作。因此这种情况非常适合使用 if … else 语句。如下所示:

while True:
#等待事件发生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
print(‘鼠标按下’,event.pos)
if event.type == pygame.MOUSEBUTTONUP:
print(‘鼠标弹起’)
if event.type == pygame.MOUSEMOTION:
print(‘鼠标移动’)

键盘事件

if event.type ==pygame.KEYDOWN:

打印按键的英文字符

print(‘键盘按下’,chr(event.key))
if event.type == pygame.KEYUP:
print(‘键盘弹起’)

下面应用上述方法对鼠标事件和键盘事件分别做简单的介绍。

处理键盘事件

键盘事件会涉及到大量的按键操作,比如游戏中的上下左右,或者人物的前进、后退等操作,这些都需要键盘来配合实现。

键盘事件提供了一个 key 属性,通过该属性可以获取键盘的按键。Pygame 将键盘上的字母键、数字键、组合键等按键以常量的方式进行了定义,下表列出了部分常用按键的常量:

常量名描述
K_BACKSPACE退格键(Backspace)
K_TAB制表键(Tab)
K_CLEAR清除键(Clear)
K_RETURN回车键(Enter)
K_PAUSE暂停键(Pause)
K_ESCAPE退出键(Escape)
K_SPACE空格键(Space)
K_0…K_90…9
K_a…Kza…z
K_DELETE删除键(delete)
K_KP0…K_KP90(小键盘)…9(小键盘)
K_F1…K_F15F1…F15
K_UP向上箭头(up arrow)
K_DOWN向下箭头(down arrow)
K_RIGHT向右箭头(right arrow)
K_LEFT向左箭头(left arrow)
KMOD_ALT同时按下Alt键

想要了解更多按键常量可参考官方文档,这里有您想要的更多知识 ———> 点击前往

下面通过“图片移动”示例来了解键盘事件的处理过程,如下所示:

import pygame
import sys

初始化pygame

pygame.init()

定义变量

size = width, height = 600, 400
bg = (255, 255, 255)

加载logo图

img = pygame.image.load(“C:/Users/Administrator/Desktop/logo.jpg”)

获取图像的位置

position = img.get_rect()

创建一个主窗口

screen = pygame.display.set_mode(size)

标题

pygame.display.set_caption(“C语言中文网”)

创建游戏主循环

while True:

设置初始值

site = [0, 0]
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

图像移动 KEYDOWN 键盘按下事件

通过 key 属性对应按键

if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
site[1] -= 8
if event.key == pygame.K_DOWN:
site[1] += 8
if event.key == pygame.K_LEFT:
site[0] -= 8
if event.key == pygame.K_RIGHT:
site[0] += 8

移动图像

position = position.move(site)

填充背景

screen.fill(bg)

放置图片

screen.blit(img, position)

更新显示界面

pygame.display.flip()

程序运行结果如下:

pygame event事件图像移动
图1:Pygame键盘事件——图像移动

处理鼠标事件

鼠标是计算机最重要外接设备之一,同时它也是游戏玩家必不可少的工具之一。

Pygame 提供了三个鼠标事件,分别是鼠标移动(MOUSEMOTION)、鼠标按下(MOUSEBUTTONDOWN)、鼠标释放(MOUSEBUTTONUP),不同事件类型对应着不同的成员属性。如下所示:

pygame.event.MOUSEMOTION鼠标移动事件

event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
event.rel 鼠标相对运动距离(X,Y),相对于上次事件
event.buttons 鼠标按钮初始状态(0,0,0),分别对应(左键,滑轮,右键),移动过程中点击那个键,相应位置变会为1

pygame.event.MOUSEBUTTONUP鼠标键释放事件

event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
event.button 鼠标释放键编号(整数)左键为1,按下滚动轮2、右键为3

pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件

event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
event.button 鼠标按下键编号(整数),左键为1,按下滚动轮2、右键为3,向前滚动滑轮4、向后滚动滑轮5

通过一组简单的示例对鼠标事件进行演示,示例代码如下:

import pygame
from random import randint

初始化程序

pygame.init()
screen = pygame.display.set_mode((450,400))
pygame.display.set_caption(“c语言中文网”)

更新显示

pygame.display.flip()
while True:
#等待事件发生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit(“成功退出”)
if event.type == pygame.MOUSEBUTTONDOWN:

pos 获取鼠标当前位置

print(‘鼠标按下’,event.pos)
mx,my = event.pos

调用 pygame.draw 模块画圆

pygame.draw.circle(screen,(255,255,0),(mx,my),50)

处理完,更新显示

pygame.display.update()
if event.type == pygame.MOUSEBUTTONUP:
print(‘鼠标弹起’)
pass
if event.type == pygame.MOUSEMOTION:
print(‘鼠标移动’)
mx, my = event.pos

随机生成 RGB 颜色值

r = randint(0,255)
g = randint(0,255)
b = randint(0,255)
pygame.draw.circle(screen, (r,g,b,),(mx, my), 50)

处理完,更新显示

pygame.display.update()

程序运行结果如下:

pygame鼠标事件
图2:Pygame鼠标事件——鼠标移动

Pygame Draw绘图函数详解

Pygame 中提供了一个draw模块用来绘制一些简单的图形状,比如矩形、多边形、圆形、直线、弧线等。

pygame.draw模块的常用方法如下表所示:

方法说明
pygame.draw.rect()绘制矩形
pygame.draw.polygon()绘制多边形
pygame.draw.circle()根据圆心和半径绘制圆形
pygame.draw.ellipse()绘制一个椭圆形
pygame.draw.arc()绘制弧线(挥着椭圆的一部分)
pygame.draw.line()绘制线段(直线)
pygame.draw.lines()绘制多条连续的线段
pygame.draw.aaline()绘制一条平滑的线段(抗锯齿)
pygame.draw.aalines()绘制多条连续的线段

表格中的函数使用方法大同小异,它们都可以在 Surface 对象上绘制一些简单的形状,返回值是一个 Rect 对象,表示实际绘制图形的矩形区域。上述绘图函数都提供了一个 color 参数,我们可以通过以下三种方式来传递 color 参数值:

  • 使用 pygame.color 对象
  • RGB 三元组
  • RGBA 四元组

下面通对上述一些方法的参数进行详细说明:

1) 绘制矩形

绘制矩形的语法格式如下:

pygame.draw.rect(surface, color, rect, width)

参数说明如下:

  • surface:指主游戏窗口,无特殊情况,一般都会绘制在主屏幕上;
  • color:该参数用于该图形着色;
  • rect:绘制图形的位置和尺寸大小;
  • width:可选参数,指定边框的宽度,默认为 0,表示填充该矩形区域。

注意,当 width > 0 时,表示线框的宽度;而 width < 0 时,此时不会绘制任何图形。

2) 绘制多边形

pygame.draw.polygon(surface, color, points, width)

其中 points 一个列表参数,它表示组成多边形顶点的 3 或者多个 (x,y) 坐标,通过元组或者列表来表示这些多边形顶点。其余参数与上述函数相同。

3) 绘制圆形

pygame.circle(surface, color, pos, radius, width=0)

上述参数的含义如下:

  • pos:该参数用来指定的圆心位置;
  • radius:用来指定圆的半径;
4) 绘制椭圆形

pygame.draw.ellipse(surface, color, Rect, width=0)

绘制椭圆形的过程,其实就是在矩形区域内部(Rect)绘制一个内接椭圆形,其余参数与上述参数意思相同。

5) 绘制圆弧曲线

当需要绘制圆弧的曲线时,使用以下函数,语法格式如下:

pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)

与 ellipse 函数相比,该函数多了两个参数:

  • start_angle是该段圆弧的起始角度;
  • stop_angle是终止角度;

这两个都是用弧度制来表示的,而原点就是矩形 Rect 的中心位置。

6) 绘制直线

Draw 模块提供了两类绘制直线的方法,即是否消除直线的锯齿,并且根据实际情况,我们还可以选择绘制一条或者多条直线。

pygame.draw.line(surface, color, start_pos, end_pos, width=1)

参数说明:

  • start_pos 和 end_pos 表示线段的起始位置,此处使用 [x,y] 来表示起始位置;
  • width =1 表示直线的宽度,默认为 1。

如果是绘制一条消除锯齿的平滑线,此时则使用 blend = 1 参数,如下所示:

pygame.aaline(surface, color, startpos, endpos, blend=1)

blend 参数表示通过绘制混合背景的阴影来实现抗锯齿功能。

7) 绘制多条直接

当需要绘制多条直线的时候,我们可以使用以下方法:

pygame.lines(surface, color, closed, pointlist, width=1)

其中 pointlist 与 closed 含义如下:

  • pointlist:参数值为列表,包含了一些列点坐标的列表
  • closed:布尔值参数,如果设置为 True,表示直线的第一个端点和直线的最后一个端点要首尾相连;

如果绘制抗锯齿直线,使用以下方法:

pygame.draw.aalines(surface, color, closed, pointlist, blend=1)

除了指定了 blend = 1 之外,其余参数含义与上述函数相同。

下面通过一组简单的示例对上述绘图方法进行演示:

import pygame
from math import pi
#初始化
pygame.init()

设置主屏幕大小

size = (500, 450)
screen = pygame.display.set_mode(size)
#设置标题
pygame.display.set_caption(“C语言中文网”)

设置一个控制主循环的变量

done = False
#创建时钟对象
clock = pygame.time.Clock()
while not done:

设置游戏的fps

clock.tick(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True # 若检测到关闭窗口,则将done置为True

绘制一条宽度为 3 的红色对角线

pygame.draw.line(screen, (0, 255, 0), [0, 0], (500, 450), 3)

绘制多条蓝色的直线(连续直线,非抗锯齿),False 表示首尾不相连

pygame.draw.lines(screen, (0, 0, 255), False, [[0, 80], [50, 90], [200, 80], [220, 30]], 1)

绘制一个灰色的矩形区域,以灰色填充区域

pygame.draw.rect(screen, (155, 155, 155), (75, 10, 50, 20), 0)

绘制一个线框宽度为2的矩形区域

pygame.draw.rect(screen, (0, 0, 0), [150, 10, 50, 20],2)

绘制一个椭圆形,其线宽为2

pygame.draw.ellipse(screen, (255, 0, 0), (225, 10, 50, 20), 2)

绘制一个实心的红色椭圆形

pygame.draw.ellipse(screen, (255, 0, 0), (300, 10, 50, 20))

绘制一个绿色边框(宽度为2)三角形

pygame.draw.polygon(screen, (100, 200, 45), [[100, 100], [0, 200], [200, 200]], 2)

绘制一个蓝色实心的圆形,其中[60,250]表示圆心的位置,40为半径,width默认为0

pygame.draw.circle(screen, (0, 0, 255), [60, 250], 40)

绘制一个圆弧,其中0表示弧线的开始位置,pi/2表示弧线的结束位置,2表示线宽

pygame.draw.arc(screen, (255, 10, 0), (210, 75, 150, 125), 0, pi / 2, 2)

刷新显示屏幕

pygame.display.flip()

点击关闭,退出pygame程序

pygame.quit()

程序的运行结果如下所示:

pygame draw模块
图1:Pygame绘图函数用法

Pygame Font文本和字体(含示例)

文本是任何一款游戏中不可或缺的重要要素之一,Pygame 通过pygame.font模块来创建一个字体对象,从而实现绘制文本的目的。该模块的常用方法如下所示:

方法说明
pygame.font.init()初始化字体模块
pygame.font.quit()取消初始化字体模块
pygame.font.get_init()检查字体模块是否被初始化,返回一个布尔值。
pygame.font.get_default_font()获得默认字体的文件名。返回系统中字体的文件名
pygame.font.get_fonts()获取所有可使用的字体,返回值是所有可用的字体列表
pygame.font.match_font()从系统的字体库中匹配字体文件,返回值是完整的字体文件路径
pygame.font.SysFont()从系统的字体库中创建一个 Font 对象
pygame.font.Font()从一个字体文件创建一个 Font 对象

Font 模块提供了两种创建字体(Font)对象的方法,分别是:

  • SysFont(从系统中加载字体文件创建字体对象)
  • Font(通过文件路径创建字体对象)

下面对这两种方法分分别进行介绍:

1) font.SysFont()

直接从系统中加载字体使用如下方法:

pygame.font.SysFont(name, size, bold=False, italic=False)

name:列表参数值,表示要从系统中加载的字体名称,它会按照列表中的元素顺序依次搜索,如果系统中没有列表中的字体,将使用 Pygame 默认的字体。

  • size:表示字体的大小;
  • bold:字体是否加粗;
  • italic:字体是否为斜体。

使用示例如下:

print(“获取系统中所有可用字体”,pygame.font.get_fonts())
my_font = pygame.font.SysFont([‘方正粗黑宋简体’,‘microsoftsansserif’],50)

上述方法将优先使用“方正粗黑宋简体”。

注意,如果要显示中文,那么一定要使用中文字体文件,比如“方正粗黑宋简体”,否则会出现文字乱码的现象(编程帮三个字无法显示)。如下所示:

pygame font文本绘制
图1:显示中文乱码

2) font.Font()

当我们想要在游戏中引入比较炫酷的字体,而系统中又不存在时,我们可以使用另外一种方法,从外部加载字体文件来绘制文本。其语法格式如下:

my_font = pygame.font.Font(filename, size)

参数说明如下:

  • filename:字符串格式,表示字体文件的所在路径;
  • size:设置字体的大小。

使用示例如下:

f = pygame.font.Font(‘C:/Users/Administrator/Desktop/willhar_.ttf’,50)

从桌面加载了一个字体文件来创建字体对象,并设置字体大小为 50。注意,上述字体文件是在网上下载的,您也可以任意下载(点击网址前往),或者使用系统库中的字体文件。

3) 字体对象方法

Pygame 为处理字体对象提供了一些常用方法,如下所示:

方法说明
pygame.font.Font.render()该函数创建一个渲染了文本的 Surface 对象
pygame.font.Font.size()该函数返回渲染文本所需的尺寸大小,返回值是一个一元组 (width,height)
pygame.font.Font.set_underline()是否为文本内容绘制下划线
pygame.font.Font.get_underline()检查文本是否绘制了下划线
pygame.font.Font.set_bold()启动粗体字渲染
pygame.font.Font.get_bold()检查文本是否使用粗体渲染
pygame.font.Font.set_italic()启动斜体字渲染
pygame.font.Font.metrics()获取字符串中每一个字符的详细参数
pygame.font.Font.get_italic()检查文本是否使用斜体渲染
pygame.font.Font.get_linesize()获取字体文本的行高
pygame.font.Font.get_height()获取字体的高度
pygame.font.Font.get_ascent()获取字体顶端到基准线的距离
pygame.font.Font.get_descent()获取字体底端到基准线的距离

使用上述方法,我们可以非常方便地对字体进行渲染,或者获取字体的相关信息,比如字体的高度、是否是粗体、斜体等信息。

上述方法中使用最多要数第一个方法,它是绘制文本内容的关键方法,其语法格式如下:

render(text, antialias, color, background=None)

参数说明如下所示:

  • text:要绘制的文本内容
  • antialias:布尔值参数,是否是平滑字体(抗锯齿)。
  • color:设置字体颜色;
  • background:可选参数,默认为 None,该参数用来设置字体的背景颜色。

下面看一组简单的示例:

import sys
import pygame

初始化

pygame.init()
screen = pygame.display.set_mode((600,400))
#填充主窗口的背景颜色
screen.fill((20,90,50))
#设置窗口标题
pygame.display.set_caption(‘c语言中文网’)

字体文件路径 C:/Windows/Fonts/simhei.ttf

f = pygame.font.Font(‘C:/Windows/Fonts/simhei.ttf’,50)

render(text, antialias, color, background=None) -> Surface

text = f.render(“网址:c.biancheng.net”,True,(255,0,0),(255,255,255))
#获得显示对象的 rect区域大小
textRect =text.get_rect()
#设置显示对象居中
textRect.center = (300,200)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
准线的距离 |
| pygame.font.Font.get_descent() | 获取字体底端到基准线的距离 |

使用上述方法,我们可以非常方便地对字体进行渲染,或者获取字体的相关信息,比如字体的高度、是否是粗体、斜体等信息。

上述方法中使用最多要数第一个方法,它是绘制文本内容的关键方法,其语法格式如下:

render(text, antialias, color, background=None)

参数说明如下所示:

  • text:要绘制的文本内容
  • antialias:布尔值参数,是否是平滑字体(抗锯齿)。
  • color:设置字体颜色;
  • background:可选参数,默认为 None,该参数用来设置字体的背景颜色。

下面看一组简单的示例:

import sys
import pygame

初始化

pygame.init()
screen = pygame.display.set_mode((600,400))
#填充主窗口的背景颜色
screen.fill((20,90,50))
#设置窗口标题
pygame.display.set_caption(‘c语言中文网’)

字体文件路径 C:/Windows/Fonts/simhei.ttf

f = pygame.font.Font(‘C:/Windows/Fonts/simhei.ttf’,50)

render(text, antialias, color, background=None) -> Surface

text = f.render(“网址:c.biancheng.net”,True,(255,0,0),(255,255,255))
#获得显示对象的 rect区域大小
textRect =text.get_rect()
#设置显示对象居中
textRect.center = (300,200)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-KVE5VtWi-1713151576515)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/875998
推荐阅读
相关标签
  

闽ICP备14008679号