Python游戏开发入门

Pygame简介与安装

1.Pygame安装

pip install pygame

2.检测pygame是否安装成功

python -m pygame.examples.aliens

 

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

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()
            
      	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

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)