Сделать спрайт появляться при нажатии пробела и исчезать через X секунд? - PullRequest
0 голосов
/ 26 мая 2019

Хорошо, у меня есть игра, созданная с помощью pygame. Игра состоит в том, что в нижней части экрана есть человек, стреляющий вверх по верхней части экрана, чтобы ударить врагов. Человек может двигаться влево и вправо.

Чтобы выстрелить, нажмите пробел.

Когда вы стреляете, я хочу, чтобы маленький спрайт появлялся в конце ствола орудия, чтобы он выглядел так, как будто пламя выходит, как стрельба из настоящего оружия.

Мне удалось заставить спрайт огня появляться при нажатии пробела, НО я также хочу, чтобы спрайт исчезал, возможно, через 0,3 секунды (я настрою время, как только он исчезнет).

Как мне на самом деле это сделать? Я чувствую себя потерянным здесь

Я пытался зайти в Google, посмотреть и посмотреть на stackoverflow, но не могу найти то, что мне нужно.

game.py

# -- SNIP --


def run_game():

    # -- SNIP ---

    # Start the main loop for the game.
    while True:
        # Watch for keyboard and mouse events.
        gf.check_events(ai_settings, screen, stats, sb, play_button, man, 
        enemies, bullets)

        if stats.game_active:
            man.update()
            gf.update_bullets(ai_settings, screen, stats, sb, man, enemies,
                              bullets)
            gf.update_enemies(ai_settings, stats, screen, sb, man, enemies,
                             bullets)

        gf.update_screen(ai_settings, screen, stats, sb, man, enemies, 
        bullets, play_button)


run_game()

game_functions.py


# -- SNIP --


def check_events(ai_settings, screen, stats, sb, play_button, man, enemies,
                 bullets):
    """Respond to keypresses and mouse events."""
    # -- SNIP --
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, ai_settings, screen, stats, sb, man,
                                 enemies, bullets)
        # -- SNIP --



def check_keydown_events(event, ai_settings, screen, stats, sb, man, enemies, bullets):
    """Respond to key presses."""
    if event.key == pygame.K_RIGHT:
        man.moving_right = True
        man.orientation = "Right"
    elif event.key == pygame.K_LEFT:
        man.moving_left = True
        man.orientation = "Left"

    # Draw sprite if space is pressed
    elif event.key == pygame.K_SPACE:
        fire_bullet(ai_settings, bullets, screen, man)
        man.fire_screen.blit(man.fire, man.fire_rect)
    # --- SNIP ---

# -- SNIP --

man.py

class Man(Sprite):
    # -- SNIP --
        # Load the man image and get its rect.
        self.image = pygame.image.load('images/man_gun_large.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        # Gun fire sprite
        self.fire = pygame.image.load('images/fire.bmp')
        self.fire_rect = self.fire.get_rect()
        self.screen_fire_rect = self.image.get_rect()
        self.fire_screen = self.image

        self.ai_settings = ai_settings

        # Start each new man at the bottom center of the screen.
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        # Load the fire sprite at the end of the mans gunbarrel
        self.fire_rect.centerx = self.screen_fire_rect.left + 20
        self.fire_rect.top = self.screen_fire_rect.top

# ---SNIP---

        # Movement flags
        self.moving_right = False
        self.moving_left = False

        self.orientation = False


    def blitme(self):
        """Draw the man at its current location."""
        self.screen.blit(self.image, self.rect)
        if self.orientation == "Right":
            self.screen.blit(self.image, self.rect)
        elif self.orientation == "Left":
            self.screen.blit(pygame.transform.flip(self.image, True, False), self.rect)

1 Ответ

1 голос
/ 26 мая 2019

Используйте pygame.time.get_ticks() для управления жизненным циклом пуль.

Добавьте список, который содержит кортежи времени окончания пули и самой пули.

bullets = []

Когда появляется пуля, рассчитайте время окончания и добавьте информацию в список:

def check_keydown_events(event, ai_settings, screen, stats, sb, man, enemies, bullets):

    # [...]

    # Draw sprite if space is pressed
    elif event.key == pygame.K_SPACE:

        bullet = # [...]

        end_time = pygame.time.get_ticks() + 300 # 300 millisconds = 0.3 seconds
        bullets.append( (end_time, bullet) )

Проверьте, достиг ли пуля конец жизни, и решите сохранитьпуля или .kill это:

current_time = pygame.time.get_ticks()
current_bullets = bullets
bullets = []
for end_time, bullet in current_bullets:
    if current_time > end_time:
        bullet.kill()
    else:
        bullets.append( (end_time, bullet) )
...