为什么我的图像周围有粗黑线?

时间:2013-11-02 21:46:38

标签: python pygame

在Pygame中,我写了一个扫雷克隆。但是,当我最后一张图片显示你失去你赢了时,我得到了这个结果:

enter image description here

我确定你注意到文字周围有粗黑线。这是将图像嵌入窗口的功能:

def play():
    SIZE = (WIDTH, HEIGHT) = (16, 16)
    MINES = 40
    PIXELS_PER_CELL = 30
    pygame.init()
    screen = pygame.display.set_mode((WIDTH * PIXELS_PER_CELL,
                                      HEIGHT * PIXELS_PER_CELL))
    pygame.display.set_caption("PyMines")
    board = create_board(SIZE, MINES)
    board.draw(screen)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif (event.type == pygame.MOUSEBUTTONDOWN and board.is_playing and
                  not board.is_solved):
                board.mouse_handler(event, screen)

        message = None
        if not board.is_playing:
            board.show_mines(screen)
            message = pygame.image.load("images/lose.png").convert_alpha()
        elif board.is_solved:
            message = pygame.image.load("images/win.png").convert_alpha()

        if message:
            message = pygame.transform.scale(message, (screen.get_width(),
                                                       screen.get_height() //
                                                       5))
            screen.blit(message, (0, 0))
        pygame.display.update()

由于我不确定您应该查看哪部分代码,here是完整代码。

我认为这种行为如此离奇的另一个原因是,当我第一次创建PyMines时,图像完全如此(正如你所看到的,文本中有一个非常轻微的阴影):

enter image description here

然而,这不是优化版本,因为在每个周期之后,整个电路板被重新绘制(因此在16x16电路板上需要很长时间,如第一张图片所示,所以我使用了9x9 - 但结果是相同的)。以下是原始版本的play()函数:

def play():
    SIZE = (WIDTH, HEIGHT) = (9, 9)
    MINES = 10
    PIXELS_PER_CELL = 30
    pygame.init()
    screen = pygame.display.set_mode((WIDTH * PIXELS_PER_CELL,
                                      HEIGHT * PIXELS_PER_CELL))
    pygame.display.set_caption("PyMines")
    board = create_board(SIZE, MINES)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif (event.type == pygame.MOUSEBUTTONDOWN and board.is_playing and
                  not board.is_solved):
                board.mouse_handler(event, screen)

        message = None
        if not board.is_playing:
            board.show_mines()
            message = pygame.image.load("lose.png").convert_alpha()
        elif board.is_solved:
            message = pygame.image.load("win.png").convert_alpha()

        board.draw(screen)
        if message:
            message = pygame.transform.scale(message, (screen.get_width(),
                                                       screen.get_height() //
                                                       5))
            screen.blit(message, (0, 0))
        pygame.display.update()

我会附上完整代码的链接,但是pastebin已关闭,所以here是原始游戏的完整代码,没有奇怪的黑线。

编辑:我已尝试删除convert_alpha()并添加convert()甚至一无所有。

.convert()

enter image description here

NOTHING

enter image description here

为什么所有这些黑线都存在,如何摆脱它们以及我应该使用哪个版本(convert / convert_alpha / NOTHING )(和如何决定使用哪一个。)

1 个答案:

答案 0 :(得分:2)

文字有一个带有alpha通道的黑色阴影。在原始版本中,渲染板,然后渲染文本,阴影与板混合。

在修订版中,您渲染棋盘,然后在其上重复渲染文本。在第一次传递时,它会正确渲染,阴影与棋盘混合。在第二遍中,阴影与您已渲染的阴影混合,形成稍暗的阴影。在下一次通过时,阴影会变得稍暗,依此类推。

如果不严格控制混合的内容,就无法使用Alpha混合。每次渲染文本时,您都需要至少渲染文本后面的棋盘部分,如果不是整个棋盘。