time模块用于时间监控。
pygame.time.set_timer(eventid, milliseconds)
在事件队列中以一定时间间隔重复创建指定事件,实现事件定时执行的效果。
参数
eventid:要重复创建的事件的编号
milliseconds:以毫秒为单位的时间间隔,间隔为0时事件的定时器将被禁用
不同的事件通过编号进行区分,比如:QUIT事件的编号是12、MOUSEBUTTONDOWN事件的编号是5、KEYDOWN事件的编号是2。
当系统事件无法满足需求时,用户可以自定义事件。为了避免与“系统事件”的编号冲突,Pygame中预留了24~32区间的编号用于“用户事件”,编号24对应的常量是USEREVENT。
from pygame.locals import *
print(QUIT)
print(MOUSEBUTTONDOWN)
print(KEYDOWN)
print(USEREVENT)
输出为:
xxxxxxxxxx
12
5
2
24
“精灵”术语源自旧计算机和游戏机时代,今天仍然使用这个术语表示2D动画、游戏中的任何可见对象。我们游戏中的对象想要成为“精灵”,只需要继承sprite模块中的Sprite类。
pygame.sprite.Sprite:一般用作可见游戏对象的父类
方法
__init__:子类继承时必须调用该方法
update:用于控制精灵的更新行为,默认实现不执行任何操作,可以在子类中“重写”该方法
例如:
xxxxxxxxxx
class Block(pygame.sprite.Sprite):
def __init__(self, color, width, height):
# 调用父类__init__方法
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
精灵对象一般拥有通过image属性设定的“形象”和通过rect属性控制的“位置”。
pygame.sprite.Group:用于保存和管理多个精灵对象的容器
方法
add():向组中添加新的精灵
remove():从组中移除指定精灵
draw(Surface):将包含的所有精灵绘制到Surface上
update():对包含的所有精灵调用update方法实现更新
例如:
ximport pygame
from pygame.locals import *
from sys import exit
from random import randint
class Block(pygame.sprite.Sprite):
def __init__(self, color, width, height):
# 调用父类__init__方法
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
pygame.init()
screen = pygame.display.set_mode((400, 300))
blocks = pygame.sprite.Group()
for i in range(8):
block = Block((255, 0, 0), 60, 60)
block.rect.topleft = [randint(0, 300), randint(0, 200)]
blocks.add(block)
while True:
for e in pygame.event.get():
if e.type == QUIT:
exit()
screen.fill((0, 0, 0))
blocks.draw(screen)
pygame.display.update()
效果如图:
相对于列表容器,精灵组Group有以下优势:
精灵组的绘制和更新。
Group类的draw方法使用精灵对象的image属性和rect属性对组内所有精灵进行绘制;update方法调用所有精灵对象重写的update方法进行更新。
子弹精灵跟随我方飞机移动:创建子弹对象时,需要传递我方飞机“顶部中央”的位置用以定位。
想要深入了解“sprite模块”的更多信息,可以参考教程:https://www.pygame.org/docs/tut/SpriteIntro.html