Musuh Berdatangan
Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 32 dari 36.
Sekarang, musuh. Sprite Enemy mendapatkan gambar dan kecepatannya saat dibuat, jadi satu class dapat menggambar setiap jenis:
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.speedSatu wave terdiri dari beberapa musuh yang berbaris di atas jendela agar mereka masuk satu per satu, masing-masing 120 piksel di atas musuh sebelumnya, pada posisi x acak:
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))Musuh pertama berpusat di y = -40, berikutnya di -160, dan seterusnya: semuanya tidak terlihat saat permainan dimulai. Sebuah fungsi menjaga wave tetap di satu tempat; pelajaran sebelumnya memanggilnya untuk setiap wave.
Musuh yang jatuh melewati bagian bawah harus disingkirkan. Di dalam perulangan utama, setelah enemies.update(), hapus setiap musuh yang bagian atasnya melewati 480. Nanti, itu akan mengurangi satu nyawa.
Tantangan
Sedang- Tambahkan
import random, muatenemy_red.pngke dalamred_image, lalu tulisEnemydanspawn_wave. - Buat
enemies = pygame.sprite.Group(), lalu panggilspawn_wave(red_image, 6, 2). - Pada setiap frame, perbarui enemy, hapus yang
rect.top-nya melewati 480, lalu gambar enemy sebelum laser.
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()
last_shot = 0
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()
screen.fill((12, 14, 30))
lasers.draw(screen)
screen.blit(player.image, player.rect)
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
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