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)

Python游戏开发入门的更多相关文章

  1. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  2. 【4】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(色彩与绘图)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  3. 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  4. 【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  5. Python游戏编程入门

    <Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...

  6. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  7. Coco2d-x android win7 Python 游戏开发环境的搭建

    1:我用的电脑配置 win7 3 核 内存8G 桌面.一直想学习Coco2d 游戏开发,所以,一个星期后,需要找到,最终建立了一个良好的环境 2:我使用的版本号版本号,至于建筑android开发环境略 ...

  8. Python游戏开发:pygame游戏开发常用数据结构

    一.数组与列表 数组可以理解为简化的列表.像我们之前使用的pygame.sprite.Group这样的精灵组,也是一个列表.列表的元素是可变的,它具有添加.删除.搜索.排序等多种方法. 1.一维列表 ...

  9. Python游戏开发——打砖块

    打砖块游戏向来大家也不会很陌生,今天来用python来开发一下这个小游戏 1.引用对应数据库 import pygame from pygame.locals import * import sys, ...

随机推荐

  1. SE11 数据表中 日志数据更改 勾选的作用

        [园工]HF-abap-Rainy(574570549)  11:10:12这个有啥作用,勾上了怎么查修改日志呢,[园丁]SH-CRM-ALEX(8738890)  11:13:53SCU3[ ...

  2. BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数

    BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数 Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一. 为了纪念他,这些方程一般被称 ...

  3. 使用cgroups限制MongoDB的内存使用

    cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等). 这个项目最早是由Goo ...

  4. DateTime?转化为DateTime,int? 转 int

    深入理解C#---1.可空类型 https://blog.csdn.net/tianzeyu1992/article/details/52618131 原文:https://blog.csdn.net ...

  5. bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】

    明明是个最短路却有网络流一样的神建图= A = 首先要是暴力建图的话最坏有O(nm)条边.所以优化建图. 考虑分块思想,设bs=sqrt(n),对于p大于bs的,直接连边即可,最多有sqrt(n)条, ...

  6. bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】

    参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...

  7. 部分安卓微信浏览器无法触发onchange事件

    这是安卓微信的一个遗留问题. 解决办法很简单: 将input标签 <input type=“file" name="image" accept="imag ...

  8. ios手机Safari本地服务连不上

    问题: 今天在本地起服务准备测下ios手机端页面,结果发现:页面可以打开,但是登录不上. 用alert定位了下,await fn() 报错被try()catch(){}捕获了... 原因: 该机子不支 ...

  9. iOS导航栏NavigationBar的颜色,按钮和标题以及字体颜色

    首先,层级关系: leftBarButtonItem.rightBarButtonItem.title都是加在UINavigationItem上的,UINavigationItem再加在Navigat ...

  10. InputFilter在过滤空格时重复输入的问题

    正确做法:editText.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filte ...