1、Pygame屏幕绘制机制简介:
屏幕绘制机制指游戏窗口跟屏幕相关的事情。
Pygame使用Pygame.display
来控制屏幕。Pygame屏幕采用笛卡尔坐标系,左上角为(0,0),横方向为x轴,纵方向为y轴,屏幕的尺寸以像素为单位。
屏幕绘制的重要函数主要分为三部分:
1.屏幕尺寸和模式
函数 | 说明 |
pygame.display.set_mode() | 设置相关屏幕模式 |
pygame.display.Info() | 生成屏幕相关信息 |
2.窗口标题和图标
函数 | 说明 |
pygame.display.set_caption() | 设置标题信息 |
pygame.display.set_icon() | 设置图标信息 |
pygame.display.get_caption() | 获得图标 |
3.窗口感知和刷新
函数 | 说明 |
pygame.display.get_active() | 刷新窗体 |
pygame.display.flip() | 刷新窗体 |
pygame.display.update() | 刷新窗体 |
2、Pygame屏幕尺寸和模式设置:
pygame.display.set_mode(r=(0,0),flags=0)
r——是游戏的分辨率,采用(width,height)方式输入;
flags——用来控制显示类型,可用|组合使用,常用显示标签如下:
pygame.RESIZABLE——窗口大小可调节;
pygame.NOFRAME——窗口没有边界显示;
pygame.FULLSCREEN——窗口全屏显示。
需注意的是:每种显示方式要配合相应的处理机制。
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
# screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
设置屏幕可调节是,要有尺寸变化的相应机制(对扩张显示界面的刷新、对扩张/缩小显示界面的游戏相应),否则就会出现如下情况:
相应的,屏幕设置为无边框时要增加其他推出方式,屏幕设置为全屏时要考虑系统分辨率否则将会按照用户设定被拉伸。
# 产生一个现实信息对象VideoInfo,表达当前屏幕的参数信息,在set_mode()之前调用,则显示当前系统显示参数信息,参数很多,其中有两个十分重要,如下:
# current_w——当前显示模式或窗口的像素宽度;
# current_h——当前显示模式或窗口的像素高度。
pygame.display.Info()
实现壁球小游戏全屏型:
import pygame, sys
pygame.init()
# 获取当前系统的屏幕尺寸
vInfo = pygame.display.Info()
# 将我们预设的游戏的尺寸设置为Info()函数提供的当前系统的宽度和高度
size = width, height = vInfo.current_w, vInfo.current_h
speed = [1, 1]
BLACK = 0, 0, 0
# 将游戏的屏幕设置成全屏模式
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 = 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
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]))
# 在相应的敲击事件之后增加一个对ESC键的相应操作
elif event.key == pygame.K_ESCAPE:
SYS.exit()
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)
pygame.display.update()
fclock.tick(fps)
运行代码,将得到一个全屏运行游戏的版本,通过按ESC键退出。
实现壁球小游戏伸缩型,使得游戏可以适应窗口大小的不同变化:
# 这是一个窗口大小更改的事件,事件发生后,返回event.size元祖,包含新窗口的宽度和高度
# .size[0]表示宽度,也可以用event.w
# .size[1]表示高度,也可以用event.h
# 返回参数仅在事件发生时有用
Pygame.VIDEORESIZE
import pygame, sys
pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
# 将游戏的屏幕设置成大小可调模式
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
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
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]))
# 让程序相应VIDEORESIZE这个事件,并且依据事件更改窗体的大小
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0],event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
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)
pygame.display.update()
fclock.tick(fps)
运行代码,调节窗口大小,游戏屏幕也会随之改变。