2017-04-24 5 views
1

ich möchte einen 'Boss'-Sprite spawnen, nachdem eine bestimmte Zeit verstrichen ist oder x Menge an Mobs hervorgebracht hat und wie könnte ich den Timer einschalten der Bildschirm.wie man ein Sprite nach einem Zeitlimit erzeugt und wie man ein Timer-Pygame anzeigt

Images

Current Code

Klasse für Chef

class Boss(pygame.sprite.Sprite): 
def __init__(self): 
    pygame.sprite.Sprite.__init__(self) 
    self.image = pygame.transform.scale(boss_img, (150, 200)) 
    self.image.set_colorkey(Black) 
    self.rect = self.image.get_rect() 
    self.rect.center = ((Width/2, -70)) 
    self.speedy = 1 
    self.shoot_delay = 250 
    self.last_shot = pygame.time.get_ticks() 
    self.hp = 150 
    self.dead = False 

def update(self): 
    if self.hp <= 25: 
     self.speedy = 3 
    if self.rect.top > Height + 10: 
     player.lives = 0 
+0

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

+0

bearbeitet hinzugefügt imgur Album, noch keinen Sound hinzugefügt. – Fraser

Antwort

1

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) 
Verwandte Themen