Pygame游戏开发入门

Pygame游戏开发入门


微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!



  Pygame是个游戏开发的敲门砖,大街可以按照自己的喜好选择是否学习Pygame。喜欢游戏的同学可以学习Pygame,制作一个自己喜欢的2D小游戏。

一、Pygame的安装

  下面我来给大家介绍如何安装Pygame:首先我们使用win+R打开"运行"输入cnd打开命令行,接着输入pip install pygame等待下载安装即可完成。如果安装过程出现错误,可以参考我的这篇文章关于解决pip install库下载慢(下载出错)或无法升级的问题

二、Pygame最小开发框架

  首先我们来看一下下面这段代码:

import pygame,sys								#引入

pygame.init()											#初始化
screen = pygame.display.set_mode((600, 400))					#设置窗体大小
pygame.display.set_caption("跟着夜寒学Python")				#设置标题栏

while True:													#无限循环
	for event in pygame.event.get():
		if event.type == pygame.QUIT:												#设置推出响应
			sys.exit()											#退出程序
	pygame.display.update()

其运行结果如下图:
在这里插入图片描述
可以看到它并没有显示任何东西,仅仅是在窗口栏有了标题变化。这便是一个最小开发框架。

Created with Raphaël 2.2.0 引入pygame和sys 初始化init()及设置 获取事件并逐类响应 刷新屏幕 未退出 yes
(1)引入pygame、sys

把我们需要的第三方库和功能引入

(2)初始化init()及设置

初始化游戏,设置窗体,设置标题栏

(3)获取事件并逐类响应

进入一个无限循环,先获取时间并逐类相应

(4)刷新屏幕

获取并响应事件后刷新效果

下面介绍一些相关函数:

sys.exit()
用于结束游戏并退出

pygame.init()
对Pygame各模块进行初始化

pygame.display.set_mode((width,height))
设置pygame的窗体大小,宽度和高度使用二值元组传输

pygame.display.set_caption()
设置窗体标题栏

pygame.QUIT()
pygame的退出事件

pygame.event.get()
从事件队列中获取事件

pygame.display.update()
对窗口进行刷新,默认窗口全部绘制

三、一个小例子

  在介绍第一个小例子之前我们需要先知道一些基本的知识。pygame的窗口采用笛卡尔坐标系,左上角为(0,0),横轴向右是正方向,纵轴向下是正方向。其他需要知道的知识我会在函数的讲解同时为大家讲解。

先介绍一些函数

pygame.image.load()
引入系统相关路径下的一张图片

<对象名>.get_rect()
pygame使用内部定义的surface对象表示所有载入的图像,其中.get_react()方法返回一个外切图像的矩形rect对象。同时rect也有一些参数,这里给大家讲解:
在这里插入图片描述
top = y
bottom = w
left = x
right = u
width = u-x
height = w - y

<对象rect>.move(speed[x], speed[y])
对rect后的矩形对象形成偏移量为x和y的移动,偏移量为移动像素,整数。

screen.fill(color)
将窗口的背景填充为color色,采用RGB色彩体系。若不刷新窗口背景默认为白色。

screen.blit(src, dest)
将一个图像绘制在另一个图像上, 即将src绘制到dest位置上,通过rect对象引导对图像的绘制。

pygame.time.Clock()
创建一个Clock对象,用于操作时间。

clock.tick(framerate)
控制帧速率,即窗口刷新速度,例如clock.tick(100)表示每秒钟100次帧刷新

pygame.KEYDOWN
通过这个函数pygame会知道这时发生了键盘敲击事件,其中每个键的定义如下:
**pygame.K_UP()**上方向键
**pygame.K_DOWN()**下方向键
**pygame.K_LEFT()**左方向键
**pygame.K_RIGHT()**右方向键

import pygame,sys

pygame.init()										#初始化参数
size = width, height = 600,400		#设置窗体大小参数
speed = [1,1]											#设置移动速度参数
BLACK = 0, 0, 0										#设置背景颜色参数RGB
screen = pygame.display.set_mode(size)
pygame.display.set_caption("跟着夜寒学Python")
ball = pygame.image.load("test.png")				#导入图片,注意图片为自己下载的,在自己机子上运行时注意更改
ballrect = ball.get_rect()					#设置图片surface参数
fps = 300													#设置刷新帧率参数
fclock = pygame.time.Clock()		#创建clock.用于后续操作刷新时间

