Menu
CoddyTech

Bắn laser

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 31 trên 39.

Tàu bắn tia laser thẳng lên trên. Tia laser là một sprite bắt đầu ở mũi tàu, bay 10 pixel mỗi khung hình và tự xóa khi ra khỏi cửa sổ:

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()

Mũi tàu là điểm giữa cạnh trên, vì vậy tia laser mới được tạo bằng Laser(player.rect.centerx, player.rect.top): điểm giữa cạnh dưới của tia nằm ngay tại đó.

Tất cả tia laser nằm trong một nhóm, lasers. Khi nhấn Space, vòng lặp sự kiện sẽ thêm một tia vào nhóm, nên mỗi lần nhấn sẽ bắn một tia. Nhóm cập nhật và vẽ tất cả các tia. Hãy vẽ chúng trước tàu để chúng xuất hiện từ dưới mũi tàu.

challenge icon

Thử thách

Trung bình

Bắn một tia laser mỗi lần bạn nhấn phím Space.

  1. Tải assets/images/laser.png vào laser_image, viết lớp Laser ở phía trên và tạo lasers = pygame.sprite.Group().
  2. Khi có sự kiện KEYDOWN cho phím Space, thêm Laser(player.rect.centerx, player.rect.top) vào lasers.
  3. Mỗi khung hình, gọi lasers.update() và vẽ lasers trước tàu.

Nhấn Chơi rồi nhấn phím Space: các tia laser bay lên. Sau đó nhấn Kiểm tra.

Tự làm thử

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()


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())


player = Player()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()

    screen.fill((12, 14, 30))
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame