Es gibt mehrere Möglichkeiten, einen Timer in pygame zu implementieren. Sie können die Zeit verwenden, die pygame.Clock.tick
zurückgibt, um eine Zeitgebervariable zu erhöhen oder zu verringern, den Zeitunterschied mit pygame.time.get_ticks
zu berechnen oder ein benutzerdefiniertes Ereignis in Verbindung mit pygame.time.set_timer
zu verwenden.
Beispiel 1 - Delta-Zeit:
import sys
import random
import pygame as pg
class 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)/1000
if __name__ == '__main__':
pg.init()
main()
pg.quit()
sys.exit()
Wenn Sie genau 1 Sprite zum Laichen möchten, können Sie eine weitere Variable wie boss_spawned = False
hinzufügen und den Timer nur ändern, wenn der Chef nicht hervorgebracht hat:
Oder setzen Sie den Timer nach dem Spawn genau auf 0 und verringern Sie den Timer nur, wenn er != 0
ist.
if timer != 0:
timer -= dt
if timer <= 0:
all_sprites.add(Block((random.randrange(600),
random.randrange(440))))
timer = 0
Beispiel 2 - pygame.time.get_ticks (ersetzen Sie die Hauptfunktion oben):
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)
Wenn Sie nur die kills oder gelaicht Mobs zählen wollen, können Sie eine erhöhen Zählvariable und spawne dann den gegnerischen Boss, wenn er ein Limit überschreitet. Das folgende Beispiel zählt nur die Mausklicks und erzeugt nach 3 Klicks einen Block.
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)
Möchten Sie auch die Bilder/Sounds hochladen, damit der Code fehlerfrei aufgrund fehlender Bilder/Sounds ausgeführt werden kann? Dies macht es einfacher zu sehen ... – Claudio
bearbeitet hinzugefügt imgur Album, noch keinen Sound hinzugefügt. – Fraser