Grup Melawan Grup
Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 20 dari 36.
Laser harus menghancurkan musuh. Ini adalah satu grup melawan grup lain: laser mana pun melawan musuh mana pun. groupcollide menguji setiap pasangan sekaligus:
hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)Kedua True adalah flag dokill, satu untuk setiap grup: yang pertama menghapus musuh yang terkena, yang kedua menghapus laser yang mengenainya. Laser yang terus melaju setelah mengenai musuh dapat menghabisi musuh kedua di atas musuh pertama.
hits adalah sebuah dictionary: setiap musuh yang terkena menjadi key, dan nilainya adalah list laser yang mengenainya. len(hits) adalah jumlah musuh yang terkena pada frame ini, meskipun dua laser mengenai musuh yang sama.
Urutan grup menentukan apa yang menjadi key. Dengan groupcollide(lasers, enemies, True, True), key-nya adalah laser, dan len(hits) akan menghitung jumlah laser.
Tantangan
Sedang- Setelah pembaruan, uji
enemiesterhadaplasersdenganpygame.sprite.groupcollide, lalu hapus enemy dan laser. - Tambahkan jumlah enemy yang terkena ke
score.
Coba sendiri
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Laser Hits")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
font = pygame.font.Font(None, 32)
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 Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_image
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y += 1
if self.rect.top > 480:
self.rect.bottom = 0
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()
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))
score = 0
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()
enemies.update()
screen.fill((20, 22, 40))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Sprite dan Gambar
2Putar, 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