Menu
CoddyTech

Tahan untuk Menembak

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 31 dari 36.

Menekan Space untuk setiap tembakan membuat jari cepat lelah. Kebanyakan game tembak-menembak menembak saat tombol ditekan, tetapi laser yang ditembakkan setiap frame akan menjadi sinar yang solid. cooldown membatasi laju tembakan: setelah satu tembakan, tembakan berikutnya menunggu 250 milidetik.

Ingat kapan tembakan terakhir terjadi, lalu tembak hanya saat Space ditekan dan waktu yang cukup telah berlalu:

keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
    lasers.add(Laser(player.rect.centerx, player.rect.top))
    last_shot = now

now - last_shot menunjukkan berapa lama sejak tembakan terakhir. Atur last_shot = 0 sebelum perulangan. Sekarang, menahan Space akan menembakkan empat laser per detik, dan menekannya dengan cepat tidak akan membuat tembakan lebih cepat dari itu.

Ini menggantikan penembakan dengan KEYDOWN: satu cara menembak dengan satu aturan.

challenge icon

Tantangan

Sedang
  1. Hapus penembakan KEYDOWN dari perulangan event.
  2. Buat last_shot = 0 sebelum perulangan.
  3. Di bagian pembaruan, saat Space ditekan dan setidaknya 250 ms telah berlalu sejak last_shot, tembakkan laser dan atur last_shot ke waktu sekarang.

Coba sendiri

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


player = Player()
lasers = pygame.sprite.Group()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame