Menu
CoddyTech

Przezroczyste piksele

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 5 z 36.

Plik obrazu zawsze jest prostokątem, ale statek wroga nim nie jest. Piksele wokół niego są przezroczyste: każdy piksel PNG ma czwartą wartość, czyli kanał alfa, od 0 (przezroczysty) do 255 (nieprzezroczysty).

W kodzie startowym trzech wrogów ładuje się za pomocą convert(), które odrzuca kanał alfa: każdy przezroczysty piksel staje się czarny, a każdy wróg znajduje się w czarnym prostokącie. convert_alpha() zachowuje kanał alfa, więc tylko nieprzezroczyste piksele zasłaniają okno. Używaj tej metody w przypadku wszystkiego, co nie jest jednolitym prostokątem.

Rect nadal obejmuje cały prostokąt. Narysuj jego obrys, aby zobaczyć, jaką przestrzeń zajmuje obraz:

rect = red.get_rect(topleft=(128, 200))
screen.blit(red, rect)
pygame.draw.rect(screen, (90, 90, 120), rect, 1)

Ostatnia liczba, 1, rysuje obrys o grubości 1 piksela zamiast wypełniać Rect. Zwróć uwagę na przerwy między obrysem a statkiem. Dwa obiekty Rect mogą na siebie nachodzić, choć obrazy w ich wnętrzach się nie stykają, a test kolizji z użyciem obiektów Rect nadal wskazuje, że doszło do zderzenia. Rozdział 5 rozwiązuje ten problem.

challenge icon

Wyzwanie

Łatwy
  1. Wczytaj trzech wrogów za pomocą .convert_alpha() zamiast .convert(), aby pozbyć się czarnych prostokątów.
  2. Po każdym wrogu narysuj obrys jego prostokąta Rect w kolorze (90, 90, 120), o szerokości 1 piksela. Wrogowie pozostają w położeniach (128, 200), (288, 200) i (448, 200).

Spróbuj swoich sił

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Three Enemies")
clock = pygame.time.Clock()

red = pygame.image.load("assets/images/enemy_red.png").convert()
green = pygame.image.load("assets/images/enemy_green.png").convert()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert()

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

    screen.fill((20, 22, 40))
    screen.blit(red, (128, 200))
    screen.blit(green, (288, 200))
    screen.blit(yellow, (448, 200))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame