透明像素
本课属于 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 章会解决这个问题。
挑战
简单去掉敌人周围的黑色方框。
- 加载三个敌人时使用
.convert_alpha(),而不是.convert()。 - 在每个敌人后面,用
(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 在线编辑器