Python游戏开发入门

时间:2022-10-23 09:14:56

Pygame简介与安装

1.Pygame安装

pip install pygame
2.检测pygame是否安装成功

python -m pygame.examples.aliens

Pygame最小开发框架及最小游戏

import pygame,sys
'''
遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
'''
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()

pygame.display.update()

壁球小游戏(展示型)与图像的基本使用

screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
pygame.image.load(filename):将filename路径下的图像载入游戏,支持JPG,PNG,GIF(非动画)等13种常用图片格式

Surface对象:

ball.get_rect()

Pygame使用内部的定义的Surface对象表示所有载入的图像,其中get_rect()方法返回一个覆盖图像的矩形Rect对象.

Rect对象:

Rect对象有一些重要的属性,例如:top,bottom,left,right表示上下左右

width,height表示宽度和高度

ballrect.move(x,y)

矩形移动一个偏移量(x,y),即在横轴方向移动x像素,纵轴方向移动y像素,(x,y为整数)

screen.fill(color)

显示窗口背景填充为color颜色,采用RGB色彩体系.由于壁球不断运动,运动后原有位置将默认填充白色,因此需要不断刷新背景颜色.

screen.blit(src,dest)

将一个图像绘制在另一个图像上,即将src绘制到dest位置上.通过Rect对象引导对壁球的绘制.

壁球小游戏(节奏型)与屏幕的帧率设置

需求:壁球可以按照一定的速度运动

import pygame,sys
'''
遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
'''
pygame.init()
size = width,height=1200,800
speed = [1,1]
BLACK =0,0,0

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 600
fclock = pygame.time.Clock()

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
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)
pygame.display.update()
fclock.tick(fps)
fps = 600 #Frames per Secends 每秒帧率

fclock = pygame.time.Clock()

pygame.time.Clock()

创建一个Clock对象,用于操作时间

clock.tick(framerate)

控制帧速度,即窗口刷新速度,例如:clock.tick(100)表示每秒钟100次帧刷新,视频中每次展示的静态图像称为帧.

壁球小游戏(操控型)与键盘的基本使用

键盘使用:如何获取键盘的操作事件

熟读调节:根据对应按键调节壁球运动速度

import pygame,sys

pygame.init()
size = width,height=600,400
speed = [1,1]
BLACK =0,0,0

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.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
if event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[0] == 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)
pygame.display.update()
fclock.tick(fps)
Pygame屏幕绘制机制

游戏全屏

游戏屏幕大小可调节

游戏屏幕无边框

更改游戏标题栏内容

屏幕尺寸和模式

pygame.display.set_mode() 设置相关屏幕模式

pygame.display.Info() 生成屏幕相关信息

窗口标题和图标

pygame.display.set_caption() 生成标题信息

pygame.display.set_icon() 设置图标信息

pygame.display.get_caption() 获得图标

图标感知与刷新

pygame.display.get_active()

pygame.display.flip()

pygame.display.update()

Pygame屏幕尺寸和模式设置

pygame.display.set_mode(r=(0,0),flags=0) 设置相关屏幕模式

r是游戏屏幕的分辨率,采用(width,height)方式输入

flags用来控制分辨率,可用|组合使用,常用显示标签如下:

pygame.RESIZABLE 窗口大小可调

注意:大小可调时要有尺寸变化的响应

对扩张显示页面的刷新

对扩张/缩小显示界面的游戏响应

pygame.NOFRAME 窗口没有边界显示

pygame.FULLSCREEN 窗口全屏显示

注意:每种显示方式要配合相应的处理机制

pygame.display.Info() 生成屏幕相关信息

产生一个显示信息对象VideoInfo,表达当前屏幕的参数信息,在.set_mode()之前调用,则显示当前系统显示参数信息

参数很多,其中有两个十分重要,如下:

current_w: 当前显示模式或窗口的像素宽度

current_h: 当前显示模式或窗口的像素高度

import pygame,sys

pygame.init()
gInfo = pygame.display.Info()
size = width,height=gInfo.current_w,gInfo.current_h
speed = [1,1]
BLACK =50,50,20

screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 600
fclock = pygame.time.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[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE:
sys.exit()
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)
pygame.display.update()
fclock.tick(fps)
Pygame.VIDEORESIZE:这是一种窗口大小更改的事件,事件发生后,返回event.size元组,包含新窗口的宽度和高度

.size[0] 宽度,也可以使用event.w

.size[1] 高度,也可以使用event.h

返回参数仅在事件发生时有用

elif event.type == pygame.VIDEORESIZE:
size = width,height = event.w,event.h
screen = pygame.display.set_mode(size,pygame.RESIZABLE)

Pygame窗口标题和图标设置

pygame.display.set_caption(title,icontitle=None)

title设置窗口的标题内容

icontitle设置图标化后的小标题,小标题可选,部分系统没有

pygame.display.get_caption()

返回当前设置窗口的标题及小标题内容

返回结构为(title,icontitle)

该函数与游戏交互逻辑配合,可以根据游戏情节修改标题内容

pygame.display.set_icon()

设置窗口的图标效果

图标是一个Surface对象

icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)

Pygame窗口感知和刷新运用

pygame.display.get_active()

当窗口在系统中显示(屏幕绘制/非图标化)时返回True,否则返回False;

该函数可以用来判断是否游戏窗口被最小化;

进一步,判断后可以暂停游戏,或改变游戏响应模式

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

pygame.display.update() 仅重新绘制发生改变的部分,

Pygame事件处理机制

响应用户键盘,鼠标等外设操作

响应屏幕的尺寸和模式变化

响应游戏情节的特定触发条件

产生一些触发事件......

Pygame事件队列

缓存并派发所有事件

用户对事件逐一处理

原则上先到先处理

pygame.event.EventType

本质上是一种封装后的数据类型(对象),是Pygame的一个类,表示事件类型

事件类型只有属性,没有方法.

用户可以自定义新的事件类型

Pygame提供了6种类型的事件及相应的属性

系统事件

事件类型 属性
系统事件 QUIT none
  ACTIVEEVENT gain,state
键盘事件 KEYDOWN unicode,key,mod
  KEYUP key,mod
鼠标事件 MOUSEMOTION pos,rel,buttons
  MOUSEBUTTONUP pos,button
  MOUSEBUTTONDOWN pos,button
游戏杆 JOYAXISMOTION joy,axis,value
  JOYBALLMOTION joy,ball,rel
  JOYHATMOTION joy,hat,value
  JOYBUTTONUP joy,button
  JOYBUTTONDOWN joy,button
窗口 VIDEORESIZE size,w,h
  VIDEOEXPOSE none
用户定义 USEREVENT code
实例:键盘落下事件及属性

pygame.event.KEYDOWN

event.unicode

event.key

event.mod

处理事件

pygame.event.get()

pygame.event.poll()

pygame.event.clear()

操作事件队列

pygame.event.set_blocked()

pygame.event.get_blocked()

pygame.event.set_allowed()

生成事件

pygame.event.post()

pygame.event.Event()

键盘事件及类型的使用

键盘按下事件 pygame.event.KEYDOWN

event.unicode 按键的Unicode码

注意:Unicode码与平台相关,不推荐使用

event.key 按键的常量名称

event.mod 按键修饰符的组合值

键盘释放事件 pygame.event.KEYUP

event.key

event.mod 修饰符的按位或运算

event.mod = KMOD_ALT | KMOD_SHIFT

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()
if event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN]:","#",event.key,event.mod)
else:
print("[KEYDOWN]:", event.unicode, event.key, event.mod)
pygame.display.update()

鼠标事件及类型的使用

pygame.event.MOUSEMOTION 鼠标移动事件

event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

event.rel 鼠标相对运动距离(X,Y),相对于上次事件

