创建主窗口及绘制图像
Pygame 使用pygame.display.set_mode
创建游戏的主窗口:
screen = pygame.display.set_mode(size=(),flags=0)
上述函数有两个参数常用参数:
size:元组参数,用来设置主窗口的大小
flags:功能标志位,表示创建的主窗口样式,比如创建全屏窗口、无边框窗口等,flags 参数值见下表。
标志位 | 功能 |
pygame.FULLSCREEN | 创建一个全屏窗口。 |
pygame.HWSURFACE | 创建一个硬件加速窗口,必须和 FULLSCREEN 同时使用。 |
pygame.OPENGL | 创建一个 OPENGL 渲染窗口。 |
pygame.RESIZABLE | 创建一个可以改变大小的窗口。 |
pygame.DOUBLEBUF | 创建一个双缓冲区窗口,建议在HWSURFACE 或者 OPENGL 时使用。 |
pygame.NOFRAME | 创建一个没有边框的窗口。 |
体验过电脑游戏的朋友们都知道,当运行程序后会在电脑桌面上出现一个游戏的主窗口,这个主窗口的本质是一个 surface 对象,把理解为画布、画板、白纸在合适不过了,它相当于一个载体,用于承载一切游戏所用到的元素。假如您需要将一段文本方放置到主窗口中,那么您需要先创建一个包含文本的 surface 对象,之后再将它附加到主窗口上。
主窗口(screen)相当于游戏程序中尺寸最大的 Surface 对象,在这个最大的“画布”中,我们还可以添加其他“小”的 Surface 对象,这些对象以矩形的形式存在于主窗口中,它们共同组成了一个游戏程序。通过下列方法可以将一个 Surface 对象粘贴至主窗口上:
scrren.blit(source, dest, area=None, special_flags = 0)
下面对上述参数做简单的介绍:
source:表示要粘贴的 Surface 对象。
dest:主窗口中的一个标识的坐标位置,可以接受一个(x,y)
元组,或者(x,y,width,height)
元组,也可以是一个 Rect 对象;
area:接受一个 Rect 对象,默认为 None,如果提供该参数则相当于抠图操作,这表示要绘制的源 Surface 的较小部分。
special_flags:可选参数,它是 Pygame.1.8 版本新增的功能,用于指定对应位置颜色的混合方式,参数值有 BLEND_RGBA_ADD、BLEND_SUB 等。如果不提供该参数的情况下,默认使用 source 的颜色覆盖 screen 的颜色。
获取窗口状态
pygame.display.get_active()
功能:当屏幕上的窗口处于活动状态时返回True
属性:get_active() ->
bool
当窗口 Surface 被认为可以在屏幕上主动呈现并且可能对用户可见时,返回 True。这是pygame.display.set_mode()
的默认状态。即使应用程序完全隐藏在另一个应用程序窗口后面,此方法也可能返回 True。
如果窗口 Surface 已被图标化或最小化(通过pygame.display.iconify()
或通过操作系统特定的方法,例如大多数桌面上可用的最小化图标),这将返回 False。
该方法还可以由于其他原因返回 False,而无需用户明确图标化或最小化应用程序。一个值得注意的例子是,如果用户有多个虚拟桌面并且显示 Surface 不在活动的虚拟桌面上。
注意:
此函数返回 True 与应用程序是否具有输入焦点无关。参阅 pygame.key.get_focused() 和 pygame.mouse.get_focused()
输入焦点相关的API。
事件类型
Pygame 定义了一个专门用来处理事件的结构,即事件队列,该结构遵循队列“先到先处理”的基本原则,通过事件队列,我们可以有序的、逐一的处理用户的操作(触发事件)。下述表格列出了 Pygame 中常用的游戏事件:
事件类型 | 描述 | 成员属性 |
QUIT | 用户按下窗口的关闭按钮 | none |
ATIVEEVENT | Pygame被激活或者隐藏 | gain,state |
KEYDOWN | 键盘按下 | unicode、key、mod |
KEYUP | 键盘放开 | key、mod |
MOUSEMOTION | 鼠标移动 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠标按下 | pos, button |
MOUSEBUTTONUP | 鼠标放开 | pos, button |
JOYAXISMOTION | 游戏手柄(Joystick or pad) 移动 | joy, axis, value |
JOYBALLMOTION | 游戏球(Joy ball) 移动 | joy, axis, value |
JOYHATMOTION 游戏手柄(Joystick) 移动 | joy, axis, value | |
JOYBUTTONDOWN | 游戏手柄按下 | joy, button |
JOYBUTTONUP 游戏手柄放开 | joy, button | |
VIDEORESIZE | Pygame窗口缩放 | size, w, h |
VIDEOEXPOSE | Pygame窗口部分公开(expose) | none |
USEREVENT | 触发一个用户事件 | 事件代码 |
注意,当使用 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:
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("[MOUSEMOTION]:", event.pos, event.buttons)
elif event.type == pygame.MOUSEBUTTONDOWN:
print("[MOUSEMOTION]:", event.pos, event.buttons)
pygame.display.update()