Ateş Etmek İçin Basılı Tut
Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 31 / 36.
Her atış için Boşluk tuşuna basmak parmakları yorar. Çoğu nişancı, düğme basılı tutulurken ateş eder; ancak her karede ateşlenen bir lazer kesintisiz bir ışın oluştururdu. Bir bekleme süresi atış hızını sınırlar: bir atıştan sonra sonraki atış için 250 milisaniye beklenir.
Son atışın ne zaman yapıldığını hatırla ve yalnızca Boşluk tuşu basılıyken ve yeterince zaman geçtiğinde ateş et:
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, son atışın üzerinden ne kadar zaman geçtiğini gösterir. Döngüden önce last_shot = 0 ayarla. Boşluk tuşunu basılı tutmak artık saniyede dört lazer ateşler; tuşa hızlıca basıp bırakmak da atış hızını bunun üzerine çıkarmaz.
Bu, KEYDOWN ile ateş etme yönteminin yerini alır: tek bir ateş etme yöntemi, tek bir kural.
Görev
Orta- Olay döngüsünden
KEYDOWNile ateş etmeyi kaldırın. - Döngüden önce
last_shot = 0olarak ayarlayın. - Güncelleme bölümünde, Space tuşu basılıyken ve
last_shotüzerinden en az 250 ms geçmişse bir lazer ateşleyin velast_shotdeğerini şu anki zamana ayarlayın.
Kendin dene
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()
Sprite'lar ve Görseller bölümündeki tüm dersler
4Sprite'lar ve Gruplar
Sprite SınıfıGruplarkill() ile Kaldırmaspritecollide ile YakalamaGruba Karşı Grup7Yıldız Devriyesi
Devriye GemisiLazerleri Ateşle2Döndür, Yansıt, Ölçekle
Merkez Etrafında DöndürUçtuğun Yöne DönBir Görseli ÖlçekleOrijinalinden Döndür5Piksel Hassasiyetinde Çarpışmalar
Dikdörtgenler Haksız HissettiriyorMaskelerPiksel Hassasiyetinde Sprite'larDaire Hitbox'ları3Oyun Nesneleri için Sınıflar
İlk SınıfınızMetotlarSelf Nesnenin KendisidirNesneler ListesiGörselli NesnelerBir Alt Sınıf6Sprite Sheet'lerden Animasyon
Bir Sprite Sheet'i KesmekBir Kare SayacıZamanla AnimasyonTek Seferlik Bir PatlamaKendi başına pratik yap: Pygame playground