event.buttons 鼠标按钮状态(a,b,c),相对于鼠标的三个键,鼠标移动时,这三个键处于按下状态,对应的位置值为1,反之则为0.

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

event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

event.button 鼠标按下键编号n,取值1/2/3,分别对应三个键

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

event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

event.button 鼠标按下键编号n,取值为整数,左键为1,中键为2,右键为3,设备相关

壁球小游戏(鼠标型)

import pygame,sys

pygame.init()
size = width,height=1200,800
speed = [1,1]
BLACK =50,50,20

screen = pygame.display.set_mode(size,pygame.RESIZABLE)
icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 600
fclock = pygame.time.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
if event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.type == pygame.VIDEORESIZE:
size = width,height = event.w,event.h
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[0],speed[1])
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)
pygame.display.update()
fclock.tick(fps)

Pygame事件处理函数

处理事件

pygame.event.get()

从事件队列中获得事件列表,即获得所有被队列的事件

for event in pygame.event.get():
ifevent.type == pygame.QUIT:
sys.exit()
pygame.event.poll()

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

while True:
event = pygame.event.poll()
pygame.event.clear()

从事件队列中删除事件,默认删除所有事件

该函数与pygame.event.get()类似,区别仅是不对事件事件进行处理

可以增加参数,删除某类或某些事件:

pygame.event.clear(type)

pygame.event.clear(typelist)

事件队列同时仅能存储128个事件,当事件队列满时,更多事件将被丢弃

操作事件队列

设置事件队列能够缓存事件的类型

pygame.event.set_blocked(type or typelist)

控制哪些事件不允许被保存到事件队列中

pygame.event.get_blocked(type)

测试某个事件类型是否被事件队列所禁止,如果事件类型被禁止,则返回True,否则返回False

pygame.event.set_allowed(type or typelist)

控制哪些事件允许被保存到事件队列中

生成事件

pygame.event.post(Event)

产生一个事件,并将其放入事件队列

一般用于放置用户自定义事件(pygame.USEREVENT)

也可用于放置系统定义事件(如鼠标或键盘等),给定参数

pygame.event.Event(type,dict)

创建一个给定类型的事件

其中,事件的属性和值采用字典类型复制,属性名采用字符串形式,如果创建已有事件,属性需要一致

Pygame色彩机制

色彩表达 Pygame.Color

Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选

Color类可以用色彩名字,RGBA值,HTML色彩格式等方式定义.

Color(name) 例如:Color("grey")

Color(r,g,b,a) 例如:Color(190,190,190,255)

Color(rgbvalue) 例如:Color("#BEBEBEFF")

pygame.Color.r 获得Color类的红色值r

pygame.Color.g 获得Color类的绿色值g

pygame.Color.b 获得Color类的蓝色值b

pygame.Color.a 获得Color类的alpha值a

pygame.Color.normalize 将RGBA各通道值归一到0~1之间

需求:根据壁球运动改变背景颜色

import pygame,sys

pygame.init()
size = width,height=1200,800
speed = [1,1]
BLACK =50,50,20

screen = pygame.display.set_mode(size,pygame.RESIZABLE)
icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 600
fclock = pygame.time.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
if event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.type == pygame.VIDEORESIZE:
size = width,height = event.w,event.h
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[0],speed[1])
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)
pygame.display.update()
fclock.tick(fps)

Pygame图形绘制机制

pygame.draw

图形绘制后,返回一个矩形Rect类表示该形状

pygame.Rect

表达一个矩形区域的类,用于存储坐标和长度信息,矩形的左上角坐标以及长度宽度

Pygame利用Rect类来操作图形/图像元素

Rect类提供了如下属性,返回一个数值或一个代表坐标的元组

x,y,w,h,size,width,height

top,left,bottom,right

topleft,bottomleft,topright,bottomright

midtop,midleft,midbottom,midright

center,centerx,centery