while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_LEFT:
				speed[0] = speed[0] if speed[0] ==0 else (abs(speed[0]) -1 )* int(speed[0]/abs(speed[0]))
			elif event.key == pygame.K_RIGHT:
				speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
			elif event.key == pygame.K_UP:
				speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
			elif event.key == pygame.K_DOWN:
				speed[1] = speed[1] if speed[1] ==0 else (abs(speed[1]) -1 )* int(speed[1]/abs(speed[1]))
	ballrect = ballrect.move(speed[0], speed[1])
	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(BLACK)
	screen.blit(ball, ballrect)				#将图片放在rect切线矩形上
	pygame.display.update()			#刷新
	fclock.tick(fps)

这个小游戏实现了一个图片在屏幕的四壁碰撞反弹(类似于windowsXP的屏保,大家可以自主复制代码运行看看),用户可以通过上下左右控制图片的运行速度,现在大家可以对照这些函数公式来理解这个实例小游戏,有助于大家对Pygame的进一步认识。

四、Pygame的屏幕绘制机制

  再上一个例子中我们已经用到了Pygame的屏幕窗体绘制,在这一节我们将继续深入的讲解pygame的屏幕绘制机制。包括屏幕的分辨率,尺寸,有无边框等等。

先介绍一些函数

pygame.display.set_mod(r=(0,0), flags=0)
r是游戏屏幕的分辨率,采用(width,height)方式输入,flags用来控制显示类型,可用**|**组合使用,常用显示标签如下:
pygeme.RESIZABLE窗口大小可调
pygame.NOFRAME窗口没有边界显示
pygame.FULLSCREEN窗口全屏显示
注意:屏幕改变相关游戏逻辑要做出相应的改变

pygame.disply.Info()
产生一个显示信息对象VideoInfo,表达当前屏幕的参数信息。在.set_mode()之前调用,则显示当前系统显示参数信息。其中有两个重要参数如下:
current_w 当前显示模式窗口的像素宽度
current_h 当前显示模式窗口的像素高度

pygame.VIDEORESIZE
这是一种窗口大小更改的事件,事件发生后,返回event.size元组,包含新窗口的宽度和高度。其中两个参数如下:
.size[0]宽度,也可以用event.w
.size[1]高度,也可以用event.h
返回参数仅在事件发生时有效

pygame.display.set_caption(title, icontitle)
title设置窗口的标题内容
icontitle设置图标化后的小标题小标题可选择是否设置,部分操作系统没有提供

pygame.display.get_caption()
返回当前设置窗口的标题及小标题内容,返回结构为**(title,icontitle)**,该函数与游戏交互逻辑相配合,可以根据游戏情节修改标题内容。

pygame.display.set_icon(surface)
设置窗口的图标效果,图标是一个surface对象

pygame.fisplay.get_active()
当前窗口在系统中显示(屏幕会之/非图标化)时返回True,否则返回False,该函数可以用来判断是否游戏窗口被最小化。

pygame.display.flip()
重新绘制屏幕中整个窗口

pygame.display.upddate()
仅绘制屏幕中有变化的部分,速度比**pygame.display.flip()**快

import pygame,sys

pygame.init()										#初始化参数
size = width, height = 600,400		#设置窗体大小参数
speed = [1,1]											#设置移动速度参数
BLACK = 0, 0, 0										#设置背景颜色参数RGB
screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调

icon = pygame.image.load("code.jpg")		#导入图标文件
pygame.display.set_icon(icon)				#设置图标文件
pygame.display.set_caption("跟着夜寒学Python")		#设置标题栏
ball = pygame.image.load("test.png")				#导入图片,注意图片为自己下载的,在自己机子上运行时注意更改
ballrect = ball.get_rect()					#设置图片surface参数
fps = 300													#设置刷新帧率参数
fclock = pygame.time.Clock()		#创建clock.用于后续操作刷新时间

