有几种方法可以在pygame中实现计时器。您可以使用
pygame.Clock.tick返回的时间来增加或减少计时器变量,使用来计算时间差,
pygame.time.get_ticks或者与一起使用自定义事件
pygame.time.set_timer。
示例1- 增量时间:
import sysimport randomimport pygame as pgclass Block(pg.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = pg.Surface((40, 40)) self.image.fill(pg.Color('sienna1')) self.rect = self.image.get_rect(topleft=pos)def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() font = pg.font.Font(None, 30) all_sprites = pg.sprite.Group() # Delta time is the time that has passed since clock.tick # was called the last time. dt = 0 # We'll subtract dt (delta time) from this timer variable. timer = 1 # 1 means one second. done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True # Decrease timer to get a countdown. timer -= dt # When the timer is below or equal to 0, we spawn # a new block. if timer <= 0: all_sprites.add(Block((random.randrange(600), random.randrange(440)))) # Reset the countdown timer to one second. timer = 1 all_sprites.update() screen.fill(pg.Color('gray15')) all_sprites.draw(screen) timer_surface = font.render( str(round(timer, 3)), True, pg.Color('yellow')) screen.blit(timer_surface, (20, 20)) pg.display.flip() # dt = time in seconds that passed since last tick. # Divide by 1000 to convert milliseconds to seconds. dt = clock.tick(30) / 1000if __name__ == '__main__': pg.init() main() pg.quit() sys.exit()如果您想精确地生成1个Sprite,则可以添加另一个变量,例如,
boss_spawned = False并仅在Boss没有生成时更改计时器:
if not boss_spawned: timer -= dt if timer <= 0: all_sprites.add(Block((random.randrange(600), random.randrange(440)))) boss_spawned = True
或在生成后将计时器设置为正好为0,如果是,则仅减少计时器
!= 0。
if timer != 0: timer -= dt if timer <= 0: all_sprites.add(Block((random.randrange(600), random.randrange(440)))) timer = 0
示例2 -pygame.time.get_ticks(替换上面的主要函数):
def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() font = pg.font.Font(None, 30) all_sprites = pg.sprite.Group() # Start time. now = pg.time.get_ticks() done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True # If the time difference is greater than 1000 # milliseconds, spawn a block. time_difference = pg.time.get_ticks() - now if time_difference >= 1000: all_sprites.add(Block((random.randrange(600), random.randrange(440)))) # Reset the start time. now = pg.time.get_ticks() all_sprites.update() screen.fill(pg.Color('gray15')) all_sprites.draw(screen) timer_surface = font.render( str(time_difference/1000), True, pg.Color('yellow')) screen.blit(timer_surface, (20, 20)) pg.display.flip() clock.tick(30)如果只想计算杀戮或生成的生物 ,则可以增加一个计数器变量,然后在超过某个限制时生成敌方首领。以下示例仅计算鼠标的点击次数,并在3次点击后生成一个块。
def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() font = pg.font.Font(None, 30) all_sprites = pg.sprite.Group() # We'll just count mouse clicks in this example. # You can replace it with the kill count in your game. clicks = 0 done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True if event.type == pg.MOUSEBUTTONDOWN: clicks += 1 if clicks >= 3: all_sprites.add(Block((random.randrange(600), random.randrange(440)))) clicks = 0 all_sprites.update() screen.fill(pg.Color('gray15')) all_sprites.draw(screen) clicks_surface = font.render(str(clicks), True, pg.Color('yellow')) screen.blit(clicks_surface, (20, 20)) pg.display.flip() clock.tick(30)