Rect类提供了如下的方法,用来操作Rect类

.copy(),.move(),.inflate(),.clamp(),.clip(),

.union(),.unionall(),.fit(),

.normalize(),.contains(),.collidepoint()

.colliderect(),.collidelist(),.collidelistall(),

.collidedict(),.collidedictall()

pygame.draw

.rect() 矩形, .line() 直线

.polygon() 多边形, .lines() 连续多线

.circle() 圆形, .aaline() 无锯齿线

.ellipse() 椭圆形, .aalines() 连续无锯齿线

.arc() 椭圆弧形

pygame.draw.rect(Surface,color,Rect,width=0)
#Surface 矩形的绘制屏幕
#Color 矩形的绘制颜色
#Rect 矩形的绘制区域
#width=0 绘制边缘的宽度,默认为0,即填充图形
pygame.draw.polygon(Surface,color,pointlist,width=0)
#Surface 多边形的绘制屏幕
#Color 多边形的绘制颜色
#pointlist 多边形顶点坐标列表
#width=0 绘制边缘的宽度,默认为0,即填充图形
pygame.draw.circle(Surface,color,pos,radius,width=0)
#Surface 圆形的绘制屏幕
#Color 圆形的绘制颜色
#pos 圆形圆心坐标
#radius 圆形半径
#width=0 绘制边缘的宽度,默认为0,即填充图形
pygame.draw.ellipse(Surface,color,Rect,width=0)
#Surface 椭圆形的绘制屏幕
#Color 椭圆形的绘制颜色
#Rect 椭圆形的绘制区域(椭圆形外切矩形)
#width=0 绘制边缘的宽度,默认为0,即填充图形
pygame.draw.arc(Surface,color,Rect,start_angle,stop_angle,width=0)
#Surface 椭圆弧线的绘制屏幕
#Color 椭圆弧线的绘制颜色
#Rect 椭圆弧线的绘制区域
#start_angle椭圆弧线绘制的起始角度(横向右侧为0度)
#stop_angle 椭圆弧线绘制的结束角度
#width=0 绘制边缘的宽度,默认为0,即填充图形
pygame.draw.line(Surface,color,start_pos,stop_pos,width=1)
#Surface 直线的绘制屏幕
#Color 直线的绘制颜色
#start_pos 直线绘制的起始点
#stop_pos 直线绘制的结束点
#width=0 绘制边缘的宽度,默认为1,
pygame.draw.lines(Surface,color,closed,pointlist,width=1)
#Surface 连续多线的绘制屏幕
#Color 连续多线的绘制颜色
#closed 如果为True,起止节点间自动增加闭合直线
#pointlist 连续多线的顶点坐标列表
#width=0 绘制边缘的宽度,默认为1
pygame.draw.aaline(Surface,color,start_pos,stop_pos,blend=1)
#Surface 无锯齿线的绘制屏幕
#Color 无锯齿线的绘制颜色
#start_pos 无锯齿线绘制的起始点
#stop_pos 无锯齿线绘制的结束点
#blend=1 不为0时,与线条所在背景颜色进行混合
pygame.draw.aalines(Surface,color,closed,pointlist,blend=1)
#Surface 连续无锯齿线的绘制屏幕
#Color 连续无锯齿线的绘制颜色
#closed 如果为True,起止节点间自动增加闭合直线
#pointlist 连续无锯齿线的顶点坐标列表
#blend=1 不为0时,与线条所在背景颜色进行混合
import pygame,sys
from math import pi

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame图形绘制")
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),50,5)
c2rect = pygame.draw.circle(screen,RED,(400,180),30)