while True:
    for event in pygame.event.get():	#获取事件
        if event.type == pygame.QUIT:	#点击右上角叉退出
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] ==0 else (abs(speed[0]) -1 )* int(speed[0]/abs(speed[0]))
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] if speed[1] ==0 else (abs(speed[1]) -1 )* int(speed[1]/abs(speed[1]))
            elif event.key == pygame.K_ESCAPE:
                sys.exit()
        elif event.type == pygame.VIDEORESIZE:
            size = width, height = event.size[0], event.size[1]
            screen = pygame.display.set_mode(size, pygame.RESIZABLE)
    if pygame.display.get_active():			#是否最小化界面
        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(BLACK)				#设置轨迹填充
    screen.blit(ball, ballrect)				#将图片放在rect切线矩形上
    pygame.display.update()			#刷新
    fclock.tick(fps)				#刷新帧率

三、Pygame的事件处理类型

  上一部分我们详细讲解了pygame的屏幕绘制体系,当我们掌握了屏幕绘制体系之后我们便可以进一步学习事件处理机制,包括鼠标和按键的相关操作。这样我们才能做出更具有互动性的游戏。

先介绍一些函数

pygame.event.EventType
pygame的事件本质上是一种封装后的数据类型(对象),是Pygame的一个类,表示事件类型。事件类型只有属性,没有方法。(属性是类的静态参数,方法是类的可操作内容,不懂的可以去看这篇文章Python进阶学习之——类和对象)当事件发生后我们可以通过这个类获取事件还原参数,同时用户可以编写程序,自定义一些新的事件类型。
下面介绍一些pygame提供的一些事件类型:
在这里插入图片描述
QUIT
退出系统

ACTIVE
是否最小化界面

KEYDOWN 键盘的按下
KEYUP 键盘的释放
其中KEYDOWNKEYUP包含以下三个属性event.unicodeevent,keyevent.mod分别指键盘的unicode编码,按键名称,和键盘按下时的修饰符。部分电脑不支持返回unicode所以不建议使用,修饰符适用于组合,可产生整整想要表达的目的,下面介绍一些修饰符:
在这里插入图片描述
下面我们来举个例子让大家直观的看到变化:

import pygame,sys								#引入

pygame.init()											#初始化
screen = pygame.display.set_mode((600, 400))					#设置窗体大小
pygame.display.set_caption("跟着夜寒学Python")				#设置标题栏

while True:													#无限循环
    for event in pygame.event.get():
        if event.type == pygame.QUIT:												#设置推出响应
            sys.exit()											#退出程序
        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":							#判断unicode编码是否为空
                print("[KEYDOWN]:","#", event.key, event.mod)				#空则输出#字符
            else:
                print("[KEYDOWN]:", event.unicode, event.key, event.mod)	#不空输出unicode编码
                        
    pygame.display.update()

MOUSEMOTION 鼠标的移动
MOUSEBOTTONUP 鼠标按键的按下
MOUSEBOTTONDOWN 鼠标按键的释放
其中MOUSEMOTION包含三个属性event.pos:鼠标当前坐标值(x,y),相对于窗口左上角;event.rel:鼠标相对运动距离(x,y),相对于上次事件;event.bottons:鼠标按钮状态(a,b,c),对应于鼠标的三个键(左、中、右)。鼠标移动时,这三个键处于按下状态,对应的值为1,反之则为0。
其中MOUSEBOTTONUPMOUSEBOTTONDOWN包含两个属性event.pos:鼠标当前坐标值(x,y),相对于窗口左上角;event.botton:鼠标按下(释放)键编号n,取值1/2/3,分别对应三个键编号不固定,与设备有关,下面我们来举个例子让大家直观的看到变化:

import pygame,sys
 
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件处理")
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":
                print("[KEYDOWN]:", "#", event.key, event.mod)
            else:
                print("[KEYDOWN]:", event.unicode, event.key, event.mod)
        elif event.type == pygame.MOUSEMOTION:			#监控鼠标指针位置
            print("[MOUSEMOTION]:", event.pos, event.rel, event.buttons)		#输出当前位置及按键情况
        elif event.type == pygame.MOUSEBUTTONUP:	·	#监控鼠标按键是否释放
            print("[MOUSEBUTTONUP]:", event.pos, event.button)					#输出按下按键位置及编号
        elif event.type == pygame.MOUSEBUTTONDOWN:		#监控鼠标按键是否按下
            print("[MOUSEBUTTONDOWN]:", event.pos, event.button)				#输出按下按键位置及编号
 
    pygame.display.update()

