Menu
CoddyTech

透明像素

本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 5 课,共 39 课。

图像文件总是矩形,但敌舰不是。它周围的像素是透明的:PNG 中的每个像素都有第四个数值,即它的alpha,范围从 0(完全透明)到 255(完全不透明)。

起始代码使用 convert() 加载这三个敌人,但它会丢弃 alpha:每个透明像素都会变成黑色,每个敌人也就被放在一个黑色方框里。convert_alpha() 会保留 alpha,因此只有不透明的像素会覆盖窗口。凡是图像不是纯色矩形时,都要使用它。

Rect 仍然是整个矩形。给它画上轮廓,就能看到图片占据的范围:

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

最后一个数值 1 表示绘制 1 像素宽的轮廓,而不是填充 Rect。看看轮廓和飞船之间的空隙。两个 Rect 可能会重叠,但其中的图片并未接触,而使用 Rect 进行碰撞检测仍会判断它们发生了碰撞。第 5 章会解决这个问题。

challenge icon

挑战

简单

去掉敌人周围的黑色方框。

  1. 加载三个敌人时使用 .convert_alpha(),而不是 .convert()。
  2. 在每个敌人后面,用 (90, 90, 120) 为它的 Rect 绘制轮廓,宽度为 1 像素。敌人仍位于 (128, 200)、(288, 200) 和 (448, 200)。

按“开始”:黑色方框消失,灰色轮廓会显示 Rect。然后按“检查”。

亲手试试

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

精灵与图像中的所有课

自己练习: Pygame 在线编辑器