在Pygame中,我写了一个扫雷克隆。但是,当我最后一张图片显示你失去或你赢了时,我得到了这个结果:
我确定你注意到文字周围有粗黑线。这是将图像嵌入窗口的功能:
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时,图像完全如此(正如你所看到的,文本中有一个非常轻微的阴影):
然而,这不是优化版本,因为在每个周期之后,整个电路板被重新绘制(因此在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()
:
NOTHING :
为什么所有这些黑线都存在,如何摆脱它们以及我应该使用哪个版本(convert
/ convert_alpha
/ NOTHING )(和如何决定使用哪一个。)
答案 0 :(得分:2)
文字有一个带有alpha通道的黑色阴影。在原始版本中,渲染板,然后渲染文本,阴影与板混合。
在修订版中,您渲染棋盘,然后在其上重复渲染文本。在第一次传递时,它会正确渲染,阴影与棋盘混合。在第二遍中,阴影与您已渲染的阴影混合,形成稍暗的阴影。在下一次通过时,阴影会变得稍暗,依此类推。
如果不严格控制混合的内容,就无法使用Alpha混合。每次渲染文本时,您都需要至少渲染文本后面的棋盘部分,如果不是整个棋盘。