JOYAXISMOTION 游戏杆
JOYBALLMOTION 游戏杆
JOYHATMOTION 游戏杆
JOYBUTTONUP 游戏杆
JOYBUTTONDOWN 游戏杆
VIDEORESIZE 窗口
VIDEOEXPOSE 窗口
USEREVENT 用户自定义事件

pygame.event.get()
从事件队列中获得事件列表,即获得所有被队列的事件。同时它可以增加参数,获得某些或某类事件:
pygame.event.get(type)
pygame.event.get(typelist)

pygame.event.poll()
从事件队列中获得某一个事件,事件获取将从事件队列删除,如果事件队列为空,则返回event.NOEVENT

pygame.event.clear()
从事件队列中删除事件,默认删除所有事件,该函数与**pygame.event.get()**类似,区别仅是不对事件进行处理,只删除。同时可以增加参数,删除某类或某些类事件:
pygame.event.clear(type)
pygame.event.clear(typelist)

pygame.event.set_blocked(type or typelist)
控制哪些类型的事件不允许被保存到事件队列中

pygame.event.get_blocked(type or typelist)
控制哪些类型事件允许被保存到事件队列中

pygame.event.set_aiiowed(type)
测试某个事件类型是否被事件队列所禁止,如果事件类型被禁止,则返回True,否则返回False
以上三个函数用来操作事件队列,事件队列仅能存储128个事件,满后新来的事件将被丢弃,所以需要规范处理。

pygame.event.post(Event)
产生一个时间,并将其放到事件队列,一般用于放置用户自定义事件(pygame.USERNAME),也可以用于放置系统定义事件,给定参数。

pygame.event.Event(type,dict)
创建一个给定类型的事件。其中,时间的属性和值采用字典类型复制,属性名采用字符串形式,如果创建已有事件,属性需要一致。
以上两个函数用来生成事件,下面我们来举个例子让大家直观的看到变化:

import pygame,sys
 
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件处理")
fps = 1				#每秒一帧
fclock = pygame.time.Clock()
num = 1
 
while True:
    uevent = pygame.event.Event(pygame.KEYDOWN, {"unicode": 123, "key":pygame.K_SPACE, "mod":pygame.KMOD_ALT})		#生成事件的字典
    pygame.event.post(uevent)			#生成一个事件
    num = num + 1
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":
                print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
            else:
                print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)
 
    pygame.display.update()
    fclock.tick(fps)

这是一些按键常量名称::
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后我们再来改造一下游戏,使他可以根据我们鼠标的拖拽放置碰撞图片位置。

import pygame,sys

pygame.init()										#初始化参数
size = width, height = 600,400		#设置窗体大小参数
speed = [1,1]											#设置移动速度参数
BLACK = 0, 0, 0										#设置背景颜色参数RGB
screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调

icon = pygame.image.load("code.jpg")		#导入图标文件
pygame.display.set_icon(icon)				#设置图标文件
pygame.display.set_caption("跟着夜寒学Python")		#设置标题栏
ball = pygame.image.load("test.png")				#导入图片,注意图片为自己下载的,在自己机子上运行时注意更改
ballrect = ball.get_rect()					#设置图片surface参数
fps = 300													#设置刷新帧率参数
fclock = pygame.time.Clock()		#创建clock.用于后续操作刷新时间
still = False

while True:
    for event in pygame.event.get():	#获取事件
        if event.type == pygame.QUIT:	#点击右上角叉退出
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] ==0 else (abs(speed[0]) -1 )* int(speed[0]/abs(speed[0]))
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] if speed[1] ==0 else (abs(speed[1]) -1 )* int(speed[1]/abs(speed[1]))
            elif event.key == pygame.K_ESCAPE:
                sys.exit()
        elif event.type == pygame.VIDEORESIZE:		#界面可调
            size = width, height = event.size[0], event.size[1]
            screen = pygame.display.set_mode(size, pygame.RESIZABLE)
        elif event.type == pygame.MOUSEBUTTONDOWN:		#鼠标按下
            if event.button == 1:
                still = True
        elif event.type == pygame.MOUSEBUTTONUP:		#鼠标抬起
            still = False
            if event.button == 1:
                ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
        elif event.type == pygame.MOUSEMOTION:
            if event.buttons[0] == 1:
                ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
    if pygame.display.get_active() and not still:			#是否最小化界面
        ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
        if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
            speed[0] = - speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = - speed[1]
        if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
            speed[1] = - speed[1]
        
    screen.fill(BLACK)				#设置轨迹填充
    screen.blit(ball, ballrect)				#将图片放在rect切线矩形上
    pygame.display.update()			#刷新
    fclock.tick(fps)				#刷新帧率

四、Pygame的色彩与绘图机制

先介绍一些函数

pygame.Color
Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选。Color类可以用色彩名字、RGBA值、HTML色彩格式等方式定义Color(name)Color(r,g,b,a)Color(rgbvalue),例:
Color(“grey”)
Color(190,190,190,255)
Color("#BEBEBEFF")

pygame.Color.r 获得Color类的红色值r
pygame.Color.g 获得Color类的绿色值g
pygame.Color.b 获得Color类的蓝色值b
pygame.Color.a 获得Color类的aphla值a
pygame.Color.normalize 将RGBA各通道值归一到0-1之间

alpha通道
RGBA为RGB模式的衍生,alpha通道表示不透明度,取值0-255,默认255。alpha通道值越大,不透明度越高。
下面我们更改一下我们之前小游戏的代码,有助于大家理解:

import pygame,sys

pygame.init()										#初始化参数
size = width, height = 600,400		#设置窗体大小参数
speed = [1,1]											#设置移动速度参数
BLACK = 0, 0, 0										#设置背景颜色参数RGB
screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调

icon = pygame.image.load("code.jpg")		#导入图标文件
pygame.display.set_icon(icon)				#设置图标文件
pygame.display.set_caption("跟着夜寒学Python")		#设置标题栏
ball = pygame.image.load("test.png")				#导入图片,注意图片为自己下载的,在自己机子上运行时注意更改
ballrect = ball.get_rect()					#设置图片surface参数
fps = 300													#设置刷新帧率参数
fclock = pygame.time.Clock()		#创建clock.用于后续操作刷新时间
still = False
bgcolor = pygame.Color("black")		#创建背景的颜色

def RGBChannel(a):
    return 0 if a<0 else (255 if a>255 else int(a))

while True:
    for event in pygame.event.get():	#获取事件
        if event.type == pygame.QUIT:	#点击右上角叉退出
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] ==0 else (abs(speed[0]) -1 )* int(speed[0]/abs(speed[0]))
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] if speed[1] ==0 else (abs(speed[1]) -1 )* int(speed[1]/abs(speed[1]))
            elif event.key == pygame.K_ESCAPE:
                sys.exit()
        elif event.type == pygame.VIDEORESIZE:		#界面可调
            size = width, height = event.size[0], event.size[1]
            screen = pygame.display.set_mode(size, pygame.RESIZABLE)
        elif event.type == pygame.MOUSEBUTTONDOWN:		#鼠标按下
            if event.button == 1:
                still = True
        elif event.type == pygame.MOUSEBUTTONUP:		#鼠标抬起
            still = False
            if event.button == 1:
                ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
        elif event.type == pygame.MOUSEMOTION:
            if event.buttons[0] == 1:
                ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
    if pygame.display.get_active() and not still:			#是否最小化界面
        ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
        if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
            speed[0] = - speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = - speed[1]
        if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
            speed[1] = - speed[1]

    bgcolor.r = RGBChannel(ballrect.left*255/width)
    bgcolor.g = RGBChannel(ballrect.top*255/height)
    bgcolor.b = RGBChannel(min(speed[0],speed[1])*255/max(speed[0],speed[1],1))
    
    screen.fill(bgcolor)				#设置轨迹填充
    screen.blit(ball, ballrect)				#将图片放在rect切线矩形上
    pygame.display.update()			#刷新
    fclock.tick(fps)				#刷新帧率

下面我们讲一下图形绘制体系

先介绍一些函数

pygame.draw
图形绘制后,返回一个矩形rect类表示该形状