plist = [(295,170),(285,250),(260,280),(340,280),(315,250),(305,170)]
l1rect = pygame.draw.lines(screen,GREEN,True,plist,2)
a1rect = pygame.draw.arc(screen,GOLD,(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()

Pygame文字绘制机制

pygame.freetype

向屏幕上绘制特定字体的文字

文字不能直接print(),而是用像素根据字体点阵图绘制

pygame.freetype额外import引用

import pygame,sys
import pygame.freetype
pygame.freetype.font

根据字体和字号生成一个Font对象

Font.render_to()

Font.render()

使用Font对象的render*方法绘制具体文字

Font类型

pygame.freetype.Font(file,size=0)
#file 字体类型名称或路径
#size 字体的大小
Font类的绘制方法

Font.render_to(surf,dest,text,fgcolor=None,bgcolor=None,rotation=0,size=0)
#返回一个rect类型
#surf 绘制字体的平面,Surface对象
#dest 在平面中具体的位置
#text 绘制的文字内容
#fgcolor文字颜色
#bgcolor背景颜色
#rotation逆时针的旋转角度,取值0-359,部分字体可旋转
#size 字体大小,赋值该参数嘉庆覆盖Font中的设定值
import pygame,sys
import pygame.freetype

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame文字绘制")
GOLD = 255,251,0

f1 = pygame.freetype.Font("C:\Windows\Fonts\ygyxsziti2.0.ttf",36)
f1.render_to(screen,(200,160),"Hello,World!",fgcolor=GOLD,size=50)

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

pygame.display.update()

Font.render(text,fgcolor=None,bgcolor=None,rotation=0,size=0)
#(Surface,Rect)
#text 绘制的文字内容
#fgcolor文字颜色
#bgcolor背景颜色
#rotation逆时针的旋转角度,取值0-359,部分字体可旋转
#size 字体大小,赋值该参数嘉庆覆盖Font中的设定值
import pygame,sys
import pygame.freetype

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame文字绘制")
GOLD = 255,251,0

f1 = pygame.freetype.Font("C:\Windows\Fonts\ygyxsziti2.0.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绘图机制原理精髓

pygame.Surface

绘图层,或绘图平面,或图层

用于表示图形,文字或图像的绘制效果
与当前屏幕主图层可以并列存在
如果不绘制在主图层上,则不会被显示
每一个游戏只有一个主图层
pygame.Rect

矩形区域

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

由pygame.display.set_mode()生成的Surface对象
size = width,height=1200,800
screen = pygame.display.set_mode(size)
在主图层上绘制其他图层是用blit()方法
screen.blit(ball,ballrect)
ball ---> pygame.Surface
ballrect---> pygame.Rect

壁球小游戏(文字型)

import pygame,sys
import pygame.freetype

pygame.init()
size = width,height=1200,800
speed = [1,1]
GOLD = 250,251,0
BLACK =50,50,20
pos = [230,160]
fps =300
fclock = pygame.time.Clock()

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame文字绘制")
#ball = pygame.image.load("PYG02-ball.gif")
#ballrect = ball.get_rect()
f1 = pygame.freetype.Font("C:\Windows\Fonts\hakuyoxingshu7000.TTF",36)
f1rect = f1.render_to(screen,pos,"壁球",fgcolor=GOLD,size=50)

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)
#screen.blit(ball,ballrect)
f1rect = f1.render_to(screen,pos,"壁球",fgcolor=GOLD,size=50)
pygame.display.update()
fclock.tick(fps)

import pygame,sys
import pygame.freetype

pygame.init()
size = width,height=1200,800
speed = [1,1]
GOLD = 250,251,0
BLACK =50,50,20
pos = [230,160]
fps =300
fclock = pygame.time.Clock()

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame文字绘制")
#ball = pygame.image.load("PYG02-ball.gif")
#ballrect = ball.get_rect()
f1 = pygame.freetype.Font("C:\Windows\Fonts\hakuyoxingshu7000.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()
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)
#screen.blit(ball,ballrect)
f1surf, f1rect = f1.render("壁球", fgcolor=GOLD, size=50)
screen.blit(f1surf,(pos[0],pos[1]))
pygame.display.update()
fclock.tick(fps)