Tembak dan Raih Skor
Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 33 dari 36.
Laser melawan musuh adalah satu grup melawan grup lain, dengan groupcollide. Gambar laser berupa baut tipis di tengah persegi berukuran 48 piksel, jadi pengujian Rect akan membuat laser yang berjarak 20 piksel di samping musuh menghancurkannya. Uji gambar dengan mask:
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10Argumen kelima adalah pengujian, seperti pada spritecollide. Beri Laser dan Enemy masing-masing self.mask = pygame.mask.from_surface(self.image), agar mask dibuat sekali, bukan pada setiap pengujian.
Melakukan perulangan pada hits akan menelusuri musuh yang dihancurkan, satu per satu: masing-masing bernilai 10 poin. Tampilkan skor di kiri atas dengan font = pygame.font.Font(None, 32), yang dibuat sekali sebelum perulangan.
Tantangan
Sedang- Beri
LaserdanEnemyself.mask. - Buat
score = 0dan font berukuran 32 sebelum perulangan. - Setelah pembaruan, deteksi tabrakan antara
enemiesdanlasersmenggunakanpygame.sprite.collide_mask, hapus keduanya, lalu tambahkan 10 kescoreuntuk setiap musuh yang terkena. - Gambar
Score:dan skor di(10, 10), dengan warna(240, 240, 240).
Coba sendiri
import random
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()
red_image = pygame.image.load("assets/images/enemy_red.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()
class Enemy(pygame.sprite.Sprite):
def __init__(self, image, x, y, speed):
super().__init__()
self.image = image
self.rect = self.image.get_rect(center=(x, y))
self.speed = speed
def update(self):
self.rect.y += self.speed
def spawn_wave(image, count, speed):
for i in range(count):
x = random.randint(40, 600)
enemies.add(Enemy(image, x, -40 - i * 120, speed))
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
spawn_wave(red_image, 6, 2)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
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
lasers.update()
enemies.update()
for enemy in enemies:
if enemy.rect.top > 480:
enemy.kill()
screen.fill((12, 14, 30))
enemies.draw(screen)
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