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 = nownow - 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.
Tantangan
Sedang- Hapus penembakan
KEYDOWNdari perulangan event. - Buat
last_shot = 0sebelum perulangan. - Di bagian pembaruan, saat Space ditekan dan setidaknya 250 ms telah berlalu sejak
last_shot, tembakkan laser dan aturlast_shotke 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
1Memuat Gambar
Muat GambarTempatkan dengan RectPindahkan GambarBuat Latar BerulangPiksel Tembus Pandang7Patroli Bintang
Kapal PatroliTembakkan Laser2Putar, Cerminkan, Ubah Skala
Putar Mengelilingi Titik TengahHadap ke Arah TerbangmuUbah Skala GambarPutar dari Gambar Asli3class untuk object game
class pertamamumethodself adalah objectlist berisi objectobject dengan gambarsubclass6Animasi dari Sprite Sheet
Memotong Sprite SheetPenghitung FrameMenganimasikan dengan WaktuLedakan Sekali JalanLatihan sendiri: Playground Pygame