pygame.Rect
表达一个矩形区域的类,用于储存坐标和长度信息。Pygame利用Rect类操作图形/图像等元素。其中包含四个参数:举行的左上角坐标**(left,top)和矩形的宽度width高度height**。
Rect类提供了如下属性,返回一个数值或一个代表坐标的元组,以下是一些参数,若需要具体参数意义还需参考官方文档。
在这里插入图片描述
Rect类提供了如下方法,用来操作Rect类,若需要具体用法还需参考官方文档。
在这里插入图片描述
pygame.draw
用于绘制图形,以下是绘制图形的一些方法:
.rect(Surface,color,Rect,width)
绘制矩形,其中Surface:矩形的绘制屏幕;Color:矩形的绘制颜色;Rect:举行的绘制区域;width:绘制边缘的宽度,默认为0,即填充图形。下面给大家一个例子方便大家理解。

import pygame,sys								#引入

pygame.init()											#初始化
screen = pygame.display.set_mode((600, 400))					#设置窗体大小
pygame.display.set_caption("跟着夜寒学Python")				#设置标题栏
GOLD = 255, 251, 0
RED = pygame.Color('red')

r1rect = pygame.draw.rect(screen, GOLD, (100,100,200,100), 5)
r2rect = pygame.draw.rect(screen, RED, (210,210,200,100), 0)

while True:													#无限循环
	for event in pygame.event.get():
		if event.type == pygame.QUIT:												#设置推出响应
			sys.exit()											#退出程序
	pygame.display.update()

.polygon(Surface,color,position,width)
绘制多边形,其中
Surface:多边形的绘制屏幕;
Color:多边形的绘制颜色;
position:多边形顶点坐标列表;
width=0绘制边缘的宽度,默认为0,即填充图形

.circle(Surface,color,pos,radius,width)
绘制圆形,其中
Surface:圆形的绘制屏幕;
Color:圆形的绘制颜色;
pos:圆形的原心坐标;
radius:圆形的半径;
width:绘制边缘的宽度,默认为0,即填充图形

.ellipse(Surface,color,Rect,width)
绘制椭圆,其中
Surface:椭圆形的绘制屏幕;
Color:椭圆形的绘制颜色;
Rect:椭圆形的绘制区域;
width:绘制边缘的宽度,默认为0,即填充图形

.arc(Surface,color,Rect,start_angle,stop_angle,width)
绘制椭圆弧形,其中
Surface:椭圆弧形的绘制屏幕;
Color:椭圆弧形的绘制颜色;
Rect:椭圆弧形的绘制区域;
start_angle,stop_angle:弧形绘制起始和结束的弧度值,横向右侧为0度;
width:绘制边缘的宽度,默认为0,即填充图形

.line(Surface,color,start_pos,stop_pos,width)
绘制直线,其中
Surface:直线的绘制屏幕;
Color:直线的绘制颜色;
start_pos,stop_pos:直线绘制的起始和结束坐标;
width:直线的宽度,默认为1

.lines(Surface,color,closed,pointlist,width)
绘制多条直线,其中
Surface:连续多线的绘制屏幕;
Color:连续多线的绘制颜色;
closed如果为True,起止点吉间自动增加封闭直线;
pointlist:连续多线的顶点坐标列表;
width:连续多线的宽度,默认为1

.aaline(Surface,color,start_pos,stop_pos,blend)
绘制无锯齿线,其中
Surface:无锯齿线的绘制屏幕;
Color:无锯齿线的绘制颜色;
start_pos,stop_pos:无锯齿线绘制的起始和结束坐标;
blend:不为0时,与线条所在背景颜色进行混合;

.aalines(Surface,color,closed,pointlist,blend)
Surface:连续无锯齿线的绘制屏幕;
Color:连续无锯齿线的绘制颜色;
closed如果为True,起止点吉间自动增加封闭直线;
pointlist:连续无锯齿线的顶点坐标列表;
blend:不为0时,与线条所在背景颜色进行混合;
下面给大家举一个例子,方便深入了解

import pygame, sys
from math import pi
 
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
RED = pygame.Color('red')
WHITE = 255, 255, 255
GREEN = pygame.Color('green')
 
#r1rect = pygame.draw.rect(screen, GOLD, (100,100,200,100), 5)
#r2rect = pygame.draw.rect(screen, RED, (210,210,200,100), 0)
 
e1rect = pygame.draw.ellipse(screen, GREEN, (50,50,500,300), 3)
c1rect = pygame.draw.circle(screen, GOLD, (200,180), 30, 5)
c2rect = pygame.draw.circle(screen, GOLD, (400,180), 30)
r1rect = pygame.draw.rect(screen, RED, (170, 130, 60, 10), 3)
r2rect = pygame.draw.rect(screen, RED, (370, 130, 60, 10))
plist = [(295,170), (285,250), (260,280), (340,280), (315,250), (305,170)]
l1rect = pygame.draw.lines(screen, GOLD, True, plist, 2)
a1rect = pygame.draw.arc(screen, RED, (200,220,200,100), 1.4*pi, 1.9*pi, 3)
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    pygame.display.update()

ptgame.freetype
像屏幕上绘制特定字体的文字,文字不能直接print(),而是用像素根据字体点阵图绘制,注意需额外使用import导入

pygame.freetype.Font(file,size)
形成字体类型
file:字体类型名称或路径
size:字体的大小

Font.render_to(surf,dest,text,fgcolor,bgcolor,rotation,size)
surf:绘制字体的平面,Surface对象
dest:在平面中的具体位置,(x,y)
text:绘制的文字内容
fgcolor文字颜色
bgcolor背景颜色
rotation逆时针的旋转角度,取值0-359,部分字体可旋转
size文字大小,复制该参数将覆盖Font中的设定值
最后返回一个Rect类
下面给大家举个例子,方便大家理解

import pygame, sys
import pygame.freetype
 
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
 
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1rect = f1.render_to(screen, (200,160), "关注'夜寒信息'", fgcolor=GOLD, size=50)
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    pygame.display.update()

Font.render_to(text,fgcolor,bgcolor,rotation,size)
text:绘制的文字内容
fgcolor文字颜色
bgcolor背景颜色
rotation逆时针的旋转角度,取值0-359,部分字体可旋转
size文字大小,复制该参数将覆盖Font中的设定值
最后返回一个元组,包含Surface对象和Rect对象
下面给大家举个例子,方便大家理解

import pygame, sys
import pygame.freetype
 
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
 
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
 
    screen.blit(f1surf, (200,160))
    pygame.display.update()

pygame.Surface
绘图层,或绘图平面,或图层
用于表示图形、文字或图像的绘制效果,与当前屏幕主图层可以并列存在,如果不绘制在主图层上、则不会被显示。

pygame.Rect
矩形区域
对应于当前主图层的某个具体区域,相当于某个矩形区域的指针或标识信息,可以指定图层绘制在某个矩形区域中。

下面给大家举个render_to方法的例子,方便大家理解

import pygame, sys
import pygame.freetype
 
pygame.init()
size = width, height = 600, 400
speed = [1,1]
GOLD = 255, 251, 0
BLACK = 0, 0, 0
pos = [230, 160]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("跟着夜寒学Python")
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1rect = f1.render_to(screen, pos, "关注'夜寒信息'", fgcolor=GOLD, size=50)
fps = 300
fclock = pygame.time.Clock()
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    if pos[0] < 0 or pos[0] + f1rect.width > width:
        speed[0] = - speed[0]
    if pos[1] <0 or pos[1] + f1rect.height > height:
        speed[1] = - speed[1]
    pos[0] = pos[0] + speed[0]
    pos[1] = pos[1] + speed[1]
 
    screen.fill(BLACK)
    f1rect = f1.render_to(screen, pos, "关注'夜寒信息'", fgcolor=GOLD, size=50)
    pygame.display.update()
    fclock.tick(fps)

下面给大家举个render方法的例子,方便大家理解

import pygame, sys
import pygame.freetype
 
pygame.init()
size = width, height = 600, 400
speed = [1,1]
GOLD = 255, 251, 0
BLACK = 0, 0, 0
pos = [230, 160]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("跟着夜寒学Python")
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
fps = 300
fclock = pygame.time.Clock()
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    if pos[0] < 0 or pos[0] + f1rect.width > width:
        speed[0] = - speed[0]
    if pos[1] <0 or pos[1] + f1rect.height > height:
        speed[1] = - speed[1]
    pos[0] = pos[0] + speed[0]
    pos[1] = pos[1] + speed[1]
 
    screen.fill(BLACK)
    f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
    screen.blit(f1surf, (pos[0], pos[1]))
    pygame.display.update()
    fclock.tick(fps)

(此博文每日更新中,清持续关注…)


微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!


  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值